XML文档解析之DOM解析
2017-06-19 10:40
232 查看
解析步骤
获取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 |
常用节点类型
节点类型 | NodeType | Named Constant | nodeName的返回值 | nodeValue的返回值 |
---|---|---|---|---|
Element | 1 | ELEMENT_NODE | element name | null |
Attr | 2 | ATTRIBUTE_NODE | 属性名称 | 属性值 |
text | 3 | TEXT_NODE | text | 节点内容 |
取得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()); } } }
程序运行结果
相关文章推荐
- DOM 解析 XML 文档
- java中用dom解析xml的经典入门级文档
- Oracle PL/SQL 的 DOM API 解析 XML 文档
- 两种解析XML文档的方法-----DOM和SAX
- DOM解析XML文档(深度与广度)
- XML(一) DOM解析XML文档实例一
- 【原创】使用DOM解析XML文档示例(Java)
- .DOM生成和解析XML文档
- 使用DOM解析XML文档示例(Java)
- android中使用SAX, DOM, 或者pull 来解析XML文档
- sax和Dom解析xml文档 文档驱动和事件驱动
- 以 DOM 方式解析XML文档
- Java解析XML文档——dom解析xml
- 解析XML文档方式之一:dom方式
- Dom解析XML文档
- Java中使用DOM来解析xml文档
- Java解析XML文档——dom解析xml (转载)
- Java解析XML文档——dom解析xml (转载)
- 使用DOM技术来对XML文档进行解析范例
- DOM生成和解析XML文档