我需要使用Java中的DOM将元素添加到xml文件中

时间:2014-03-08 16:27:15

标签: java xml dom

我在使用Java中的DOM

将元素添加到我的xml文件时遇到了问题

我知道有很多类似问题的解决方案,但我没有成功让他们为我工作,任何帮助将不胜感激。谢谢男人和女孩!

我目前添加新元素的方法

public static void createEntryXmlFile () {
  try{
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(new File(FILE)); 


        NodeList nodes = document.getElementsByTagName("CATALOG");


        // cd elements
        Element cd = document.createElement("CD");


        // title elements
        Element title = document.createElement("TITLE");
        title.appendChild(document.createTextNode("TITLE")); 
        cd.appendChild(title);

        // artist elements
        Element artist = document.createElement("ARTIST");
        artist.appendChild(document.createTextNode("ARTIST")); 
        cd.appendChild(artist);

        // company elements
        Element company  = document.createElement("COMPANY");
        company.appendChild(document.createTextNode("COMPANY")); 
        cd.appendChild(company);

        // country elements
        Element country = document.createElement("COUNTRY");
        country.appendChild(document.createTextNode("COUNTRY")); 
        cd.appendChild(country);

        // price elements
        Element price = document.createElement("PRICE");
        price.appendChild(document.createTextNode("PRICE")); 
        cd.appendChild(price);

        // year elements
        Element year = document.createElement("YEAR");
        year.appendChild(document.createTextNode("YEAR")); 
        cd.appendChild(year);

        Node n = (Element) cd;
        nodes.item(0).appendChild(cd);


  } catch (ParserConfigurationException | SAXException | IOException e) {
        System.out.println(e);
    }
}

XML文件的副本

<CATALOG>
  <CD>
    <TITLE>Empire Burlesque</TITLE>
    <ARTIST>Bob Dylan</ARTIST>
    <COUNTRY>USA</COUNTRY>
    <COMPANY>Columbia</COMPANY>
    <PRICE>10.90</PRICE>
    <YEAR>1985</YEAR>
  </CD>
  <CD>
    <TITLE>Hide your heart</TITLE>
    <ARTIST>Bonnie Tyler</ARTIST>
    <COUNTRY>UK</COUNTRY>
    <COMPANY>CBS Records</COMPANY>
    <PRICE>9.90</PRICE>
    <YEAR>1988</YEAR>
  </CD>
</CATALOG>

2 个答案:

答案 0 :(得分:2)

您展示的代码会将现有XML文件解析为内存中的DOM树,然后对该树进行更改,但修改内存中的树不会影响磁盘上的文件,您需要显式写入退出自己。

这两种最常见的方法是从DOMSource到StreamResult的无操作Transformer,或者通过将document.getImplementation()强制转换为{{{}来使用DOM“加载和存储”API 1}}。由于Transformer方法使用XSLT基础结构,因此可能不能很好地处理非命名空间感知的DOM树,例如您正在使用(DOMImplementationLS默认情况下不支持名称空间,您有在你调用DocumentBuilderFactory之前显式配置它,但LS方法肯定是好的,因为它完全是DOM库的一部分,它不涉及转换层。

答案 1 :(得分:1)

在DOM操作语句之后添加以下代码,以便将更改写入FILE:

TransformerFactory transformerFactory = TransformerFactory.newInstance();
try {
    Transformer transformer = transformerFactory.newTransformer();
    transformer.transform(new DOMSource(document), new StreamResult(new File(FILE)));
} catch (TransformerConfigurationException e) {
    e.printStackTrace();
} catch(TransformerException e) {
    e.printStackTrace();
}