Вставить дополнительный родительский элемент XML с помощью XOM - PullRequest
1 голос
/ 15 марта 2012

Со следующим XML:

<parent>
    <child>Stuff</child>
    <child>Stuff</child>
</parent>

Используя XPath, я запрашиваю дочерние элементы, и на основании некоторых условий я хочу добавить дополнительный родительский уровень над некоторыми из них:

<parent>
    <extraParent>
        <child>Stuff</child>
    </extraParent>
    <child>Stuff</child>
</parent>

Какой лучший способ сделать это?

Я думал что-то вроде следующего:

Nodes childNodes = parent.query("child");
for (int i = 0; i < childNodes.size(); i++) {
    Element currentChild = (Element) childNodes.get(i);
    if (someCondition) {
        ParentNode parent = currentChild.getParent();
        currentChild.detach();
        Element extraParent = new Element("extraParent");
        extraParent.appendChild(currentChild);
        parent.appendChild(extraParent);
    }
}

Но я хочу сохранить порядок.Возможно, это можно сделать с помощью parent.insertChild(child, position)?

Редактировать: Я думаю, что следующие работы, но мне любопытно, если у кого-то есть лучший способ:

Elements childElements = parent.getChildElements();
for (int i = 0; i < childElements.size(); i++) {
    Element currentChild = childElements.get(i);
    if (someCondition) {
        ParentNode parent = currentChild.getParent();
        currentChild.detach();
        Element extraParent = new Element("extraParent");
        extraParent.appendChild(currentChild);
        parent.insertChild(extraParent,i);
    }
}

Редактировать 2: Возможно, это лучше, так как позволяет смешивать другие элементы с дочерними элементами, которые вас не интересуют:

Nodes childNodes = parent.query("child");
for (int i = 0; i < childNodes.size(); i++) {
    Element currentChild = (Element) childNodes.get(i);
    if (someCondition) {
        ParentNode parent = currentChild.getParent();
        int currentIndex = parent.indexOf(currentChild);
        currentChild.detach();
        Element extraParent = new Element("extraParent");
        extraParent.appendChild(currentChild);
        parent.insertChild(extraParent,currentIndex);
    }
}

1 Ответ

1 голос
/ 16 марта 2012

Это, кажется, работает адекватно:

Nodes childNodes = parent.query("child");
for (int i = 0; i < childNodes.size(); i++) {
    Element currentChild = (Element) childNodes.get(i);
    if (someCondition) {
        ParentNode parent = currentChild.getParent();
        int currentIndex = parent.indexOf(currentChild);
        currentChild.detach();
        Element extraParent = new Element("extraParent");
        extraParent.appendChild(currentChild);
        parent.insertChild(extraParent,currentIndex);
    }
}
...