我在使用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>
答案 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();
}