简体   繁体   中英

Java XML Insert a parent node

I have the following xml

<Root>
    <Page>
        <Object ref="a"></Object>
        <Object ref="b"></Object>
    </Page>
</Root>

I want to convert into

<Root>
    <Page>
        <ObjectGroup ref="a">
            <Object ref="a"/>
        </ObjectGroup>
        <ObjectGroup ref="b">
            <Object ref="b"/>
        </ObjectGroup>
    </Page>
</Root>

Basically I want to introduce a new parent node. I used the below way but it's introducing more parents

 private static void loadRoots(String xMLPath) {
        Document doc = Migrate.initTreeOpFromString(xMLPath);
        Element rootElement = doc.getDocumentElement();
        loadPage(rootElement);
        Migrate.finishTreeOp(doc, "D:\\a.xml");
    }

    private static void loadPage(Element root) {
        NodeList pageNodes = root.getChildNodes();
        for (int j = 0; j < pageNodes.getLength(); j++) {
            Node pageNode = pageNodes.item(j);
            if (pageNode.getNodeType() == Node.ELEMENT_NODE) {
                loadObject((Element) pageNode);
            }
        }
    }

    private static void loadObject(Element pageNode) {
        NodeList objectNodes = pageNode.getChildNodes();
        for (int j = 0; j < objectNodes.getLength(); j++) {
            Node objectNode = objectNodes.item(j);
            if (objectNode.getNodeType() == Node.ELEMENT_NODE) {
                Element objGroup = pageNode.getOwnerDocument().createElement("ObjectGroup");
                String ref = objectNode.getAttributes().getNamedItem("ref").getTextContent();
                objGroup.setAttribute("ref", ref);
                pageNode.removeChild(objectNode);
                objGroup.appendChild(objectNode);
                pageNode.appendChild(objGroup);
            }
        }
    }

But the output for this is

<Root>
    <Page>
        <ObjectGroup ref="b">
            <Object ref="b"/>
        </ObjectGroup>
        <ObjectGroup ref="a">
            <ObjectGroup ref="a">
                <ObjectGroup ref="a">
                    <Object ref="a"/>
                </ObjectGroup>
            </ObjectGroup>
        </ObjectGroup>
    </Page>
</Root>

which is not what I wanted. How do I solve this

It's my mistake.I should have used insertBefore. That did the trick

private static void loadObject(Element pageNode) {
        NodeList objectNodes = pageNode.getChildNodes();
        for (int j = 0; j < objectNodes.getLength(); j++) {
            Node objectNode = objectNodes.item(j);
            if (objectNode.getNodeType() == Node.ELEMENT_NODE) {
                Element objGroup = pageNode.getOwnerDocument().createElement("ObjectGroup");
                String ref = objectNode.getAttributes().getNamedItem("ref").getTextContent();
                objGroup.setAttribute("ref", ref);
                pageNode.insertBefore(objGroup, objectNode);
                objGroup.appendChild(objectNode);
            }
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM