繁体   English   中英

<xs:any> 在里面 <xs:all> XSD 1.0解决方法?

[英]<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处理anyanyAttribute方式非常有趣,因为它将所有未知节点放入映射中,因此我可以将其记录为“嘿!我们正在接收一个我们并不关心的属性现在,但也许你会发现它在将来有用吗?“

我读过Xsom ,它支持XSD 1.1,但显然,它不会返回你想要的类的实例 ,而是返回更通用的哈希映射和列表集,因此我的类型检查会丢失,这是我不喜欢的不想。

那么......有没有办法假装有一个xs:any xs:all

正确。 XSD 1.0不允许xsd:all xsd:any ; XSD 1.1可以。

XSD 1.0的变通方法不允许xsd:all xsd:any

  1. 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> 
  2. 放弃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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM