0

我有一个 REST XML 响应,其中包含如下数据块:

<tag>
  <total-pages type="integer">5</total-pages>
  <previous-page nil="true"></previous-page>
  <next-page nil="true"></next-page>
  <offset type="integer">5</offset>
</tag>

现在,有时数据可以像这样返回:

<tag>
  <total-pages type="integer">5</total-pages>
  <previous-page type="integer">0</previous-page>
  <next-page type="integer">1</next-page>
  <offset type="integer">5</offset>
</tag>

我一直在尝试提出一个 XSD 模式结构,该结构将解释 JAXB 可以接受的两种可能性。

我努力了:

<tag>
  <total-pages type="numeric-type" />
  <previous-page type="numeric-type" />
  <next-page type="numeric-type" />
  <offset type="numeric-type" />
</tag>

<xsd:complexType>
    <xsd:simpleContent>
        <xsd:extension base="xsd:integer">
            <xsd:attribute type="xsd:string" name="type" use="optional">
            <xsd:attribute type="xsd:boolean" name="nil" use="optional">
        </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>

但 JAXB 因解组错误而崩溃。

关于我可以使用什么 XSD 模式结构来解释返回 XML 的可变性的想法(我无法更改 XML,它来自我无法控制的第三方)。

谢谢,

佩里

4

1 回答 1

0

我首先从您的 XML 示例(在您的情况下为两个)生成一个 XSD:

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="tag">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="total-pages">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:unsignedByte">
                <xs:attribute name="type" type="xs:string" use="required" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="previous-page">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="type" type="xs:string" use="optional" />
                <xs:attribute name="nil" type="xs:boolean" use="optional" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="next-page">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute name="type" type="xs:string" use="optional" />
                <xs:attribute name="nil" type="xs:boolean" use="optional" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <xs:element name="offset">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:unsignedByte">
                <xs:attribute name="type" type="xs:string" use="required" />
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

当您与 XSD 进行比较时,您会注意到使用字符串而不是整数作为基本类型。这就解释了为什么您在解组时遇到问题:空字符串不是有效数字。

如果您将获得 xsi:nil 属性而不是“nil”,则 XSD 的生成方式将有所不同,即您的元素将具有 nillable="true"。

由于您无法更改 XML,因此您只能使用字符串;或者,您可以在空字符串和数值之间创建一个联合...至于在 JAXB 中的外观,您可以尝试一下...

于 2012-06-11T16:26:20.570 回答