2010-07-14 90 views
12

这里某些元素之前,如何插入元素插入XML /后是我的代码,也许你会马上什么我缺少发现:在Java

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document doc = builder.parse(fileName)); 

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 
XPathExpression expr = xpath.compile("//CustomerId"); 

Object result = expr.evaluate(doc, XPathConstants.NODESET); 
Nodelist nodes = (NodeList) result; 
Text a = doc.createTextNode("value"); 
Element p = doc.createElement("newNode"); 
p.appendChild(a); 

for (int i = 0; i < nodes.getLength(); i++) { 
    nodes.item(i).insertBefore(p, nodes.item(i)); 
} 

我试图插入新节点( CustomerId现有节点之前)。下面是我的XML样本文件:

<Customer> 
    <names> 
     <firstName>fName</firstName> 
     <lastName>lName</lastName> 
     <middleName>nName</middleName> 
     <nickName/> 
    </names> 
    <addressList> 
     <address> 
      <streetInfo> 
       <houseNumber>22</houseNumber> 
       <baseName>Street base name</baseName> 
       <district>kewl district</district> 
      </streetInfo> 
      <zipcode>22231</zipcode> 
      <state>xxx</state> 
      <country>xxxz</country> 
      <primary>true</primary> 
     </address> 
    </addressList> 
    <CustomerId/> 
    <SSN>561381</SSN> 
    <phone> 
     <homePhone>123123123</homePhone> 
     <officePhone/> 
     <homePhone>21319414</homePhone> 
    </phone> 
    <preferred>true</preferred> 
</Customer> 

这是越来越抛出我不知道还有什么尝试一个例外:

NOT_FOUND_ERR:试图以 参考的一个节点发上下文 不存在。

回答

27

在这里,我只是用你提供的XML样本测试的例子。

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); 
domFactory.setIgnoringComments(true); 
DocumentBuilder builder = domFactory.newDocumentBuilder(); 
Document doc = builder.parse(new File("XmlTest.xml")); 

NodeList nodes = doc.getElementsByTagName("CustomerId"); 

Text a = doc.createTextNode("value"); 
Element p = doc.createElement("newNode"); 
p.appendChild(a); 

nodes.item(0).getParentNode().insertBefore(p, nodes.item(0)); 

下面是结果:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Customer> 
    <names> 
     <firstName>fName</firstName> 
     <lastName>lName</lastName> 
     <middleName>nName</middleName> 
     <nickName/> 
     </names> 
    <addressList> 
     <address> 
      <streetInfo> 
       <houseNumber>22</houseNumber> 
       <baseName>Street base name</baseName> 
       <district>kewl district</district> 
       </streetInfo> 
      <zipcode>22231</zipcode> 
      <state>xxx</state> 
      <country>xxxz</country> 
      <primary>true</primary> 
      </address> 
     </addressList> 
    <newNode>value</newNode> 
<CustomerId/> 
    <SSN>561381</SSN> 
    <phone> 
     <homePhone>123123123</homePhone> 
     <officePhone/> 
     <homePhone>21319414</homePhone> 
     </phone> 
    <preferred>true</preferred> 
</Customer> 

如果你有兴趣,这里是我用来显示结果的示例代码:

Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 

StreamResult result = new StreamResult(new StringWriter()); 
DOMSource source = new DOMSource(doc); 
transformer.transform(source, result); 

String xmlOutput = result.getWriter().toString(); 
System.out.println(xmlOutput); 
+0

帮助... .. !!! – 2015-04-28 06:27:58

5

我想你想插入到父母,而不是孩子:

nodes.item(i).getParentNode().insertBefore(p, nodes.item(i));