【问题标题】:<xs:any> inside an <xs:all> XSD 1.0 workarounds?<xs:any> 在 <xs:all> XSD 1.0 解决方法中?
【发布时间】:2015-10-01 15:23:20
【问题描述】:

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

这些额外元素可能出现的位置之一是在xs:all 标记内。我确实喜欢上面提到的xs:all 标签的功能:

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

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

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

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

【问题讨论】:

    标签: java maven xsd jaxb xsd-1.0


    【解决方案1】:

    正确。 XSD 1.0 不允许在xsd:all 内使用xsd:any; 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>
      

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 2011-03-22
      • 1970-01-01
      • 2011-05-07
      • 2011-04-27
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多