<xs:all> XSD 1.0变通办法中的<xs:any>?

时间:2015-10-01 15:23:21

标签: java maven xsd jaxb xsd-1.0

在我的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处理anyanyAttribute的方式非常有趣,因为它将所有未知节点放入地图中,因此我可以将其记录为&#34 ;嘿!我们收到了一个我们现在不太关心的属性,但也许您将来会发现它在某种程度上有用吗?&#34;

我已经阅读了支持XSD 1.1的Xsom,但显然,它并没有返回您想要的类的实例,而是更通用的集合哈希映射和列表,因此丢失了我的类型检查,这是我不想要的。

那么......有没有办法假装xs:any内拥有xs:all

1 个答案:

答案 0 :(得分:2)

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

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

中的xsd:all
  1. 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>
    
  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>