<xs:any> 在 <xs:all> XSD 1.0 解决方法中?
<xs:any> inside an <xs:all> XSD 1.0 workarounds?
在我的 Java (Maven) 项目中,我使用 JAXB 2.2.11 从我们的服务器接收到的 XML 负载重建 class 的实例。我有一个定义 class 的 .xsd
模式,它与 JAXB 结合使用可以很好地重建我想要的类型的实例。我遇到的问题是那些有效载荷可以(没有任何通知或警告)有我并不真正关心的额外元素。
这些额外元素可以出现的地方之一是在 xs:all
标记内。我确实喜欢 xs:all
标签的功能:
The all element specifies that the child elements can appear in any
order and that each child element can occur zero or one time.
但是,我不想在处理包含额外属性的 XML 负载时出现解析错误。 xs:all
中的 xs:any
标签会很好用,但在 XSD 1.0 中是不允许的(根据 w3schools and this other SO answer),显然,JAXB 不支持 XSD 1.1。此外,JAXB
处理 any
或 anyAttribute
的方式非常有趣,因为它将所有未知节点放入地图中,所以我可以记录它说 "Hey! We are receiving an attribute that we don't really care about as of now, but maybe you'll find it somehow useful in the future?"
我读过 Xsom,它支持 XSD 1.1,但显然 return 实例 class 你想要的,但更通用的哈希映射和列表集,因此失去了我的类型检查,这是我不想要的。
所以...有什么方法可以假装在xs:all
中有一个xs:any
?
正确。 XSD 1.0 不允许 xsd:any
在 xsd:all
内; XSD 1.1 可以。
XSD 1.0 的解决方法不允许 xsd:all
中的 xsd:any
将 xsd:any
限制为固定包装元素,例如 expansion
和 xsd:all
:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="root">
<xsd:complexType>
<xsd:all>
<xsd:element name="a"/>
<xsd:element name="b"/>
<xsd:element name="expansion">
<xsd:complexType>
<xsd:sequence>
<xsd:any maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:all>
</xsd:complexType>
</xsd:element>
</xsd:schema>
放弃xsd:all
的无序余量,让xsd:any
个元素依次跟随:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="root">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="a"/>
<xsd:element name="b"/>
<xsd:any maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
在我的 Java (Maven) 项目中,我使用 JAXB 2.2.11 从我们的服务器接收到的 XML 负载重建 class 的实例。我有一个定义 class 的 .xsd
模式,它与 JAXB 结合使用可以很好地重建我想要的类型的实例。我遇到的问题是那些有效载荷可以(没有任何通知或警告)有我并不真正关心的额外元素。
这些额外元素可以出现的地方之一是在 xs:all
标记内。我确实喜欢 xs:all
标签的功能:
The all element specifies that the child elements can appear in any order and that each child element can occur zero or one time.
但是,我不想在处理包含额外属性的 XML 负载时出现解析错误。 xs:all
中的 xs:any
标签会很好用,但在 XSD 1.0 中是不允许的(根据 w3schools and this other SO answer),显然,JAXB 不支持 XSD 1.1。此外,JAXB
处理 any
或 anyAttribute
的方式非常有趣,因为它将所有未知节点放入地图中,所以我可以记录它说 "Hey! We are receiving an attribute that we don't really care about as of now, but maybe you'll find it somehow useful in the future?"
我读过 Xsom,它支持 XSD 1.1,但显然 return 实例 class 你想要的,但更通用的哈希映射和列表集,因此失去了我的类型检查,这是我不想要的。
所以...有什么方法可以假装在xs:all
中有一个xs:any
?
正确。 XSD 1.0 不允许 xsd:any
在 xsd:all
内; XSD 1.1 可以。
XSD 1.0 的解决方法不允许 xsd:all
中的 xsd:any
将
xsd:any
限制为固定包装元素,例如expansion
和xsd:all
:<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="root"> <xsd:complexType> <xsd:all> <xsd:element name="a"/> <xsd:element name="b"/> <xsd:element name="expansion"> <xsd:complexType> <xsd:sequence> <xsd:any maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:all> </xsd:complexType> </xsd:element> </xsd:schema>
放弃
xsd:all
的无序余量,让xsd:any
个元素依次跟随:<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="root"> <xsd:complexType> <xsd:sequence> <xsd:element name="a"/> <xsd:element name="b"/> <xsd:any maxOccurs="unbounded"/> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>