解析步骤
- 获取DocumentBuilderFatory工厂类的实例对象;
- 获取DocumentBuilder类的实例对象;
- 加载指定xml文档,获取Document对象;
- 通过标签名获取指定element节点集合;
- 遍历element节点集合
a)获取该element集合中每个节点的属性名,属性值;
b) 获取该element集合中的每个节点的孩子节点集合;
c)遍历该孩子节点集合,获取其中每个孩子节点的属性名、属性值和内容。
常用API
No | 类名 | 方法 | 方法描述 |
---|---|---|---|
1 | DocumentBuilderFactory | newInstance() | 创建DocumentBuilderFactory实例对象 |
2 | DocumentBuilderFactory | newDocumentBuilder() | 创建DocumentBuilder类实例对象 |
3 | DocumentBuilder | parse(String filePath) | 将指定xml文件加载到Document |
4 | Document | getElementsByTagName(String tagName) | 通过标签名获取节点集合 |
5 | NodeList | getLength() | 获取节点集合中节点Node的个数 |
6 | NodeList | item(int index) | 根据索引获取集合中的一个节点Node |
7 | Node | getNodeName() | 获取节点名称 |
8 | Node | getNodeValue() | 获取节点值 |
9 | Node | getAttributes() | 获取节点的所有属性集合 |
10 | Node | getTextContent() | 获取element的内容 |
11 | NodeNameMap | item(int index) | 根据索引获取集合中的一个节点Node |
注: Node是NodeList和NodeNameMap集合的基本元素
常用节点类型
节点类型 | NodeType | Named Constant | nodeName的返回值 | nodeValue的返回值 |
---|---|---|---|---|
Element | 1 | ELEMENT_NODE | element name | null |
Attr | 2 | ATTRIBUTE_NODE | 属性名称 | 属性值 |
text | 3 | TEXT_NODE | text | 节点内容 |
注:根据以上的信息,可以发现
使用getNodeValue()方法获取Element的节点值返回结果是null
取得element节点值得方法有两种,例如获取如下element节点的值:
<name>冰与火之歌</name>
- 冰与火之歌是<name>的子节点,所以先使用getFirstChildNode()方法获取name的子节点,然后使用getNodeValue()方法获取该值;
Node node = nameNode.getFirstChild();
String value = node.getNodeValue();
- 使用方法getTextContent()方法直接获取该值
String value = nameNode.getTextContent();
但是此方法需要注意的是:
此方法会将<name>和</name>之间的内容全部直接作为值返回,若<name>和</name>直接还有其他的element,也不会被解析
例如:
<name><age>10</age>乔治马丁</name>
使用此方法后,会直接返回”<age>10</age>乔治马丁”
待解析的xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<bookstore>
<book id = "1">
<name>冰与火之歌</name>
<author>乔治马丁</author>
<year>2014</year>
<price>89</price>
</book>
<book id = "2">
<name>安徒生童话</name>
<year>2004</year>
<price>77</price>
<language>English</language>
</book>
</bookstore>
book的结构
package XML;
/**
* Created by lin_y on 2017/6/18.
*/
public class Book {
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
private String name;
private String author;
private String year;
private double price;
private String language;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
@Override
public String toString() {
return "Book{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", author='" + author + '\'' +
", year='" + year + '\'' +
", price=" + price +
", language='" + language + '\'' +
'}';
}
}
解析代码
package XML;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by lin_y on 2017/6/18.
*/
// 使用DOM完成对XML文件的解析操作
public class XMLDom {
public static void main(String [] args){
// 存储多本书的内容
List<Book> list = new ArrayList<Book>();
// 1. 创建DocumentBuilderFactory对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 2. 创建DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
// 3. 通过parse方法将指定的XML文件载入本地工程项目
Document document = db.parse("xml/book.xml");
// 获取所有book节点的集合
NodeList bookList = document.getElementsByTagName("book");
// 遍历book节点的集合,取出每本书的信息,并存入链表中
for(int i =0 ; i < bookList.getLength(); i++){
Book b = new Book();
// 获取一本书的信息
Node book = bookList.item(i);
// 获取book节点中的属性信息
NamedNodeMap attrs = book.getAttributes();
for(int j = 0; j < attrs.getLength(); j++){
Node attr = attrs.item(j);
String tagName = attr.getNodeName();
switch(tagName){
case "id":
b.setId(attr.getNodeValue());
break;
}
}
// 获取book节点的子节点集合
NodeList childNodes = book.getChildNodes();
for(int j = 0; j < childNodes.getLength(); j++) {
// 区分text类型的Node和element类型的Node
if(childNodes.item(j).getNodeType() == Node.ELEMENT_NODE){
Node childNode = childNodes.item(j);
String tagName = childNode.getNodeName();
switch(tagName){
case "author":
b.setAuthor(childNode.getTextContent());
break;
case "name":
b.setName(childNode.getTextContent());
break;
case "year":
b.setYear(childNode.getTextContent());
break;
case "price":
b.setPrice(Double.parseDouble(childNode.getTextContent()));
break;
case "language":
b.setLanguage(childNode.getTextContent());
break;
}
}
}
list.add(b);
}
} catch (Exception e) {
e.printStackTrace();
}
Iterator e = list.iterator();
while(e.hasNext()){
System.out.println(e.next().toString());
}
}
}
程序运行结果