难以创建 XSD 个验证器
Difficulty creating XSD Validator
我正在尝试创建一个 XSD 来验证这种 XML:
<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 和 DocumentAttributes 的元素 Upload。
在 DocumentData 中,domain、name、type、user 和 file 元素是强制性的,只能出现一次,而其他元素是可选的。
我遇到的最大困难是 DocumentAttributes 元素。必须至少有 projectid 或 objectid 之一,keyword1-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,但我了解到这是不可能的。我将如何验证它?
如果适合您的问题,请尝试以下代码。
<DocumentData>
的所有 children 可以以任何顺序出现,但在 <DocumentAttributes>
中 <projectid>
和 <objectid>
元素必须在关键字之前。最多允许 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>
我正在尝试创建一个 XSD 来验证这种 XML:
<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 和 DocumentAttributes 的元素 Upload。 在 DocumentData 中,domain、name、type、user 和 file 元素是强制性的,只能出现一次,而其他元素是可选的。 我遇到的最大困难是 DocumentAttributes 元素。必须至少有 projectid 或 objectid 之一,keyword1-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,但我了解到这是不可能的。我将如何验证它?
如果适合您的问题,请尝试以下代码。
<DocumentData>
的所有 children 可以以任何顺序出现,但在 <DocumentAttributes>
中 <projectid>
和 <objectid>
元素必须在关键字之前。最多允许 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>