Стратегия Jaxb для тестирования больших отображений документов - PullRequest
1 голос
/ 20 августа 2011

Мы работаем с Jaxb, чтобы разобрать большой глубоко вложенный документ. Xjc не будет работать со схемой, поэтому мы должны отобразить ее вручную. Любые предложения для тестирования стратегий здесь?

Я думаю, что я хотел бы написать тесты отображения для каждого вложенного класса, в идеале, с использованием небольших фрагментов XML, а не многих вариантов полных документов. Однако я не вижу, как это сделать из-за проблем с пространством имен. Это фрагмент, который я хотел бы проверить:

<responsibleParty>
    <gmd:individualName>
        <gco:CharacterString>Someones name</gco:CharacterString>
    </gmd:individualName>
</responsibleParty>

Я не вижу много способов сделать это. Любые предложения для стратегий здесь?

Спасибо!

1 Ответ

1 голос
/ 22 августа 2011

Если проблема, которую вы видите, связана с тем, что вложенные классы имеют то же имя, что и родительские классы, по предоставленной вами ссылке:

ТогдаВы можете обойти эту проблему, используя внешний файл привязок:

recursive.xml

Файл привязки позволяет переименовывать вложенные классы, чтобы избежать конфликта имен.

<jaxb:bindings 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jaxb:bindings schemaLocation="recursive.xsd">
        <jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType">
            <jaxb:class name="Topic2"/>
        </jaxb:bindings>
        <jaxb:bindings node="/xsd:schema/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType/xsd:sequence/xsd:element[@name='topic']/xsd:complexType">
            <jaxb:class name="Topic3"/>
        </jaxb:bindings>
    </jaxb:bindings>
</jaxb:bindings>

recursive.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="topic">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="topic" minOccurs="1" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="topic" minOccurs="1" maxOccurs="1">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="topic" minOccurs="0" maxOccurs="unbounded" type="xs:string"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

вызов XJC

Файл привязки указан в вызове XJC:

xjc -d out -b recursive.xml recursive.xsd

Тема (Генерируемый класс)

package generated;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "topic"
})
@XmlRootElement(name = "topic")
public class Topic {

    @XmlElement(required = true)
    protected Topic.Topic2 topic;

    public Topic.Topic2 getTopic() {
        return topic;
    }

    public void setTopic(Topic.Topic2 value) {
        this.topic = value;
    }

    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "topic"
    })
    public static class Topic2 {

        @XmlElement(required = true)
        protected Topic.Topic2 .Topic3 topic;

        public Topic.Topic2 .Topic3 getTopic() {
            return topic;
        }

        public void setTopic(Topic.Topic2 .Topic3 value) {
            this.topic = value;
        }

        @XmlAccessorType(XmlAccessType.FIELD)
        @XmlType(name = "", propOrder = {
            "topic"
        })
        public static class Topic3 {

            protected List<String> topic;

            public List<String> getTopic() {
                if (topic == null) {
                    topic = new ArrayList<String>();
                }
                return this.topic;
            }

        }

    }

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