gpt4 book ai didi

java - xs :any in xs:all tag for xsd

转载 作者:数据小太阳 更新时间:2023-10-29 02:30:21 28 4
gpt4 key购买 nike

我有一个场景,我需要一个 xsd,用于验证一些没有共同点的 xml。例如,

xml1:

<myXml1>
<myTag>
<someTag>..</someTag>
<requiredTag>..</requiredTag>
<someotherTag>..</someotherTag>
</myTag>
<myXml1>

xml2:

<myXml1>
<myTag>
<requiredTag>..</requiredTag>
<otherTag>..</otherTag>
</myTag>
<myXml1>

我需要一个通用的 xsd,以便验证具有“requiredTag”的两个 xml 的共同点并读取其值。

我尝试使用 <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:

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

关于java - xs :any in xs:all tag for xsd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22477106/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com