2010-03-09 9 views
6

W języku C#/.NET 2.0, gdy I serialize obiekt przy użyciu XmlSerializer, jaki jest najłatwiejszy sposób sprawdzania poprawności danych wyjściowych względem schematu XML?Jak mogę sprawdzić poprawność wyjścia XmlSerializer?

Problem polega na tym, że napisanie nieprawidłowego pliku XML za pomocą XmlSerializer jest zbyt proste, a nie mogę znaleźć sposobu na sprawdzenie poprawności kodu XML, który nie wygląda na uciążliwy. Idealnie byłoby oczekiwać, aby ustawić schemat w XmlSerializer lub mieć XmlWriter, który sprawdza poprawność.

+0

W .NET 4 są zdarzenia, które wychwytują nieoczekiwane elementy. –

Odpowiedz

4

Co o czytanie go ponownie za pomocą Walidujący czytelnika

Oto krótki stab na to

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 

Musisz mieć jakiś obsługi do zrobienia czegoś, gdy istnieją błędy.

0

Można użyć XmlReader do sprawdzenia poprawności pliku XML na schemacie XSD.

+1

To prawda, ale to oznacza, że ​​muszę napisać XML, przechowywać go gdzieś i przeczytać ponownie. Miałem nadzieję, że jest łatwiejszy sposób na zrobienie tego w locie. –

+0

XmlSerializer nie obsługuje sprawdzania poprawności względem schematu XSD, ponieważ prawdopodobnie generuje kod XML z obiektu, który powinien być zawsze poprawny. –

+0

Tak jednak nie jest. Wygląda na to, że wymagane elementy są pomijane, jeśli ich wartość jest zerowa. Prawdopodobnie nie ma innych rzeczy, których XmlSerializer nie obsługuje (ograniczenia długości i wzorca dla łańcuchów, unikalność, kluczowe odniesienia). –