针对C#中的架构验证XSD时,获得上述错误。模式将查找列出的标签,而其他标签是可选的。 以下是我的XSD文件。 xml文件将需要如何修改,以确保它具有XSD中下面列出的那些标签,并且忽略了多余的标签。它使用XML文本阅读器进行模式验证
<?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>
答案 0 :(得分:0)
问题是您的架构允许任意数量的称为InvoiceMatter的元素,后跟可以具有任何名称的元素(包括名称InvoiceMatter);因此,如果找到了InvoiceMatter元素,则它是否与特定的元素粒子或通配符匹配是不确定的。
XSD 1.1通过说特定元素粒子始终处于优先地位来解决此问题,因此一种解决方案是简单地使用XSD 1.1处理器(例如Saxon)。
如果您不能这样做,则通常的XSD 1.0解决方案是在xs:any通配符上使用targetNamespace属性,以按名称空间限制它(例如targetNamespace="##other"
)。但这就是您设计的改变;如果您想允许元素在同一命名空间中,那么就会有问题。