通配符## any错误xml模式验证

时间:2018-10-24 13:45:53

标签: c# .net xml xsd xml-validation

针对C#中的架构验证XSD时,获得上述错误。模式将查找列出的标签,而其他标签是可选的。 以下是我的XSD文件。 xml文件将需要如何修改,以确保它具有XSD中下面列出的那些标签,并且忽略了多余的标签。它使用XML文本阅读器进行模式验证

enter image description here

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="InvoiceExport" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="InvoiceExport" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Invoice">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Invoice_ID" type="xs:string" minOccurs="1" />             
              <xs:element name="BillingEntity" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="Name" type="xs:string" minOccurs="1" />                  
                    <xs:element name="VendorNumber" type="xs:string" minOccurs="1" />                                        
                    <xs:any processContents="lax" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="InvoiceBaseInfo" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="InvoiceDate" type="xs:string" minOccurs="1" />                  
                    <xs:element name="BillingEntityInvoiceNumber" type="xs:string" minOccurs="1" />                    
                    <xs:element name="ReceivedDate" type="xs:string" minOccurs="1" />                   
                    <xs:element name="AdjustedBilledAmount" type="xs:string" minOccurs="1" />                    
                    <xs:element name="UserFields" minOccurs="1" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:all>
                          <xs:element name="FirstApproverID" type="xs:string" minOccurs="1" />
                          <xs:element name="LastApproverID" type="xs:string" minOccurs="1" />
                          <xs:element name="LegalSpendCode" type="xs:string" minOccurs="0" />
                        </xs:all>
                      </xs:complexType>
                    </xs:element>
                     <xs:any processContents="lax" maxOccurs="unbounded"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
              <xs:element name="InvoiceMatter" minOccurs="1" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>                       
                    <xs:element name="Priority_CD" type="xs:string" minOccurs="1" />                   
                    <xs:element name="InvoiceMatterDetail" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>                        
                          <xs:any processContents="lax" maxOccurs="unbounded"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="InvoiceMatterAllocation" minOccurs="1" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>                          
                          <xs:element name="AllocationAmount" type="xs:string" minOccurs="1" />
                          <xs:element name="ChargeBackAccount1" type="xs:string" minOccurs="1" />
                          <xs:element name="ChargeBackAccount2" type="xs:string" minOccurs="1" />
                          <xs:element name="ChargeBackAccount3" type="xs:string" minOccurs="1" />
                          <xs:element name="UserFields" type="xs:string" minOccurs="0" />
                          <xs:any processContents="lax" maxOccurs="unbounded"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="InvoiceMatterApproval" minOccurs="1" maxOccurs="unbounded">                   
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="EmployeeName" type="xs:string" minOccurs="1" />                          
                          <xs:any processContents="lax" maxOccurs="unbounded"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>         
              <xs:any processContents="lax" maxOccurs="unbounded"/>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

1 个答案:

答案 0 :(得分:0)

问题是您的架构允许任意数量的称为InvoiceMatter的元素,后跟可以具有任何名称的元素(包括名称InvoiceMatter);因此,如果找到了InvoiceMatter元素,则它是否与特定的元素粒子或通配符匹配是不确定的。

XSD 1.1通过说特定元素粒子始终处于优先地位来解决此问题,因此一种解决方案是简单地使用XSD 1.1处理器(例如Saxon)。

如果您不能这样做,则通常的XSD 1.0解决方案是在xs:any通配符上使用targetNamespace属性,以按名称空间限制它(例如targetNamespace="##other")。但这就是您设计的改变;如果您想允许元素在同一命名空间中,那么就会有问题。