首页 > 代码库 > 2017/4/26-DOM解析XML文件
2017/4/26-DOM解析XML文件
DOM解析XML
1、分析
DOM是JAVA自带的XML解析API。DOM首先将XML文件全部加载至内存中,然后再内存中创建DOM树,生成DOM树上的每个Node节点。
2、优点
1) 可以创建或修改XML文件内容。
2) 进行XSLT转换。
3) 进行Xpath过滤。
3、缺点
1) 由于DOM会先把XML文件加载至内存中并使用DOM树,因此文件过大时,会占用非常多的内存。
2) 相对于SAX,效率上也会有明显的下降。
4、适用场合
1) 当需要对XML文档进行修改或者创建XML文档时,可以使用DOM。
2) 当XML文件很小时,可以忽略加载后占用的内存大小时,可以使用DOM。
3) 进行XSLT转换或者Xpath过滤时,可以使用DOM。
5、讲解
1) 相对于SAX而言,DOM的开发量会比较小。
2) 先从DocumentBuilderFactory中获取DocumentBuilderFactory对象,使用newInstance()方法。
3) 从步骤2的对象中拿取DocumentBuilder对象,使用newDocumentBuilder()方法。
4) 将xml文件转换成Document对象,加载至内存中,使用步骤3对象的parse(InputStream is)方法,其中“is”参数为XML文件的输入流。
5) 使用Document对象过去Element对象。该Element对象则为根节点。
6) 判断根节点下是否有子节点,若有则进行遍历,获取Node对象,Node对象则为子节点。
7) 判断子节点下是否有其他子节点,若有则遍历,以此类推。(可以使用递归方法进行查询)
6、详解
1) XML文件示例
<?xml version="1.0" encoding="utf-8"?> <books> <book> <id>10001</id> <name>JAVA BOOK</name> <author>James Gosling</author> <publishDate>2017-04-24</publishDate> </book> <book> <id>10002</id> <name>C BOOK</name> <author>Dennis Ritchie</author> <publishDate>2017-04-24</publishDate> </book> </books>
2) DOM解析XML文件demo
package com.mean.xml.dom.demo; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @author mean * */ public class DomDemo { public DomDemo() { } /** * DOM解析XML主要方法 * */ public static void analysis() { DocumentBuilderFactory domBuilderFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder domBuilder = domBuilderFactory.newDocumentBuilder(); Document dom = domBuilder.parse(DomDemo.class.getResourceAsStream("/Book.xml")); Element books = dom.getDocumentElement(); // root节点(books) if (books.hasChildNodes()) { NodeList booksList = books.getChildNodes(); for (int i = 0, l = booksList.getLength(); i < l; i++) { Node book = booksList.item(i); // books下的子节点(book) if (book.hasChildNodes()) { NodeList bookList = book.getChildNodes(); System.out.println("----------书本内容----------"); for (int j = 0, len = bookList.getLength(); j < len; j++) { Node sonNode = bookList.item(j); // book下的子节点(id,name,author,publishData) if (sonNode.getNodeType() == Element.ELEMENT_NODE) { System.out.println("nodeName:" + sonNode.getNodeName() + " ,nodeValue:" + sonNode.getTextContent().trim()); } } } } } } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { DomDemo.analysis(); } }
3) DOM解析XML文件,递归遍历各节点demo(慎用)
package com.mean.xml.dom.demo; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * 递归方法遍历各节点 * @author mean */ public class DomTraversalNodeDemo { public DomTraversalNodeDemo() { } /** * DOM解析XML主要方法 * */ public static void analysis() { DocumentBuilderFactory domBuilderFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder domBuilder = domBuilderFactory.newDocumentBuilder(); Document dom = domBuilder.parse(DomDemo.class.getResourceAsStream("/Book.xml")); Element books = dom.getDocumentElement(); // root节点(books) if (books.hasChildNodes()) { NodeList booksList = books.getChildNodes(); for (int i = 0, l = booksList.getLength(); i < l; i++) { Node book = booksList.item(i); // books下的子节点(book) if (book.getNodeType() == Element.ELEMENT_NODE) { System.out.println("---------book-----------"); traversalNode(book); } } } } catch (Exception e) { e.printStackTrace(); } } /** * 遍历子节点 * */ public static void traversalNode(Node node) { // 该判断是为了防止将换行输出,因为DOM中会把回车也会当做节点 if (node.getNodeType() != Element.TEXT_NODE) { // 若node下有子节点了,则进行节点遍历 if (node.hasChildNodes()) { NodeList nodeList = node.getChildNodes(); if (nodeList.getLength() == 1 && (nodeList.item(0).getNodeType() == Element.TEXT_NODE)) { System.out .println("nodeName:" + node.getNodeName() + " ,nodeValue:" + node.getTextContent().trim()); } else { for (int i = 0, l = nodeList.getLength(); i < l; i++) { Node sonNode = nodeList.item(i); traversalNode(sonNode); } } } } } public static void main(String[] args) { DomTraversalNodeDemo.analysis(); } }
7、引用
1) 本文借鉴博客网址:http://blog.csdn.net/zhangxinrun/article/details/5678118
2017/4/26-DOM解析XML文件