如何处理无效的子元素?

问题描述:

我有几个XML是这样的:如何处理无效的子元素?

-<PURCHASE xmlns:odf="urn:xmlns:eAccepta:output-data-fields"> 


-<PO TYPE="PURCHASEORDER"> 

<CUSTPONUM>PO0000</CUSTPONUM> 

<CUSTNUM/> 

<CUSTNAME>Custom name</CUSTNAME> 

<DATE>2014-01-06</DATE> 

<CUSTPREFIX>5LAN</CUSTPREFIX> 

<MEMO/> 

</PO> 


-<POLINES> 


-<LINE> 

<LINENUM>0</LINENUM> 

<CUSTLINE>1</CUSTLINE> 

<CUSTITEM>013169</CUSTITEM> 

<ITEMREV>A</ITEMREV> 

<DESCRIPTION>Description</DESCRIPTION> 

<QTY>2</QTY> 

<PRICE>46.14</PRICE> 

<DUEDATE>2014-01-30</DUEDATE> 

<OURITEM>gfd4fd</OURITEM> 

<CUSTREF>013169</CUSTREF> 

<ITEMMEMO/> 

</LINE> 

</POLINES> 

</PURCHASE> 

从这个XML我已经生成的XSD:

<?xml version="1.0" encoding="utf-16"?> 
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <xsd:element name="PURCHASE"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="PO"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="CUSTPONUM" type="xsd:string" /> 
       <xsd:element name="CUSTNUM" type="xsd:string" /> 
       <xsd:element name="CUSTNAME" type="xsd:string" /> 
       <xsd:element name="DATE" type="xsd:dateTime" /> 
       <xsd:element name="CUSTPREFIX" type="xsd:string" /> 
       <xsd:element name="MEMO" type="xsd:string" /> 
      </xsd:sequence> 
      <xsd:attribute name="TYPE" type="xsd:string" /> 
      </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="POLINES"> 
      <xsd:complexType> 
      <xsd:sequence> 
       <xsd:element name="LINE"> 
       <xsd:complexType> 
        <xsd:sequence> 
        <xsd:element name="LINENUM" type="xsd:int" /> 
        <xsd:element name="CUSTLINE" type="xsd:int" /> 
        <xsd:element name="CUSTITEM" type="xsd:int" /> 
        <xsd:element name="ITEMREV" type="xsd:string" /> 
        <xsd:element name="DESCRIPTION" type="xsd:string" /> 
        <xsd:element name="QTY" type="xsd:int" /> 
        <xsd:element name="PRICE" type="xsd:decimal" /> 
        <xsd:element name="DUEDATE" type="xsd:dateTime" /> 
        <xsd:element name="OURITEM" type="xsd:string" /> 
        <xsd:element name="CUSTREF" type="xsd:int" /> 
        <xsd:element name="ITEMMEMO" type="xsd:string" /> 
        </xsd:sequence> 
       </xsd:complexType> 
       </xsd:element> 
      </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 
</xsd:schema> 

现在我的代码不断抱怨这是一个无效的子元素。我从外部应用程序获取XML,所以我无法更改XML的任何内容。

我的代码来处理XML的这个样子的:

public void ValidateXmlDocument(string documentToValidate, string schemaPath) 
     { 
      XmlSchema schema; 
      using (var schemaReader = XmlReader.Create(@"C:\XML\XMLSchema.xsd")) 
      { 
       schema = XmlSchema.Read(schemaReader, ValidationEventHandler); 
      } 

      var schemas = new XmlSchemaSet(); 
      schemas.Add(schema); 

      var settings = new XmlReaderSettings(); 
      settings.ValidationType = ValidationType.Schema; 
      settings.Schemas = schemas; 
      settings.ValidationFlags = 
       XmlSchemaValidationFlags.ProcessIdentityConstraints | 
       XmlSchemaValidationFlags.ReportValidationWarnings; 
      settings.ValidationEventHandler += ValidationEventHandler; 

      using (var validationReader = XmlReader.Create(documentToValidate, settings)) 
      { 
       while (validationReader.Read()) 
       { 
        Console.WriteLine("ValidateXmlDocument ok"); 
       } 
      } 
     } 

     private static void ValidationEventHandler(
      object sender, ValidationEventArgs args) 
     { 
      if (args.Severity == XmlSeverityType.Error) 
      { 
       throw args.Exception; 
      } 

      Console.WriteLine(args.Message); 
     } 

我得到的错误是

The element 'POLINES' has invalid child element 'LINE'. 

当我与它告诉我,一个免费的在线XML验证验证XML对于XSD文件来说是完全完美的。 虽然我的代码不断给我错误。

我改变<xsd:element name="LINE"><xsd:element maxOccurs="unbounded" name="LINE">

希望这会帮助别人一天固定它自己。

至少有一个问题是您错误地订购了Entry子元素。在序列标签中定义的元素必须以相同的顺序出现在相应的XML文档中。

根据您的模式验证您的示例XML后,这是我看到的唯一问题。

编辑:

如果你有超过输入文件的元素顺序没有控制&它是不相符的&输入的每个子元素只能出现最多的一次,每个条目,您可能需要使用ALL元素而不是序列。

Source

+0

这不是一个选项,因为可能会发生多次。如果出现0或1次,可以使用“全部”。也;我的孩子元素都按照我的XSD正确对应。 – Matheno