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

<xs:any> inside an <xs:all> XSD 1.0 workarounds?

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

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

The all element specifies that the child elements can appear in any order and that each child element can occur zero or one time.

但是,我不想在处理包含额外属性的 XML 负载时出现解析错误。 xs:all 中的 xs:any 标签会很好用,但在 XSD 1.0 中是不允许的(根据 w3schools and this other SO answer),显然,JAXB 不支持 XSD 1.1。此外,JAXB 处理 anyanyAttribute 的方式非常有趣,因为它将所有未知节点放入地图中,所以我可以记录它说 "Hey! We are receiving an attribute that we don't really care about as of now, but maybe you'll find it somehow useful in the future?"

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

所以...有什么方法可以假装xs:all中有一个xs:any

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

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

中的 xsd:any
  1. xsd:any 限制为固定包装元素,例如 expansionxsd: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>