我有一个场景,我需要一个xsd,用于验证几个没有共同点的xml。例如,
XML1:
<myXml1>
<myTag>
<someTag>..</someTag>
<requiredTag>..</requiredTag>
<someotherTag>..</someotherTag>
</myTag>
<myXml1>
XML2:
<myXml1>
<myTag>
<requiredTag>..</requiredTag>
<otherTag>..</otherTag>
</myTag>
<myXml1>
我需要一个共同的xsd,以便验证xmls&#39;哪个有&#34; requiredTag
&#34;共同阅读它的价值。
我尝试使用<xs:any>
但仅在xs:sequence
支持,而不在xs:all
支持。我的requiredTag
可以位于myTag
下的任何位置。
我想使用这个xsd来创建使用jaxb读取值的类。
感谢任何帮助。
提前致谢。 :)
答案 0 :(得分:3)
如果您可以使用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
:
<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>