我尝试在特定位置插入 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);
}
}
如何在最终元素之前让我的新人成为新人??
而不是
n.getParentNode().appendChild(newn);
你可以做
n.insertAfter(newn);