import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
/**
* 使用DOM解析XML文件
* @author admin
*
*/
public class Main {
public static void main(String[] args) {
//创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//创建DocumentBuilder的对象
DocumentBuilder db = dbf.newDocumentBuilder();
//通过DocumentBuilder的对象的parse方法加载book.xml到当前目录下
Document document = db.parse("demo/book.xml");
//获取所有的book节点的集合
NodeList bookList = document.getElementsByTagName("book");
//通过NodeList的getLength()方法获取bookList的长度
System.out.println("一共有:"+bookList.getLength()+"本书");
for(int i=0;i<bookList.getLength();i++){
System.out.println("下面开始遍历第"+(i+1)+"本书的内容");
//通过item(i)获取获取一个book节点
Node book = bookList.item(i);
//获取book节点的所有属性的集合
NamedNodeMap attrs = book.getAttributes();
System.out.println("第"+(i+1)+"本书共有"+attrs.getLength()+"个属性");
//遍历book的属性
for(int j=0;j<attrs.getLength();j++){
//通过item(index)方法获取book节点的某个属性
Node attr = attrs.item(j);
//获取属性名
System.out.print("属性名:"+attr.getNodeName()+",");
//获取属性值
System.out.println("属性值:"+attr.getNodeValue());
}
/*
* 在知道book的属性值的情况下可以用以下方法遍历,并且有且只有一个id属性
* 将book节点进行强制类型转换为Element类型
Element book = (Element) bookList.item(i);
String attrValue = book.getAttribute("id");
System.out.println("id的属性值为"+attrValue);
*/
//解析book节点的子节点
NodeList childNodes = book.getChildNodes();
//遍历childNodes获取每个节点的节点名和节点值
System.out.println("第"+(i+1)+"本书有"+childNodes.getLength()+"个子节点");
for(int k=0;k<childNodes.getLength();k++){
//区分出text类型的node以及element类型的node
if(childNodes.item(k).getNodeType()==Node.ELEMENT_NODE){
//获取了element类型节点的节点名
System.out.print("节点名:"+childNodes.item(k).getNodeName()+",");
//System.out.println("节点值:"+childNodes.item(k).getFirstChild().getNodeValue());
System.out.println("节点值:"+childNodes.item(k).getFirstChild().getTextContent());
}
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
book.xml结构
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book id="1">
<name>安徒生童话</name>
<author>安徒生</author>
<year>2016</year>
<page>521</page>
</book>
<book id="2">
<name>名侦探柯南</name>
<author>青山刚昌</author>
<year>1996</year>
<page>5412</page>
</book>
</bookstore>
输出结果
-
一共有:2本书
-
下面开始遍历第1本书的内容
-
第1本书共有1个属性
-
属性名:id,属性值:1
-
第1本书有9个子节点
-
节点名:name,节点值:安徒生童话
-
节点名:author,节点值:安徒生
-
节点名:year,节点值:2016
-
节点名:page,节点值:521
-
下面开始遍历第2本书的内容
-
第2本书共有1个属性
-
属性名:id,属性值:2
-
第2本书有9个子节点
-
节点名:name,节点值:名侦探柯南
-
节点名:author,节点值:青山刚昌
-
节点名:year,节点值:1996
-
节点名:page,节点值:5412