2016-04-28 65 views
0

我正在查看某些内容以验证XML,因此我们针对XSD发送了它。我遇到了这三个,但只有一个似乎'工作'我猜测有一个标记和问题的原因,其他人不知道什么是最好的方法和差异,除了它的方式完成这三件事。不同类型的XML验证

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> 

第一个标志就是那个姓元素预期错误,但不是我所期望的XML。

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(); 
     } 


    } 

这两个都只是运行而不返回任何东西。

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); 
      } 
     } 
    } 

​​

感谢您的信息,仍然在学习这一切。

+0

你可以在VS中验证xml。从菜单项目:添加新项目:XML文件。将XML粘贴到窗口中。从菜单项目:添加新项目:XML模式。将模式粘贴到窗口中。然后从主VS窗口中选择XML:Schemas:查找您添加的模式,然后在左栏添加复选标记。然后按确定。转到您的sml选项卡,并显示错误。它看起来像人有不完整的内容。 – jdweng

回答

1

我会想象第二个不起作用,因为当您将模式添加到您的​​时,您提供了一个不正确的值targetNamespace。这应该是一个空字符串,因为您的XML没有名称空间(或null,因为per the docs,这会从模式中推断出名称空间)。

至于哪个更好,这取决于你的要求是什么。如果简单地验证它,使用XmlReader的选项2是首选,因为它不会花费将整个XML加载到DOM然后扔掉。

如果您确实需要使用DOM查询XML,则XDocument/LINQ to XML API(选项1)比旧的XmlDocument API(选项3)更好,更现代化。

+0

谢谢,非常有帮助:) – JQuery