Использование JAXB для демаршаллинга элементов с переменными / динамическими именами - PullRequest
7 голосов
/ 07 мая 2009

Я анализирую XML-документ с узлами, подобными следующим:

<objects>
  <dog>
    <data1>...</data1>
    <data2>...</data2>
    <data3>...</data3>
  </dog>
  <cat>
    <data1>...</data1>
    <data2>...</data2>
    <data3>...</data3>
  </cat>
</objects>

Элементы data1, data2, data3 всегда согласованы. Меняется только родительский тег. В моей объектной модели у меня есть один объект, который представляет все эти случаи. Как я могу заставить JAXB обработать этот случай, не зная заранее имя элемента?

@ XMLAnyElement сопоставляет все объекты, но не создает объект соответствующего типа; Я получаю список объектов Node вместо моего объекта. Мой объект в настоящее время выглядит примерно так:

public class MyObject {
    protected String otherData;

    @XmlAnyElement
    @XmlElementWrapper(name = "objects")
    protected List<MyChildObject> childObjects;
}

public class MyChildObject {
    protected String data1;
    protected String data2;
    protected String data3;
}

Есть идеи, как справиться с этим делом, кроме изменения входящего формата XML для использования <object type="dog"> элементов?

Ответы [ 2 ]

7 голосов
/ 07 мая 2009

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

@XmlMixed
@XmlAnyElement
public List<Object> getObjects() {
    return objects;
}

Это приведет к тому, что элемент будет просто элементом DOM. Затем вы можете использовать JAXB во второй раз, чтобы перейти от каждого элемента к вашему пользовательскому типу.

Это было бы, если бы вам пришлось использовать JAXB. Возможно, вам будет проще использовать API-интерфейсы SAX или DOM напрямую для таких данных. JAXB действительно предназначен для четко определенных данных, которые могут быть представлены в виде схемы.

0 голосов
/ 07 мая 2009

Вы можете использовать наследование:

@XmlRootElement(name = "dog")
public class MyDogObject extends MyChildObject {
    //nothing here
}

@XmlRootElement(name = "cat")
public class MyCatObject extends MyChildObject {
    //nothing here
}

Таким образом, он позволяет вам иметь дело с тем же типом объекта, MyChildObject, но гибко управлять структурой XML. Еще одно преимущество заключается в том, что в будущем вы должны будете определить конкретные XML-узлы типа «собака / кошка» - они могут быть отображены на этот соответствующий подкласс, но не на другие, как ожидалось.

...