【问题标题】:How I can insert node at beginning xml file?如何在开始的 xml 文件中插入节点?
【发布时间】:2014-06-25 23:42:06
【问题描述】:

我需要将节点插入到我的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;
        }

    }

【问题讨论】:

  • 我认为您这样做只是为了澄清:您的意思是“开始”而不是“乞求”吗?
  • 当我插入新节点然后将节点添加到我的 xml 文件的开头
  • 据我所知,您目前没有在文档中插入a anywhere。您确定这是产生您现在显示的输出的代码吗?
  • 我以 a1 a2 为例,但它们都是 a

标签: java xml dom xml-parsing sax


【解决方案1】:

为什么不能使用 firstChild 方法,然后在之前插入?喜欢

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;
    }
}

【讨论】:

  • 谢谢你是救命稻草
【解决方案2】:

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

 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);

【讨论】:

  • 如果我所有的 XML "a" 不是 a1 和 a2 我怎么能得到第一个在它们之前插入。
  • 使用节点 a = doc.getElementsByTagName("a").item(0);第一个节点由 item(0) 标识,它将在此之前插入。
【解决方案3】:

要在 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多