我如何在开始的xml文件中插入节点?

时间:2014-05-08 14:07:11

标签: java xml dom xml-parsing sax

我需要在我的XML文件的开头插入节点,在网上搜索后我找到了关键字insertBefore,但我无法在我的代码中应用此关键字。但是,当我使用appendChild,然后插入this关键字时,元素会被插入到xml文件的末尾。如何使用insertBefore关键字插入到xml树的开头。
例如:

   <n>
        <a2>
         <b></b> <c></c>
        </a2>

        <a1>
         <b></b> <c></c>
        </a1>
    </n>

我需要在xml文件的开头插入元素:

<n>
    <a1>
     <b></b> <c></c>
    </a1> 

    <a2>
     <b></b> <c></c>
    </a2>
</n>

我的java代码:

public void insertNewProject(Project entity) {
        String filePath = "location.xml";
        File xmlFile = new File(filePath);
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder;
        try {
            dBuilder = dbFactory.newDocumentBuilder();
            Document doc;

            doc = dBuilder.parse(xmlFile);

            doc.getDocumentElement().normalize();

            Node n = doc.getElementsByTagName("n").item(0);

            Element a = doc.createElement("a");
            n.appendChild(a);

            Element b = doc.createElement("b");
            b.appendChild(doc.createTextNode(entity.getLocation()));
            a.appendChild(b);

            Element c = doc.createElement("c");
            c.appendChild(doc.createTextNode(entity.getName()));
            a.appendChild(c);

            doc.getDocumentElement().normalize();

            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource domSource = new DOMSource(doc);
            StreamResult streamResult = new StreamResult(new File("location.xml"));
            transformer.transform(domSource, streamResult);

        } catch (ParserConfigurationException pce) {
            return;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (TransformerException tfe) {
            return;
        }

    }

3 个答案:

答案 0 :(得分:2)

为什么你不能使用第一个Child方法然后插入?像

n.insertBefore(a, n.getFirstChild());

完整代码

public void insertNewProject(Project entity) {
    String filePath = "location.xml";
    File xmlFile = new File(filePath);
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder;
    try {
        dBuilder = dbFactory.newDocumentBuilder();
        Document doc;

        doc = dBuilder.parse(xmlFile);

        doc.getDocumentElement().normalize();

        Node n = doc.getElementsByTagName("n").item(0);

        Element a = doc.createElement("a");
        n.insertBefore(a, n.getFirstChild());

        Element b = doc.createElement("b");
        b.appendChild(doc.createTextNode(entity.getLocation()));
        a.appendChild(b);

        Element c = doc.createElement("c");
        c.appendChild(doc.createTextNode(entity.getName()));
        a.appendChild(c);

        doc.getDocumentElement().normalize();

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource domSource = new DOMSource(doc);
        StreamResult streamResult = new StreamResult(new File("location.xml"));
        transformer.transform(domSource, streamResult);

    } catch (ParserConfigurationException pce) {
        return;
    } catch (IOException e) {
        e.printStackTrace();
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (TransformerException tfe) {
        return;
    }
}

答案 1 :(得分:0)

我在代码中更改了以下部分。 请检查这是否是您要找的?

 Node n = doc.getElementsByTagName("n").item(0);
        Element a = doc.createElement("a");

        Node a2 = doc.getElementsByTagName("a2").item(0);
        n.insertBefore(a, a2);//.appendChild(a);

答案 2 :(得分:0)

要在start中插入元素,您需要知道什么是第一个元素。然后,您可以通过跟踪代码中的更改

来插入节点
doc = dBuilder.parse(xmlFile);
doc.getDocumentElement().normalize();        
NodeList nlist = doc.getElementsByTagName("a2");            

Node n = doc.getElementsByTagName("n").item(0);
Node a1 = nlist.item(0);
Element a = doc.createElement("a");
n.insertBefore(a, a1);