我们一般都知道如何用DOM去读取XML文件的内容, DOM读取XML文件的时候会把整个XML文件映射到一棵内存树,如果通过DOM API中修改了这棵XML内存树,并不会反映到原XML文件,我们要想把修改或运行期间创建的XML内容保存到磁盘系统,可以用Transformer来实现。下面代码演示了该如何编程
public class DOMTester {
public static void main(String[] args) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
updateDocument(db);//修改XML文档
newDocument(db);//创建新XML文档
} catch (Exception e) {
e.printStackTrace();
}
}
private static void updateDocument(DocumentBuilder db) throws SAXException, IOException {
Document doc = db.parse(DOMTester.class.getResourceAsStream("test.xml"));
Element root = doc.getDocumentElement();
root.setAttribute("name","chinajash");
Element catalog3 = doc.createElement("catalog");
catalog3.setAttribute("id","003");
catalog3.setTextContent("Music");
root.appendChild(catalog3);
writeXML(doc, "test.xml");
}
private static void newDocument(DocumentBuilder db) throws SAXException, IOException {
Document doc = db.newDocument();
Element root = doc.createElement("root");
doc.appendChild(root);
root.appendChild(doc.createElement("new"));
writeXML(doc, "new.xml");
}
private static void writeXML(Document doc, String file) {
try {
Transformer t = TransformerFactory.newInstance().newTransformer();
t.setOutputProperty("indent", "yes");
t.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(file)));
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
原test.xml的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<catalogs>
<catalog id="001">Book</catalog>
<catalog id="002">Video</catalog>
</catalogs>
上面程序修改了这个文件,运行后生成新的test.xml内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<catalogs name="chinajash">
<catalog id="001">Book</catalog>
<catalog id="002">Video</catalog>
<catalog id="003">Music</catalog>
</catalogs>
上面程序运行后新产生的new.xml内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<root>
<new />
</root>