[英]xs:any in xs:all tag for xsd
我有一個場景,我需要一個xsd,用於驗證幾個xml的幾個共同點。 例如,
XML1:
<myXml1>
<myTag>
<someTag>..</someTag>
<requiredTag>..</requiredTag>
<someotherTag>..</someotherTag>
</myTag>
<myXml1>
XML2:
<myXml1>
<myTag>
<requiredTag>..</requiredTag>
<otherTag>..</otherTag>
</myTag>
<myXml1>
我需要一個通用的xsd,以便驗證共有“ requiredTag
”的xmls並讀取它的值。
我嘗試使用<xs:any>
但僅在xs:sequence
支持,而在xs:all
不支持。 我的requiredTag
可以在myTag
下的任何地方。
我想使用這個xsd來創建使用jaxb讀取值的類。
任何幫助表示贊賞。
提前致謝。 :)
如果您可以使用XSD 1.1進行驗證,則可以使用:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" vc:minVersion="1.1">
<xs:complexType name="myTagType">
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
<xs:element name="requiredTag" type="xs:string"/>
<xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
</xs:complexType>
...
</xs:schema>
不幸的是,這在XSD 1.0中失敗了,因為它違反了Unique Particle Atribution約束。
一種解決方法包括為any
元素和requiredTag
使用不同的命名空間。 聲明具有所需標記的命名空間的模式:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
xmlns="required-tag-ns"
targetNamespace="required-tag-ns">
<xs:element name="requiredTag" type="xs:string"/>
</xs:schema>
現在將其導入到您的模式中(您將需要其中一個的前綴):
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
targetNamespace="any-tag-ns"
xmlns="any-tag-ns"
xmlns:r="required-tag-ns">
<xs:import namespace="required-tag-ns" schemaLocation="required.xsd"/>
<xs:complexType name="myTagType">
<xs:sequence>
<xs:any namespace="any-tag-ns" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
<xs:element ref="r:requiredTag"/> <!-- now it works in 1.0 because the ambiguity was removed -->
<xs:any namespace="any-tag-ns" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
</xs:complexType>
...
</xs:schema>
上面的XSD 1.1架構或XSD 1.0架構將驗證這些情況:
<myTag>
<requiredTag>..</requiredTag>
</myTag>
<myTag>
<someTag>..</someTag>
<requiredTag>..</requiredTag>
</myTag>
<myTag>
<requiredTag>..</requiredTag>
<someotherTag>..</someotherTag>
</myTag>
<myTag>
<someTag>..</someTag>
<someotherTag>..</someotherTag>
<someotherTag>..</someotherTag>
<requiredTag>..</requiredTag>
<someotherTag>..</someotherTag>
</myTag>
<myTag>
<someTag>..</someTag>
<requiredTag>..</requiredTag>
<someTag>..</someTag>
<someTag>..</someTag>
<someotherTag>..</someotherTag>
</myTag>
但他們不會驗證這些情況:
<myTag> <!-- missing requiredTag -->
<someTag>..</someTag>
<someotherTag>..</someotherTag>
</myTag>
<myTag> <!-- too many requiredTags -->
<requiredTag>..</requiredTag>
<requiredTag>..</requiredTag>
<someotherTag>..</someotherTag>
</myTag>
在XSD 1.1版本中,您不需要命名空間。 在XSD 1.0解決方案中,您的實例requiredTag
使用其命名空間限定requiredTag
:
<myXml xmlns="any-tag-ns"
xmlns:r="required-tag-ns"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="any-tag-ns your-schema-file.xsd">
<myTag>
<someTag>..</someTag>
<someotherTag>..</someotherTag>
<someotherTag>..</someotherTag>
<r:requiredTag>..</r:requiredTag>
<someotherTag>..</someotherTag>
</myTag>
...
</myXml>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.