2010-09-08 21 views
7

Tôi nhận được một biến chuỗi với XML trong đó và có một tệp XSD. Tôi phải xác thực XML trong chuỗi đối với tệp XSD và biết có nhiều hơn một cách (XmlDocument, XmlReader, ...?).Cách hiệu quả nhất để xác thực XML dựa vào XSD

Sau khi xác thực, tôi chỉ cần lưu trữ XML, vì vậy tôi không cần nó trong một XDocument hoặc XmlDocument.

Tôi nên làm gì nếu muốn có hiệu suất nhanh nhất?

Trả lời

9

những người khác đã đề cập đến lớp XmlReader để thực hiện xác nhận, và tôi sẽ không xây dựng thêm vào đó.

Câu hỏi của bạn không chỉ định nhiều ngữ cảnh. Bạn sẽ thực hiện xác thực này nhiều lần cho một số tài liệu xml hay chỉ một lần? Tôi đang đọc một kịch bản mà bạn đang chỉ xác nhận rất nhiều tài liệu xml (từ một hệ thống của bên thứ ba?) Và lưu trữ chúng để sử dụng trong tương lai.

Đóng góp của tôi cho việc thực hiện tìm kiếm sẽ là sử dụng biên dịch XmlSchemaSet sẽ là chủ đề an toàn, vì vậy một số luồng có thể sử dụng lại nó mà không cần phải phân tích lại tài liệu xsd.

var xmlSchema = XmlSchema.Read(stream, null); 
var xmlSchemaSet = new XmlSchemaSet(); 
xmlSchemaSet.Add(xmlSchema); 
xmlSchemaSet.Compile(); 

CachedSchemas.Add(name, xmlSchemaSet); 
+0

Có, tôi xác thực và lưu trữ nhiều tài liệu xml từ hệ thống bên thứ ba để sử dụng sau này. XSD luôn giống nhau, vì vậy gợi ý của bạn, biên dịch tập hợp lược đồ được nhiều ứng dụng, cảm ơn! – Hinek

+1

'CachedSchemas' trong ví dụ này là gì? –

+0

Chỉ cần một IDictionary để lưu trữ kết quả. – sisve

3

Tôi sẽ tìm XmlReader với XmlReaderSettings vì không cần tải XML hoàn chỉnh trong bộ nhớ. Nó sẽ hiệu quả hơn cho các tệp XML lớn.

0

Sử dụng một cấu hình để thực hiện xác thực, với nguồn là TextReader.

Bạn có thể tự xác định XSD các XmlReader là sử dụng nếu bạn không muốn dựa vào tờ khai trong tài liệu đầu vào (với XmlReaderSettings.Schemas tài sản)

Một khởi đầu (chỉ giả tờ khai XSD sơ thẩm trong đầu vào tài liệu) sẽ là:

var settings = new XmlReaderSettings { 
    ConformanceLevel = ConformanceLevel.Document, 
    ValidationType = ValidationType.Schema, 
    ValidationFlags = XmlSchemaValidationFlags.ProcessSchemaLocation | 
        XmlSchemaValidationFlags.ProcessInlineSchema, 
}; 

int warnings = 0; 
int errors = 0; 
settings.ValidationEventHandler += (obj, ea) => { 
    if (args.Severity == XmlSeverityType.Warning) { 
     ++warnings; 
    } else { 
     ++errors; 
    } 
}; 

XmlReader xvr = XmlReader.Create(new StringReader(inputDocInString), settings); 

try { 
    while (xvr.Read()) { 
     // do nothing 
    } 

    if (0 != errors) { 
     Console.WriteLine("\nFailed to load XML, {0} error(s) and {1} warning(s).", errors, warnings); 
    } else if (0 != warnings) { 
     Console.WriteLine("\nLoaded XML with {0} warning(s).", warnings); 
    } else { 
     System.Console.WriteLine("Loaded XML OK"); 
    } 

    Console.WriteLine("\nSchemas loaded durring validation:"); 
    ListSchemas(xvr.Schemas, 1); 

} catch (System.Xml.Schema.XmlSchemaException e) { 
    System.Console.Error.WriteLine("Failed to read XML: {0}", e.Message); 
} catch (System.Xml.XmlException e) { 
    System.Console.Error.WriteLine("XML Error: {0}", e.Message); 
} catch (System.IO.IOException e) { 
    System.Console.Error.WriteLine("IO error: {0}", e.Message); 
} 
Các vấn đề liên quan