Java XML:在特定位置插入

问题描述 投票:0回答:1

我尝试在特定位置插入 XML 节点。

插入之前我有什么

<test>
  <person name="sam">1</person>
  <person name="tom">2</person>
  <person name="eva">3</person>
  <final>FINISHED</final>
</test>

我想要什么

<test>
  <person name="sam">1</person>
  <person name="tom">2</person>
  <person name="eva">3</person>
  <person name="NEW">4</person>    <!-- NEW insert BEFORE final -->
  <final>FINISHED</final>
</test>

我得到了什么

<test>
  <person name="sam">1</person>
  <person name="tom">2</person>
  <person name="eva">3</person>
  <final>FINISHED</final>
  <person name="NEW">4</person>
</test>

我的代码

import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.w3c.dom.Document;
import org.w3c.dom.Node;


public class Test {
    void foo () throws Exception
    {
        String xml = "<test>";
        xml += "<person name=\"sam\">1</person>";
        xml += "<person name=\"tom\">2</person>";
        xml += "<person name=\"eva\">3</person>";
        xml += "<final>FINISHED</final>";
        xml += "</test>";
        
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance ();
        dbf.setNamespaceAware (true);
        DocumentBuilder db = dbf.newDocumentBuilder ();
        Document doc = db.parse (new ByteArrayInputStream (xml.getBytes ()));   
        XPath xp = XmlHelper.createXPath ();
        
        Node n = (Node) xp.compile ("/test/person[@name='eva']").evaluate (doc, XPathConstants.NODE);
        
        Node newn = n.cloneNode (true);
        Node a = doc.createAttribute ("name");
        a.setNodeValue ("NEW");
        newn.getAttributes().setNamedItem (a);
        newn.setNodeValue ("4");
        n.getParentNode().appendChild (newn);
        
        TransformerFactory tf = TransformerFactory.newInstance ();
        Transformer tr = tf.newTransformer ();
        tr.setOutputProperty (OutputKeys.OMIT_XML_DECLARATION, "yes");
        StringWriter sw = new StringWriter ();
        tr.transform (new DOMSource (doc), new StreamResult (sw));
        String output = sw.getBuffer ().toString ();
        
        System.out.println (output);
        
    }
}

如何在最终元素之前让我的新人成为新人??

java xml dom
1个回答
0
投票

而不是

n.getParentNode().appendChild(newn);

你可以做

n.insertAfter(newn);
© www.soinside.com 2019 - 2024. All rights reserved.