2012-01-09 29 views
5

Tôi đang cố xác thực phân đoạn Xml bằng cách sử dụng Lược đồ Xml với phương thức mở rộng XDocument.Validate. Bất cứ khi nào một mảnh Xml không hợp lệ được sử dụng các đám cháy ValidationEventHandler đúng cách, tuy nhiên cả hai thuộc tính linenumber và LinePosition của XmlSchemaValidationException là 0.XmlSchemaValidationException.LineNumber và LinePosition là 0 khi xác nhận hợp lệ Xml Schema với XDocument.Validate

private bool Validate(XDocument doc) 
{ 
    bool isValid = true; 
    List<string> validationErrors = new List<string>(); 

    XmlSchemaSet schemas = new XmlSchemaSet(); 
    schemas.Add(null, "MyCustomSchema.xsd"); 

    doc.Validate(schemas, (sender, args) => 
    { 
     validationErrors.Add(String.Format("{0}: {1} [Ln {2} Col {3}]", 
      args.Severity, 
      args.Exception.Message, 
      args.Exception.LineNumber, 
      args.Exception.LinePosition)); 

     isValid = false; 
    }, false); 

    return isValid; 
} 

Mục tiêu của tôi trong ví dụ trên là sử dụng validationErrors cho thông báo cho người dùng là tại sao xác thực không thành công. Tuy nhiên, khi phương pháp này được sử dụng, LineNumber và LinePosition đều là 0.

Đoạn mã có vẻ đơn giản và dường như hoạt động như mong đợi về xác thực đối với cả đoạn Xml hợp lệ và không hợp lệ.

Cảm ơn trước!

+0

Theo như tôi có thể thấy XmlSchemaValidator được instantiated chỉ sử dụng một DummyPostion nội bộ và tôi không thấy một tùy chọn để có được một thực hiện tốt hơn tiêm. – rene

Trả lời

4

Bạn không xác thực biểu diễn văn bản của Xml nữa nhưng mô hình đối tượng. Kết quả là không có dòng và vị trí nào vì không có tệp nào ngoài các đối tượng XElement, XAttribute vv trong bộ nhớ. Một gợi ý hữu ích khác là tự hỏi chính mình - bạn nên trả lại dòng và vị trí nào nếu bạn sửa đổi (ví dụ: một phần bổ sung đã được thêm) XDocument sau khi được tải nhưng trước khi chạy xác thực? Nếu bạn không tạo hoặc sửa đổi Xml, cách nhanh nhất là sử dụng XmlReader để xác thực tài liệu Xml của bạn. Là tiền thưởng - nếu đầu vào là một tệp hoặc luồng - bạn sẽ nhận được thông tin về dòng và vị trí trong trường hợp lỗi xác thực.

+0

Pawel, cảm ơn vì đã trả lời rất hợp lý của bạn. Tôi muốn xác nhận tính hợp lệ đối với XDocument, vì tôi đã có một tham chiếu. Tôi sẽ thay đổi ứng dụng của mình để xác thực đối với XmlReader và sau đó tạo tham chiếu XDocument khi được neeeded. – buckindb

+0

Tôi nghĩ bạn có thể làm cả hai cùng một lúc - bạn có thể thiết lập trình đọc sao cho nó xác nhận tài liệu và sau đó truyền người đọc đến phương thức XDocument.Load() ... – Pawel

Các vấn đề liên quan