2013-01-21 29 views
5

Tôi có một XDocument mà tôi xác thực dựa vào một lược đồ XML. Khi XDocument không hợp lệ, tôi cần phải tìm các nút XML không hợp lệ để người dùng có thể dễ dàng điều hướng đến vị trí tương ứng trong ứng dụng của tôi (ví dụ: bằng cách nhấp đúp vào thư trên lưới thư).Cách tìm nút XML không hợp lệ trong XDocument được xác nhận hợp lệ đối với một lược đồ (XmlSchemaValidationException.SourceObject là null)

Tôi sử dụng phương pháp mở rộng System.Xml.Schema.Validate() cho mục đích đó. Đối số thứ hai của phương thức Validate() là một System.Xml.ValidationEventHandler được gọi trên mọi phần tử XML không hợp lệ. Nó vượt qua một System.Xml.ValidationEventArgs. Các ValidationEventArgs.Exception có thể được đúc thành System.Xml.Schema.XmlSchemaValidationException. Bây giờ, XmlSchemaValidationException có thuộc tính SourceObject mà tôi dự kiến ​​sẽ giữ tham chiếu đến nút XML không hợp lệ. Thật không may nó luôn luôn là null.

Đoạn sau đây minh họa việc sử dụng của tôi:

XDocument doc = XDocument.Load(@"c:\temp\booksSchema.xml"); 

// Create the XmlSchemaSet class. 
XmlSchemaSet sc = new XmlSchemaSet(); 

// Add the schema to the collection. 
sc.Add("urn:bookstore-schema", @"c:\temp\books.xsd"); 

// Validate against schema 
doc.Validate(sc, delegate(object sender, ValidationEventArgs e) 
       { 
        XmlSchemaValidationException ve = e.Exception as XmlSchemaValidationException; 
        if (ve != null) 
        { 
         object errorNode = ve.SourceObject;  
         // ve.SourceObject is always null 
        } 
       }); 

Việc xác nhận bản thân hoạt động chính xác, nhưng tôi không thể có được một tài liệu tham khảo trên các nút không hợp lệ. Kỳ lạ thay, cách tiếp cận tương tự hoạt động tốt cho System.Xml.XmlDocument, nhưng tiếc là tôi phải làm việc với XDocument trong ngữ cảnh này.

Có ai có đề xuất về cách nút không hợp lệ có thể được tìm thấy trong XDocument không?

Trả lời

6

OK, tôi có câu trả lời. Nút không hợp lệ là chính "người gửi" của trình xử lý sự kiện. Nó có thể được truyền sang XContainer, XElement, ...

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