3

在我的 Java (Maven) 项目中,我使用JAXB 2.2.11从我们的服务器接收到的 XML 有效负载重建类的实例。我有一个.xsd定义类的模式,它与 JAXB 结合使用可以很好地重建我想要的类型的实例。我遇到的问题是这些有效载荷可以(没有任何通知或警告)具有我并不真正关心的额外元素。

这些额外元素可以出现的地方之一是xs:all标签内。我确实喜欢具有所述xs:all标签的功能:

all 元素指定子元素可以以任何顺序出现,并且每个子元素可以出现零次或一次。

但是,我不想在处理包含额外属性的 XML 有效负载时出现解析错误。里面的xs:any标签xs:all会很好用,但在 XSD 1.0 中是不允许的(根据w3schools和其他SO 答案),显然,JAXB 不支持 XSD 1.1。此外,JAXB处理 theany或 the的anyAttribute方式非常有趣,因为它将所有未知节点放入地图中,所以我可以记录它说“嘿!我们正在接收一个我们现在并不真正关心的属性,但是也许你会发现它在未来有些用处?”

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

所以......有没有办法假装在一个xs:anyxs:all

4

1 回答 1

1

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

xsd:anyXSD 1.0的解决方法不允许xsd:all

  1. 限制xsd:any在一个固定的包装元素,例如expansionwith 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:allxsd: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>
    
于 2015-10-01T21:16:54.620 回答