xs:任何xs:xsd的所有标记

时间:2014-03-18 10:50:28

标签: java xml jaxb xsd

我有一个场景,我需要一个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读取值的类。

感谢任何帮助。

提前致谢。 :)

1 个答案:

答案 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>