2015-09-22 8 views
0

Greatings! Im intrest, как я могу сделать pasre и вставить новый узел в xml. Например, мы имеемКак вставить новый узел в существующий xml-файл

<UserCards> 
    <UserCard userCardId="ADC"> 
     <userName>nameONE</userName> 
     <userSurname>surnameONE</userSurname> 
     <userAge>25</userAge> 
     <userAdress>adressONE</userAdress> 
     <userPhone>297718535</userPhone> 
    </UserCard> 
     <UserCard userCardId="AC6"> 
      <userName>nameTWO</userName> 
      <userSurname>surnameTWO</userSurname> 
      <userAge>17</userAge> 
      <userAdress>adressTWO</userAdress> 
      <userPhone>557778899</userPhone> 
    </UserCard> 
</UserCards> 

И нам нужно разобрать его и найти пользователя с == «userPhone» 557778899 и вставить в этой карточной newNode и получить

</UserCard> 
    <UserCard userCardId="AC6"> 
    <userName>nameTWO</userName> 
    <userSurname>surnameTWO</userSurname> 
    <userAge>17</userAge> 
    <userAdress>adressTWO</userAdress> 
    <userPhone>557778899</userPhone> 
    <newNode>value</newNode> 
</UserCard> 

я пытался к ней, как это ничего не получило

 File fXmlFile = new File("Test/UserCards.xml"); 
       DocumentBuilderFactory dbFactory =     DocumentBuilderFactory.newInstance(); 
       DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
       Document doc = dBuilder.parse(fXmlFile); 

       doc.getDocumentElement().normalize(); 


       Element root = doc.getDocumentElement(); 

       NodeList nList = doc.getElementsByTagName("UserCard"); 

       for (int temp = 0; temp < nList.getLength(); temp++) { 
        Node node = nList.item(temp); 

        if (node.getNodeType() == Node.ELEMENT_NODE) { 

         Element eElement = (Element) node; 
//here im trying to find userPhone == 557778899 
         if (userPhone.equals(eElement.getElementsByTagName("userPhone").item(0).getTextContent())) { 
    //this part does not work it was one of my try 
          NodeList nl = doc.getElementsByTagName("UserCards"); 
          Element newNode= doc.createElement("newNode"); 
          newNode.appendChild(doc.createTextNode("hello")); 
          eElement.appendChild(newNode); 
+0

Решена ли ваша проблема? Есть что-то еще, что вам нужно? – lscoughlin

ответ

1

Во-первых, используйте xpath, чтобы найти свой узел. Вы на правильном пути с createElement, но вы можете просто использовать setTextContent. Вот полный пример. Кроме того, я довольно печатаю ваш XML - потому что могу.

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.OutputStreamWriter; 
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 javax.xml.xpath.XPathFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 

public class Example { 

    public static void main(String... args) throws Exception { 

     FileInputStream fileInputStream = new FileInputStream("UserCards.xml"); 
     DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 

     Document document = documentBuilder.parse(fileInputStream); 

     XPathFactory xPathFactory = XPathFactory.newInstance(); 
     XPath xPath = xPathFactory.newXPath(); 

     Node node = (Node) xPath 
       .evaluate("//UserCard[userPhone/text()='557778899']", document.getDocumentElement(), XPathConstants.NODE); 

     Node newNode = node.appendChild(document.createElement("newNode")); 
     newNode.setTextContent("value"); 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer transformer = tf.newTransformer(); 
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); 
     transformer.setOutputProperty(OutputKeys.METHOD, "xml"); 
     transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
     transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 
     transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 

     transformer.transform(new DOMSource(document), 
       new StreamResult(new OutputStreamWriter(new FileOutputStream("UserCards2.xml"), "UTF-8"))); 

    } 

} 
Смежные вопросы