2016-04-28 41 views
0

Ich schaue auf etwas, XML zu validieren, wir werden gegen die XSD dafür gesendet. Ich bin auf diese drei gestoßen, aber nur einer scheint "zu arbeiten". Ich vermute, es gibt einen Grund für eine Markierung und ein Problem, wo andere nicht fragen, was die beste Methode ist und den Unterschied, abgesehen von der Art und Weise ist gemacht, mit diesen drei.Verschiedene Arten der XML-Validierung

XML

<?xml version="1.0" encoding="UTF-8"?> 
<Person> 
    <Forename>John</Forename> 
</Person> 

XSD

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" version="0.2"> 
    <xs:annotation> 
    <xs:documentation> 
    </xs:documentation> 
    </xs:annotation> 
    <xs:element name ="Person"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Forename" type="xs:string"/> 
     <xs:element name="Surname" type="xs:string"/> 
     <xs:element name="Middlename" type="xs:string" minOccurs="0"/> 
    </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

Die erste Fahne ist ein Fehler, dass der Name Element erwartet wird, ist aber in der XML nicht, die ich erwarten würde.

class XPathValidation 
    { 
     static void Main() 
     { 
      XmlSchemaSet schemas = new XmlSchemaSet(); 
      schemas.Add("", XmlReader.Create(@"C:\test\test.xsd")); 

      XDocument doc = XDocument.Load(@"C:\test\test.xml"); 



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

      Console.ReadKey(); 
     } 


    } 

Diese zwei beide nur laufen und nichts zurück.

class XmlSchemaSetExample 
    { 
     static void Main() 
     { 
      XmlReaderSettings booksSettings = new XmlReaderSettings(); 
      booksSettings.Schemas.Add("http://www.w3.org/2001/XMLSchema", @"C:\test\test.xsd"); 
      booksSettings.ValidationType = ValidationType.Schema; 
      booksSettings.ValidationEventHandler += new ValidationEventHandler(booksSettingsValidationEventHandler); 

      XmlReader books = XmlReader.Create(@"C:\test\test.xml", booksSettings); 

      while (books.Read()) { } 

      Console.ReadKey(); 
     } 

     static void booksSettingsValidationEventHandler(object sender, ValidationEventArgs e) 
     { 
      if (e.Severity == XmlSeverityType.Warning) 
      { 
       Console.Write("WARNING: "); 
       Console.WriteLine(e.Message); 
      } 
      else if (e.Severity == XmlSeverityType.Error) 
      { 
       Console.Write("ERROR: "); 
       Console.WriteLine(e.Message); 
      } 
     } 
    } 

und

class XPathValidation 
{ 
    static void Main() 
    { 
     try 
     { 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.Schemas.Add("http://www.w3.org/2001/XMLSchema", @"C:\test\test.xsd"); 
      settings.ValidationType = ValidationType.Schema; 

      XmlReader reader = XmlReader.Create(@"C:\test\test.xml", settings); 
      XmlDocument document = new XmlDocument(); 
      document.Load(reader); 

      ValidationEventHandler eventHandler = new ValidationEventHandler(ValidationEventHandler); 

      // the following call to Validate succeeds. 
      document.Validate(eventHandler); 


      // the document will now fail to successfully validate 
      document.Validate(eventHandler); 

      Console.ReadKey(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

    static void ValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
     switch (e.Severity) 
     { 
      case XmlSeverityType.Error: 
       Console.WriteLine("Error: {0}", e.Message); 
       break; 
      case XmlSeverityType.Warning: 
       Console.WriteLine("Warning {0}", e.Message); 
       break; 
     } 

    } 
} 

danke für die Info, das Lernen noch alles.

+0

Sie können XML in VS überprüfen. Im Menü Projekt: Neues Element hinzufügen: XML-Datei. Fügen Sie XML in das Fenster ein. Im Menü Projekt: Neues Element hinzufügen: XML-Schema. Fügen Sie das Schema im Fenster ein. Wählen Sie dann im Haupt-VS-Fenster XML: Schemas: Suchen Sie nach dem Schema, das Sie hinzugefügt haben, und fügen Sie dann in der linken Spalte das Häkchen hinzu. Dann drücken Sie OK. Gehen Sie zu Ihrem sml Tab und der Fehler wird angezeigt. Es sieht so aus, als hätte Person unvollständigen Inhalt. – jdweng

Antwort

1

Ich könnte mir vorstellen, dass die zweiten beiden nicht funktionieren, weil Sie einen falschen Wert für targetNamespace liefern, wenn Sie das Schema zu Ihrem XmlReaderSettings hinzufügen. Dies sollte eine leere Zeichenfolge sein, da Ihr XML keinen Namespace hat (oder null, wie per the docs, dies leitet den Namespace aus dem Schema ab).

Was ist besser, hängt davon ab, was Ihre Anforderung ist. Um es einfach zu validieren, wird Option 2 unter Verwendung der XmlReader bevorzugt, da es nicht zu Lasten geht, das gesamte XML in ein DOM zu laden, das Sie dann wegwerfen würden.

Wenn Sie das XML mithilfe eines DOM abfragen müssen, ist die API XDocument/LINQ to XML (Option 1) eine viel bessere, modernere API als die alte API XmlDocument (Option 3).

+0

Vielen Dank, sehr hilfreich :) – JQuery

Verwandte Themen