2009-02-21 49 views
11

Mã sau đây giúp tôi xác thực tệp XML bằng lược đồ XSD.Xác thực Xml bằng lược đồ XSD

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.Schemas.Add(null, xsdFilePath); 
settings.ValidationType = ValidationType.Schema; 
settings.ValidationEventHandler += new System.Xml.Schema.ValidationEventHandler(settings_ValidationEventHandler); 
XmlDocument document = new XmlDocument(); 
document.Load(xmlFilePath); 
XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings); 

while (rdr.Read()) 
{ 

} 
isValid = true; 

ValidationEventHandler cũng cho tôi biết lỗi là gì, nhưng không cho tôi biết 'where' hoặc 'trên dòng nào'. Có cách nào để lấy số dòng nơi XML không được xác nhận không?

Trả lời

28

Bạn sẽ không làm những gì bạn đang làm sau?

Tạo đối tượng XmlReaderSettings và cho phép cảnh báo thông qua đối tượng đó.

Thật không may, dường như không có cách nào để chuyển đối tượng XmlReaderSettings của riêng bạn tới XmlDocument.Validate().
Thay vào đó, bạn có thể sử dụng một xác nhận XmlReader và một XmlNodeReader để xác nhận một hiện có XmlDocument (sử dụng một XmlNodeReader với StringReader chứ không phải là một XmlDocument)

XmlDocument x = new XmlDocument(); 
x.LoadXml(XmlSource); 

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.CloseInput = true;  
settings.ValidationEventHandler += Handler; 

settings.ValidationType = ValidationType.Schema; 
settings.Schemas.Add(null, ExtendedTreeViewSchema); 
settings.ValidationFlags = 
    XmlSchemaValidationFlags.ReportValidationWarnings | 
XmlSchemaValidationFlags.ProcessIdentityConstraints | 
XmlSchemaValidationFlags.ProcessInlineSchema | 
XmlSchemaValidationFlags.ProcessSchemaLocation ; 

StringReader r = new StringReader(XmlSource); 

using (XmlReader validatingReader = XmlReader.Create(r, settings)) { 
     while (validatingReader.Read()) { /* just loop through document */ } 
} 

Và xử lý:

private static void Handler(object sender, ValidationEventArgs e) 
{ 
     if (e.Severity == XmlSeverityType.Error || e.Severity == XmlSeverityType.Warning) 
      System.Diagnostics.Trace.WriteLine(
      String.Format("Line: {0}, Position: {1} \"{2}\"", 
       e.Exception.LineNumber, e.Exception.LinePosition, e.Exception.Message)); 
} 
+2

+1 Hoàn toàn bị mất e.Exception.LineNumber và e.Exception.LinePosition. – Elroy

+0

Tại sao bạn đặt mã này vào XmlDocument lúc đầu? Nó dường như không làm gì cả. –

+0

@JeremyHolovacs đúng, nó chỉ là một bản sao của một trong những câu trả lời của diễn đàn năm 2007 (http://www.devnewsgroups.net/dotnetframework/t43762-catching-line-numbers-with-xmldocument-validate.aspx), và nhận xét sau đã đề cập: "Nó hoạt động khi tôi xóa bỏ' XmlDocument' và thay thế 'XmlNodeReader' bằng ' StringReader' " – VonC

3

ValidationEventArgs .Message bao gồm dòng/cột trong văn bản của nó.

ValidationEventArgs.Exception có các trường cho dòng và cột.

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