您的位置:首页 > 其它

XML文档解析之DOM解析

2017-06-19 10:40 232 查看

解析步骤

获取DocumentBuilderFatory工厂类的实例对象;

获取DocumentBuilder类的实例对象;

加载指定xml文档,获取Document对象;

通过标签名获取指定element节点集合;

遍历element节点集合

a)获取该element集合中每个节点的属性名,属性值;

b) 获取该element集合中的每个节点的孩子节点集合;

c)遍历该孩子节点集合,获取其中每个孩子节点的属性名、属性值和内容。

常用API

No类名方法方法描述
1DocumentBuilderFactorynewInstance()创建DocumentBuilderFactory实例对象
2DocumentBuilderFactorynewDocumentBuilder()创建DocumentBuilder类实例对象
3DocumentBuilderparse(String filePath)将指定xml文件加载到Document
4DocumentgetElementsByTagName(String tagName)通过标签名获取节点集合
5NodeListgetLength()获取节点集合中节点Node的个数
6NodeListitem(int index)根据索引获取集合中的一个节点Node
7NodegetNodeName()获取节点名称
8NodegetNodeValue()获取节点值
9NodegetAttributes()获取节点的所有属性集合
10NodegetTextContent()获取element的内容
11NodeNameMapitem(int index)根据索引获取集合中的一个节点Node
注:Node是NodeList和NodeNameMap集合的基本元素

常用节点类型

节点类型NodeTypeNamed ConstantnodeName的返回值nodeValue的返回值
Element1ELEMENT_NODEelement namenull
Attr2ATTRIBUTE_NODE属性名称属性值
text3TEXT_NODEtext节点内容
注:根据以上的信息,可以发现使用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());
}
}
}


程序运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: