Маршал Java JAXB в документ DOM - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть аннотации JAXB:

@XmlElement(name="String")
private String string = "one";

@XmlElement(name="ArrayOne")
private ArrayList<String> array1 = new ArrayList<String>();

и сортировка:

array.add("Just one");
JAXBContext jc1 = JAXBContext.newInstance( getClass() );
Marshaller marshaller = jc1.createMarshaller();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ; 
Document doc = factory.newDocumentBuilder().newDocument();
marshaller.marshal(this, doc);

Если я копаюсь в узлах документа, я не вижу никакой разницы между элементы узла. Мой вопрос, если есть какой-нибудь трюк, как сделать маршалл в документе DOM что элементы узла будут как-то различны, будь то простой объект (String), или массив объектов. Маршаллер, конечно, знает о типах полей, поэтому мне интересно, если он устанавливает какой-либо флаг в элемент данных.

Структура DOM

NodeName:String     NodeContent:one
NodeName:ArrayOne   NodeContent:Just one

но я бы хотел, чтобы:

NodeName:String     NodeContent:one
NodeName:ArrayOne
    Children:
    NodeName:ArrayOne   NodeContent:Just one

так что я знаю, ArrayOne - это массив, независимо от одного объекта.

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

1 Ответ

0 голосов
/ 02 ноября 2018

Вы можете создать элемент-оболочку для коллекций, используя @ XmlElementWrapper :

@XmlElement(name="String")
private String string = "one";

@XmlElementWrapper(name="ArrayOne")
private ArrayList<String> array1 = new ArrayList<String>();

Вывод XML для этого отображения выглядит следующим образом:

<testElement>
    <String>one</String>
    <ArrayOne>
        <array1>one</array1>
    </ArrayOne>
</testElement>

Обновление для комментария : Добавление оболочки в DOM Document вручную (возможно, есть более простой способ, например, с использованием Transformer):

TestElement te = new TestElement();

JAXBContext jc1 = JAXBContext.newInstance(TestElement.class);
Marshaller marshaller = jc1.createMarshaller();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
Document doc = factory.newDocumentBuilder().newDocument();
marshaller.marshal(te, doc);

NodeList nodeList = doc.getDocumentElement().getChildNodes();
Node newNode = doc.createElement("ArrayOneWrapper");
List<Node> arrayOneElements = new ArrayList<>();

for (int i = 0; i < nodeList.getLength(); i++) {
    Node n = nodeList.item(i);

    if (n.getNodeName().equals("ArrayOne")) {
        arrayOneElements.add(n);
    }
}
for (Node n : arrayOneElements) {
    newNode.appendChild(n);
}

Вывод XML:

<testElement>
    <String>one</String>
    <ArrayOneWrapper>
        <ArrayOne>one</ArrayOne>
        <ArrayOne>two</ArrayOne>
    </ArrayOneWrapper>
</testElement>
...