java - 如何在现有的 xml 文件中插入新节点

标签 java xml parsing dom

谢谢! 我感兴趣如何在 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);

最佳答案

首先,使用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")));

    }

}

关于java - 如何在现有的 xml 文件中插入新节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32715796/

相关文章:

java - Spring-data-jpa - .save() 什么时候不返回相同的实体?

java - 无法在后端看到存储的数据(Parse.com)

Javascript正则表达式删除不匹配的结束HTML标签?

python - 使用 BeautifulSoup 组合文本输出

java - 如何重写空的while block

java - 使用 foreach 迭代 Collections 对象

c# - 从 XML 文件中读取元素

php - 使用 PHP 从数据库返回 xml 响应时将代码缩短为更少的行

javascript - js中将数组解析为无序列表

java - 在 Java 中编译多个类(控制台)