2017/4/26-DOM解析XML文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>
View Code

  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();
    }

}
View Code

  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();
    }
}
View Code

 

7、引用

  1) 本文借鉴博客网址:http://blog.csdn.net/zhangxinrun/article/details/5678118



以上是关于2017/4/26-DOM解析XML文件的主要内容,如果未能解决你的问题,请参考以下文章

从流输入中解析没有根元素的 XML 片段列表

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

DOM解析xml文件

无法解析片段中的 findViewById [重复]

java解析xml的几种方式哪种最好?

Expat Parser解析xml文件