2009-05-05 4 views
7

Eingabe ist XML als Zeichenfolge und ich habe ein XSD-Schema gegen verifiziert werden.Loading XDocument beim Validieren gegen Schema in .NET 3.5

Ich möchte das XML gegen das XSD-Schema validieren, während das XML in ein XDocument geladen wird (Voraussetzung, da ich danach mit Linq analysieren muss).

Jeder hat ein kleines Code-Snippet?

Antwort

20

Legen Sie das Dokument, und dann XDocument.Validate verwenden, in einem XmlSchemaSet vorbei an den Schemata darzustellen Sie gegen überprüfen möchten, und ein ValidationEventHandler angemessen auf alle Validierungsprobleme zu reagieren.

Es gibt eine MSDN article mit einem vollständigen Beispiel und Diskussion.

15

Nur eine Anmerkung über die obige Antwort. Es ist richtig, kann aber verwirrend sein. XDocument.Validate ist eine Erweiterungsmethode, die im System.Xml.Schema-Namespace vorhanden ist. Wenn Sie diesen Namespace nicht verwenden, wird die Validate-Methode nicht in Intellisense angezeigt. Ich dachte nur, ich würde denen helfen, die genauso verwirrt waren wie ich. :)

2

So ist der Code hier.

Von Jon Skeets Antwort und MSDN http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.validate.aspx

var xsdMarkup = 
    @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'> 
<xsd:element name='Root'> 
<xsd:complexType> 
    <xsd:sequence> 
    <xsd:element name='Child1' minOccurs='1' maxOccurs='1'/> 
    <xsd:element name='Child2' minOccurs='1' maxOccurs='1'/> 
    </xsd:sequence> 
</xsd:complexType> 
</xsd:element> 
</xsd:schema>"; 
var schemas = new XmlSchemaSet(); 
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup))); 

var doc1 = new XDocument(
    new XElement("Root", 
        new XElement("Child1", "content1"), 
        new XElement("Child2", "content1") 
     ) 
    ); 

var doc2 = new XDocument(
    new XElement("Root", 
        new XElement("Child1", "content1"), 
        new XElement("Child3", "content1") 
     ) 
    ); 

Console.WriteLine("Validating doc1"); 
var errors = false; 
doc1.Validate(schemas, (o, e) => 
          { 
           Console.WriteLine("{0}", e.Message); 
           errors = true; 
          }); 
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated"); 

Console.WriteLine(); 
Console.WriteLine("Validating doc2"); 
errors = false; 
doc2.Validate(schemas, (o, e) => 
          { 
           Console.WriteLine("{0}", e.Message); 
           errors = true; 
          }); 
Console.WriteLine("doc2 {0}", errors ? "did not validate" : "validated"); 
+0

I XSD-Datei mit 'var stream = new Stream (pathXSD)' *** funktioniert nicht *** – Kiquenet

Verwandte Themen