2010-03-09 47 views
6

Trong C#/.NET 2.0, khi tôi serialize một đối tượng sử dụng XmlSerializer, cách dễ nhất để xác thực đầu ra dựa vào lược đồ XML là gì?Làm cách nào để xác thực đầu ra của XmlSerializer?

Vấn đề là quá dễ để viết XML không hợp lệ bằng XmlSerializer và tôi không thể tìm cách xác thực XML không có vẻ cồng kềnh. Lý tưởng nhất tôi sẽ mong đợi để thiết lập giản đồ trong XmlSerializer hoặc để có một XmlWriter xác nhận hợp lệ.

+0

Trong .NET 4 có các sự kiện để bắt các thành phần không mong muốn. –

Trả lời

4

gì về đọc nó trong một lần nữa sử dụng một đầu đọc xác nhận

Dưới đây là một đâm nhanh vào nó

Stream stream = new MemoryStream(Encoding.UTF8.GetBytes("<YourXml />")); 
var input = mappingAssembly.GetManifestResourceStream(
      "MySchema.xsd" 
      ); //This could be whatever resource your schema is   
var schemas = new XmlSchemaSet();    
schemas.Add(
    "urn:YourSchemaUrn", 
    XmlReader.Create(
     input 
    ) 
); 

var settings = new XmlReaderSettings 
          { 
           ValidationType = ValidationType.Schema, 
           Schemas = schemas 
          }; 

settings.ValidationEventHandler += MakeAHandlerToHandleAnyErrors; 

var reader = XmlReader.Create(stream, settings); 
while (reader.Read()) {} //Makes it read to the end, therefore validates 

Bạn sẽ cần phải có một số xử lý để làm điều gì đó khi có những sai sót.

0

Bạn có thể sử dụng XmlReader để xác thực tệp XML dựa trên lược đồ XSD.

+1

Đúng, nhưng điều đó có nghĩa là tôi phải viết XML, lưu trữ nó ở đâu đó và đọc lại. Tôi đã hy vọng rằng có một cách dễ dàng hơn để làm điều đó một cách nhanh chóng. –

+0

XmlSerializer không hỗ trợ xác nhận hợp lệ đối với lược đồ XSD vì nó được cho là tạo XML từ một đối tượng cần phải luôn hợp lệ. –

+0

Đó không phải là trường hợp mặc dù. Có vẻ như các phần tử được yêu cầu bị bỏ qua nếu giá trị của chúng là null. Và có lẽ những thứ khác không được hỗ trợ bởi XmlSerializer (các ràng buộc về chiều dài và mẫu cho các chuỗi, tính duy nhất, các tham chiếu chính). –

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