Xml 创建XSD验证器的困难
我正在尝试创建一个XSD来验证这种XML:Xml 创建XSD验证器的困难,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我正在尝试创建一个XSD来验证这种XML: <Upload> <DocumentData> <docid>123</docid> <domain>PNI</domain> <expiry_date>20150101101010</expiry_date> <name>orçamento.xlsx</name> &l
<Upload>
<DocumentData>
<docid>123</docid>
<domain>PNI</domain>
<expiry_date>20150101101010</expiry_date>
<name>orçamento.xlsx</name>
<type>orçamento</type>
<user>nmsanto</user>
<file>fdsfjdflkdsçlfd</file>
<comments></comments>
</DocumentData>
<DocumentAttributes>
<projectid>123</projectid>
<objectid>1</objectid>
<keyword1>Nuno</keyword1>
<keyword1>Rua xpto</keyword1>
<keyword2>1223-123</keyword2>
<keyword3>Lisboa</keyword3>
</DocumentAttributes>
</Upload>
XML必须始终具有元素上载以及元素DocumentData和DocumentAttribute。
在DocumentData中,元素域、名称、类型、用户和文件是必需的,只能显示一次,而其他元素是可选的。
我遇到的最大困难是DocumentAttributes元素。必须至少有一个projectid或objectid,关键字1-keyword6是可选的,并且可以有4个以上的任意名称的可选元素
到目前为止,我拥有的XSD是:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:element name="Upload">
<xs:complexType>
<xs:all>
<xs:element name="DocumentData">
<xs:complexType>
<xs:all>
<xs:element name="docid" type="xs:string" minOccurs="0" />
<xs:element name="domain" type="xs:string" />
<xs:element name="versao" type="xs:integer" minOccurs="0" />
<xs:element name="name" type="xs:string" />
<xs:element name="expiry_date" type="xs:string" />
<xs:element name="type" type="xs:string" />
<xs:element name="user" type="xs:string" />
<xs:element name="file" type="xs:string" />
<xs:element name="comments" type="xs:string"
minOccurs="0" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="DocumentAttributes">
<xs:complexType>
<xs:all>
<xs:element type="xs:string" minOccurs="0" />
<xs:element type="xs:string" minOccurs="0" />
<xs:element type="xs:string" minOccurs="0" />
<xs:element type="xs:string" minOccurs="0" />
<xs:element name="keyword1" type="xs:string"
minOccurs="0" />
<xs:element name="keyword2" type="xs:string"
minOccurs="0" />
<xs:element name="keyword3" type="xs:string"
minOccurs="0" />
<xs:element name="keyword4" type="xs:string"
minOccurs="0" />
<xs:element name="keyword5" type="xs:string"
minOccurs="0" />
<xs:element name="keyword6" type="xs:string"
minOccurs="0" />
<xs:element name="usetype" abstract="true" />
<xs:element name="projectid" substitutionGroup="usetype" />
<xs:element name="objectid" substitutionGroup="usetype" />
</xs:all>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
我曾尝试在all元素中放入choice元素来验证objectid/projectid,但我知道这是不可能的。我如何进行验证?如果适合您的问题,请尝试以下代码 的所有子项都可以以除和之外的任何顺序出现 元素必须在关键字之前。最多允许4个关键字
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Upload">
<xs:complexType>
<xs:sequence>
<xs:element name="DocumentData">
<xs:complexType>
<xs:all>
<xs:element name="docid" type="xs:string" minOccurs="0" />
<xs:element name="domain" type="xs:string" />
<xs:element name="versao" type="xs:integer" minOccurs="0" />
<xs:element name="name" type="xs:string" />
<xs:element name="expiry_date" type="xs:string" />
<xs:element name="type" type="xs:string" />
<xs:element name="user" type="xs:string" />
<xs:element name="file" type="xs:string" />
<xs:element name="comments" type="xs:string" minOccurs="0" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="DocumentAttributes">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:sequence>
<xs:element name="projectid" type="xs:string" />
<xs:element name="objectid" type="xs:string" minOccurs="0" />
</xs:sequence>
<xs:sequence>
<xs:element name="objectid" type="xs:string" />
<xs:element name="projectid" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:choice>
<xs:choice minOccurs="0" maxOccurs="4">
<xs:element name="keyword1" type="xs:string" minOccurs="0" />
<xs:element name="keyword2" type="xs:string" minOccurs="0" />
<xs:element name="keyword3" type="xs:string" minOccurs="0" />
<xs:element name="keyword4" type="xs:string" minOccurs="0" />
<xs:element name="keyword5" type="xs:string" minOccurs="0" />
<xs:element name="keyword6" type="xs:string" minOccurs="0" />
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
与xs:sequence和xs:choice相比,xs:all有一些局限性;但是xs:all适用于某些元素可以以任何顺序出现的情况,如果元素的顺序是固定的,您可以使用xs:sequence,它可以包含xs:choice。谢谢您的回复。我知道xs:sequence,但在我的例子中,元素可以以任何顺序出现。我在为文档属性添加4个可以有任何名称的元素时遇到了一些问题。我已经尝试过使用元素any,但是我得到了一个错误,即可以在一个choice元素内部或外部创建歧义。你知道怎么解决这个问题吗?提前谢谢你!结果变得模棱两可,因为可选的projectid/obectid或关键字元素都匹配任何元素声明。一些简单的解决方案可以是:1使objectid和projectid都成为必需的;2要求任何元素位于不同的命名空间中;3将任何元素包装在元素中。解决方案3可能是最清楚的一个。