при демаршалинге из схемы порядок последовательности имеет значение в jaxb - PullRequest
2 голосов
/ 06 марта 2010

У меня есть эта схема:

<xs:complexType name="foo">
  <xs:sequence>
    <xs:element name="oneBar" type="xs:string" minOccurs="0"/>
    <xs:element name="twoBar" type="xs:string" minOccurs="0"/>
  </xs:sequence>
</xs:complexType>

Когда я пытаюсь разобрать это

<foo>
  <oneBar>1</oneBar>
  <twoBar>2</twoBar>
</foo>

это работает но когда я пытаюсь разобрать этот xml:

<foo>
   <twoBar>2</twoBar>
   <oneBar>1</oneBar>
</foo>

Я получаю превосходство, потому что он заботится о заказе Если я пытаюсь разархивировать тот же XML без использования схемы, это работает в обоих случаях Есть идеи?

Как указал Strawberry, если вы замените последовательность xs: на sc: любой порядок не имеет значения, знает ли кто-нибудь из вас, какую аннотацию мне нужно поместить в мой класс, чтобы он генерировал xs: any schmea

Нашел решение, создав класс из схемы xs: any. Вам просто нужно аннотировать свой класс с помощью XmlType и установить порядок поддержки равным нулю, см .:

@XmlRootElement
@XmlType(name="foo",propOrder={})
public class Foo {
    @XmlElement
    public String oneBar; 
    @XmlElement
    public String twoBar;
} 

1 Ответ

5 голосов
/ 06 марта 2010

Последовательность требует, чтобы элементы были в порядке, например. от w3schools страница: -

Показатель указывает что дочерние элементы должны появляться в конкретный заказ:

При демаршаллинге без схемы вы фактически не проверяете XML.

Если вы хотите, чтобы ваша схема НЕ требовала определенного упорядочения, то для этого необходимо следующее: -

<xs:complexType name="foo">
  <xs:all>
    <xs:element name="oneBar" type="xs:string" minOccurs="0"/>
    <xs:element name="twoBar" type="xs:string" minOccurs="0"/>
  </xs:all>
</xs:complexType>

Подход к нему с точки зрения аннотации Java. Если у меня есть класс с именем Test с двумя строковыми полями test1 и test2, аннотации будут: -

упорядоченный кейс, например используя <sequence>

@XmlType(name="",propOrder={"test1","test2"})
@XmlRootElement(name="test")
public class Test
{
   @XmlElement(required=true)
   private String test1;
   @XmlElement(required=true)
   private String test2;
}

Неупорядоченный чемодан, например используя <all>

@XmlType(name="",propOrder={})
@XmlRootElement(name="test")
public class Test
{
   @XmlElement(required=true)
   private String test1;
   @XmlElement(required=true)
   private String test2;
}
...