0

Greatings! Im intrest how can I pasre and insert new node in xml. For example we have

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

And we need to parse it and find user with a 'userPhone' == 557778899 and insert in this card newNode and get

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

i was trying to to it like this but got nothing

     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);
1
  • Is your issue solved? Is there anything else you need? Commented Sep 23, 2015 at 9:30

1 Answer 1

1

Firstly, use xpath to find your node. You're on the right track with createElement, but you can just use setTextContent. Here's a full example. Also, I pretty print your XML -- because I can.

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

    }

}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.