Unmarshalling maxOccurs неограниченные элементы, имеющие атрибуты через jaxb - PullRequest
1 голос
/ 20 октября 2011

Я пытаюсь разархивировать xml-ответ (анализ с JAXB), соответствующий следующему xsd:

<?xml version="1.0" encoding="utf-16"?>
<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="response" type="responseType" />
  <xsd:complexType name="responseType">
    <xsd:sequence>
      <xsd:element name="result" type="resultType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="resultType">
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" name="doc" type="docType" />
    </xsd:sequence>
    <xsd:attribute name="start" type="xsd:int" />
  </xsd:complexType>
  <xsd:complexType name="docType">
    <xsd:sequence>
      <xsd:element minOccurs="1" name="int" type="intType" maxOccurs="unbounded"  />
      <xsd:element maxOccurs="unbounded" minOccurs="1" name="str" type="strType" />
      <xsd:element name="float" type="floatType" />
      <xsd:element maxOccurs="unbounded" minOccurs="1" name="long" type="longType" />
      <xsd:element name="date" type="dateType" />    
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="dateType">
            <xsd:attribute name="name" type="xsd:string" />
    </xsd:complexType>
  <xsd:complexType name="longType">
    <xsd:attribute name="name" type="xsd:string" />
  </xsd:complexType>
  <xsd:complexType name="floatType">
    <xsd:attribute name="name" type="xsd:string" />
  </xsd:complexType>
  <xsd:complexType name="strType">
    <xsd:attribute name="name" type="xsd:string" />
  </xsd:complexType>
  <xsd:complexType name="intType">
    <xsd:attribute name="name" type="xsd:string" />
  </xsd:complexType>
</xsd:schema>

Я также сгенерировал классы успешно, используя инструмент xjc. Но я не могу получить текст всех maxoccurs неограниченных элементов: int, str, long node. Поскольку эти элементы не ограничены, я получаю список каждого из этих элементов типа ArrayList через методы в сгенерированных классах. И, метод, чтобы получить значение атрибута. Но сгенерированные классы не предоставляют метод для получения значения текстового узла.

Например: если мой ответ:

<response>
<result start="0">
<doc>
  <int name="age">0</int> 
  <str name="continent">EU</str> 
  <str name="country">United Kingdom</str> 
  <float name="influence">7.0</float> 
  <int name="classified">0</int> 
  <date name="createdOnGMTDate">2011-10-12T08:11:07Z</date> 
  <int name="favCnt">41</int> 
  <long name="id">120493600</long> 
  <long name="inReplyToId">-1</long> 
  <str name="isBookmarked">False</str> 
  <str name="lang">english</str> 
  <str name="language">english.lm</str> 
  <int name="listedCnt">6</int> 
  <str name="name">john doe</str> 
  <str name="screenName">john_d</str> 
  <int name="sentiment">-1</int>
  <str name="timeZone">London</str> 
  <str name="Text">Yeah gee got flashed in the W.C.....</str> 
  <str name="usrCrtDate">2011-10-12 08:11:07</str> 
  </doc>
<result>
<response>

тогда я смог получить имена атрибутов, такие как континент, страна, но не значения его узлов ЕС, Великобритания соответственно.

Я думаю, что есть какая-то проблема в моем xsd или в сгенерированных классах. Пожалуйста, помогите.

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Ваша XML-схема должна выглядеть примерно так, чтобы захватить атрибут и текстовое значение:

  <xsd:complexType name="floatType">
    <xsd:simpleContent>
        <xsd:extension base="xsd:float">
            <xsd:attribute name="name" type="xsd:string" />
        </xsd:extension
    </xsd:simpleContent>
  </xsd:complexType>

Текстовый узел будет отображен в JAXB с помощью @XmlValue.Для получения дополнительной информации см .:

0 голосов
/ 20 октября 2011

Я не думаю, что ваш xml соответствует предоставленной вами схеме.

  <xsd:complexType name="strType">
    <xsd:attribute name="name" type="xsd:string" />
  </xsd:complexType>

Это не упоминает дочерний элемент. Я думаю, что вам нужно расширить базовые типы xsd (xsd: string и т. Д.) И добавить атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...