0

次のようなデータのチャンクを持つRESTXML応答があります。

<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>

私は、JAXBに受け入れられる両方の可能性を説明するXSDスキーマ構造を考え出そうとしてきました。

私が試してみました:

<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はアンマーシャリングエラーで爆発します。

返されるXMLの変動性を説明するために使用できるXSDスキーマ構造についての考え(XMLを変更することはできません。これは、私が制御できないサードパーティからのものです)。

ありがとうございました、

ペリー

4

1 に答える 1

0

私はあなたのXMLサンプルから1つのXSDを生成することから始めました(あなたの場合は2つ):

<?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と比較すると、基本型として整数ではなく文字列が使用されていることがわかります。これが、アンマーシャリングで問題が発生する理由を説明しています。空の文字列は有効な数値ではありません。

「nil」の代わりにxsi:nil属性を取得する場合、XSDは別の方法で生成されます。つまり、要素に対してnillable="true"が含まれます。

XMLを変更することはできないため、文字列の使用に固執します。または、空の文字列と数値の和集合を作成することもできます... JAXBでどのように表示されるかについては、試してみてください...

于 2012-06-11T16:26:20.570 に答える