DOM方式解析文件时,一次性加载文件,形成树结构,保留在内存中,方便修改。但当XML文件较大时,对内存的耗费比较大,容易影响性能并发生溢出。不管是解析文件还是生成文件,都要先创建Document对象。
public DocumentBuilder getDocumentBuilder() throws Exception{
//创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//创建一个DocumentBuilder的对象
DocumentBuilder db = dbf.newDocumentBuilder();
return db;
}
1、DOM方式解析XML
getElementsByTagName("name"); 获取name节点集合,返回NodeList
getAttributes(); 获取节点的所有属性,返回NamedNodeMap
getNodeName(); 获取节点、属性名
getNodeValue(); 获取节点、属性值
getChildNodes(); 获取子节点集合,返回NodeList
getTextContent(); 获取节点的文本内容
getNodeType(); 获取节点类型
public void parseXML()throws Exception{
DocumentBuilder db = getDocumentBuilder();
//导入org.w3c.dom下的Document对象
Document document = db.parse("books.xml");
//获取book节点的集合
NodeList booklist = document.getElementsByTagName("book");
//获取book节点
for(int i=0;i<booklist.getLength();i++){
System.out.println("-----以下是第"+(i+1)+"本书的内容------");
Node book = booklist.item(i);
NamedNodeMap attrs = book.getAttributes(); //获取节点的所有属性
System.out.println("第"+(i+1)+"本书有"+attrs.getLength()+"个属性");
for(int j=0;j<attrs.getLength();j++){
Node attr = attrs.item(j); //获取第j个节点属性
System.out.print("属性名:"+attr.getNodeName());//获取属性名
System.out.println("-->属性值:"+attr.getNodeValue());//获取属性值
}
//当已知book节点只有一个id属性的时候,可将book节点强制类型转换成Element类型
//Element book1 = (Element)booklist.item(i);
//通过getAttribute方法获取属性值
//System.out.println(book1.getAttribute("id"));
NodeList childNodes = book.getChildNodes();//获取book的子节点
for(int k=0;k<childNodes.getLength();k++){
//判断节点类型是元素节点,就输出节点名字和值
if(childNodes.item(k).getNodeType() == Node.ELEMENT_NODE){
System.out.print("子节点名:"+childNodes.item(k).getNodeName());
//元素节点若直接使用getNodeValue获取值将返回null,必须将值作为子节点,再获取值
//System.out.println("-->子节点值:"+childNodes.item(k).getFirstChild().getNodeValue());
//也可以直接用getTextContent方法,他将获取所有子节点的文本内容
System.out.println("-->子节点值:"+childNodes.item(k).getTextContent());
}
}
}
2、DOM方式生成XML
createElement("name"); 创建节点name
setAttribute("id", "1"); 给节点设置属性名为id、属性值为1
setTextContent("Java程序设计教程"); 设置节点的文本内容
appendChild(name1); 将子节点添加到节点中
除了常用的方法之外,还要创建Transformer对象,用于生成XML文档
public void createXML() throws Exception {
DocumentBuilder db = getDocumentBuilder();
Document document = db.newDocument();
document.setXmlStandalone(true);//xml文件的standalone为yes且不显示
Element bookstore = document.createElement("bookstore");//创建根节点bookstore
Element book1 = document.createElement("book");//创建子节点book
Element book2 = document.createElement("book");//创建子节点book
book1.setAttribute("id", "1");//给book设置属性名和属性值
book2.setAttribute("id", "2");//给book设置属性名和属性值
Element name1 = document.createElement("name");
Element name2 = document.createElement("name");
name1.setTextContent("Java程序设计教程");
name2.setTextContent("C语言程序设计");
book1.appendChild(name1);//将name添加到book节点中
book2.appendChild(name2);//将name添加到book节点中
bookstore.appendChild(book1);//将book节点添加到根节点中
bookstore.appendChild(book2);//将book节点添加到根节点中
document.appendChild(bookstore);//将根节点添加到DOM树中
//创建TransformerFactory对象
TransformerFactory tff = TransformerFactory.newInstance();
//创建Transformer对象
Transformer tf = tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT, "yes");//生成的XML文件标签会换行
tf.transform(new DOMSource(document), new StreamResult(new File("books1.xml")));
}
注:文章根据本站相关课程的学习笔记整理而来,有错误或其他任何问题敬请指正,欢迎共同学习交流!