[英]<xs:any> inside an <xs:all> XSD 1.0 workarounds?
在我的Java(Maven)项目中,我使用JAXB 2.2.11从我们的服务器接收的XML有效负载重建类的实例。 我有一个定义类的.xsd
模式,它与JAXB结合使用可以很好地重建我想要的类型的实例。 我遇到的问题是那些有效载荷可以(没有任何通知或警告)有额外的元素,我并不真正关心。
这些额外元素可以出现的地方之一是在xs:all
标记内。 我喜欢具有所述xs:all
标签的功能:
all元素指定子元素可以按任何顺序出现,并且每个子元素可以出现零次或一次。
但是,我不希望在处理包含额外属性的XML有效内容时收到解析错误。 一个xs:any
内的xs:any
标签xs:all
都可以很好地工作,但是在XSD 1.0中是不允许的(根据w3schools和其他SO的答案 ),显然,JAXB不支持XSD 1.1。 此外, JAXB
处理any
或anyAttribute
方式非常有趣,因为它将所有未知节点放入映射中,因此我可以将其记录为“嘿!我们正在接收一个我们并不关心的属性现在,但也许你会发现它在将来有用吗?“
我读过Xsom ,它支持XSD 1.1,但显然,它不会返回你想要的类的实例 ,而是返回更通用的哈希映射和列表集,因此我的类型检查会丢失,这是我不喜欢的不想。
那么......有没有办法假装有一个xs:any
xs:all
?
正确。 XSD 1.0不允许xsd:all
xsd:any
; XSD 1.1可以。
xsd:all
xsd:any
将xsd:any
为固定的包装元素,例如使用xsd:all
expansion
:
<?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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.