DOM生成XML文档和解析XML文档
在内存中形成文档对象模型树可以反复操作该树形结构
<?xml version="1.0" encoding="UTF-8"?> <book-list> <book id="a"> <name>Java葵花宝典</name> <author>SUN</author> <price>50</price> </book> <book id="c"> <name>凤凰周刊</name> <author>凤凰</author> <price>30</price> </book> <book id="d"> <name>J.K.罗琳 </name> <author /> <price>80</price> </book> </book-list>
package dom;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DomParser {
public static void main(String[] args) {
//创建DOM解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
//得到Dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//得到XML文档路径
String path = DomParser.class.getClassLoader().getResource("books.xml").getPath();
//根据XML文档路径,获取给XML的文档的文档对象模型
Document doc = builder.parse(path);
//获取根元素
Element root = doc.getDocumentElement();
//遍历XML文档
iteratorElement(root);
//创建一个新的book元素, 并写入到books.xml文档中
createElement(root, doc, "src/books.xml");
System.out.println("**********************");
iteratorElement(root);
getByElementName(root);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 遍历ele下的所有元素,并输出其文本信息
* @param ele
*/
private static void iteratorElement(Element ele){
NodeList list = ele.getChildNodes();
for(int i = 0; i < list.getLength(); i++){
if(Element.ELEMENT_NODE == list.item(i).getNodeType()){
Element childEle = (Element) list.item(i);
if(childEle.hasAttributes()){
System.out.println("id = " + childEle.getAttribute("id"));
}else{
System.out.println(childEle.getTagName() + " = " + childEle.getTextContent());
if(childEle.getTagName().equals("price")){
System.out.println();
}
}
iteratorElement(childEle);
}
}
}
/**
* 创建一个新的book元素,并写入到XML文档中
* @param root
* @param doc
*/
private static void createElement(Element root, Document doc, String path){
//创建book元素
Element book = doc.createElement("book");
book.setAttribute("id", "d");
//创建name元素
Element name = doc.createElement("name");
name.setTextContent("哈利波特");
//创建author元素
Element author = doc.createElement("author");
name.setTextContent("J.K.罗琳 ");
//创建price元素
Element price = doc.createElement("price");
price.setTextContent("80");
//构建元素结构关系
book.appendChild(name);
book.appendChild(author);
book.appendChild(price);
root.appendChild(book);
TransformerFactory tf = TransformerFactory.newInstance();
try {
Transformer transformer = tf.newTransformer();
//设置格式
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
//将文档对象模型输出到XML文档中
transformer.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(path)));
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
/**
* 通过标记名获取元素节点
* @param root
*/
private static void getByElementName(Element root){
NodeList nodeList = root.getElementsByTagName("book");
for(int i= 0; i < nodeList.getLength(); i++){
Element ele = (Element)nodeList.item(i);
System.out.println(ele.getAttribute("id"));
}
}
}