在我的Java(Maven)项目中,我使用JAXB 2.2.11从我们的服务器收到的XML有效负载重建类的实例。我有一个定义类的.xsd
模式,它与JAXB结合使用可以很好地重建我想要的类型的实例。我遇到的问题是,这些有效载荷可以(没有任何通知或警告)具有我不太关心的额外元素。
可以显示这些额外元素的地方之一是xs:all
标记。我喜欢拥有所述xs:all
标签的功能:
all元素指定子元素可以出现在任何元素中 订单以及每个子元素可以出现零次或一次。
但是,在处理包含额外属性的XML有效内容时,我不想获得解析错误。 xs:any
中的xs:all
标记效果很好,但XSD 1.0中不允许使用此标记(根据w3schools和其他SO answer),显然,JAXB不支持XSD 1.1。此外,JAXB
处理any
或anyAttribute
的方式非常有趣,因为它将所有未知节点放入地图中,因此我可以将其记录为&#34 ;嘿!我们收到了一个我们现在不太关心的属性,但也许您将来会发现它在某种程度上有用吗?"
我已经阅读了支持XSD 1.1的Xsom,但显然,它并没有返回您想要的类的实例,而是更通用的集合哈希映射和列表,因此丢失了我的类型检查,这是我不想要的。
那么......有没有办法假装在xs:any
内拥有xs:all
?
答案 0 :(得分:2)
正确。 XSD 1.0不允许xsd:any
内的xsd:all
; XSD 1.1可以。
xsd:any
xsd:all
将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>