Java DOM解析XML

XML在项目开发中经常使用。  
XML中的常用术语:  
元素(Element):指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。【Element是Node,但Node不一定是Element】  
节点(Node):根据 DOM,XML 文档中的每个成分都是一个节点。其中整个文档是一个文档节点、每个 XML 标签是一个元素节点、包含在 XML 元素中的文本是文本节点、每一个 XML 属性是一个属性节点、注释属于注释节点。  
注:XML文档两个标签之间的空白也是这棵树的一个节点(Text节点),包括回车、Tab等。元素,它们的文本,以及它们的属性,都被认为是节点。  
  
DOM (Document Object Model,文档对象模型)定义了访问和操作文档的标准方法。  
DOM 把XML文档作为树结构来查看。能够通过DOM树来访问所有元素。  
使用Java DOM方法读取XML主要由W3C提供,它将XML文件全部读入内存中,然后将各个元素组成一棵数据树,以便快速的访问各个节点。但其缺点是消耗系统性能较大,因此,对较大的文档不适宜采用DOM方法来解析。

AirPortLine.xml文件如下: 
<?xml version="1.0" encoding="UTF-8"?>  
<AirPortLine>  
    <line lid="MU2480" num="3">  
        <id>1</id>  
        <station>  
            <sid>1</sid>  
            <sname>武汉</sname>  
        </station>  
        <station>  
            <sid>2</sid>  
            <sname>石家庄</sname>  
        </station>  
        <station>  
            <sid>3</sid>  
            <sname>北京</sname>  
        </station>  
    </line>  
    <line lid="MU2483" num="4">  
        <id>2</id>  
        <station>  
            <sid>1</sid>  
            <sname>重庆</sname>  
        </station>  
        <station>  
            <sid>2</sid>  
            <sname>武汉</sname>  
        </station>  
        <station>  
            <sid>3</sid>  
            <sname>上海</sname>  
        </station>  
        <station>  
            <sid>4</sid>  
            <sname>东京</sname>  
        </station>  
    </line>  
    <line lid="MU2485" num="2">  
        <id>3</id>  
        <station>  
            <sid>1</sid>  
            <sname>上海</sname>  
        </station>  
        <station>  
            <sid>2</sid>  
            <sname>纽约</sname>  
        </station>  
    </line>  
</AirPortLine> 
将AirPortLine.xml文件放到项目根目录下,使用Java DOM解析文档。  
Java解析代码如下:
package com.hsinghsu.testXML;  
  
import java.io.File;  
  
import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
  
import org.w3c.dom.Document;  
import org.w3c.dom.Element;  
import org.w3c.dom.NodeList;  
  
public class testDOM {  
  
    public static void main(String[] args) {  
        try {  
            File file = new File("AirPortLine.xml");  
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
            DocumentBuilder builder = factory.newDocumentBuilder();  
            Document doc = builder.parse(file);  
  
            parseDOM(doc);// 解析XML文档  
        } catch (Exception e) {  
            System.out.println("Can't read the file");  
        }  
  
    }  
  
    // 解析XML文档  
    private static void parseDOM(Document doc) {  
  
        NodeList nodelist = doc.getElementsByTagName("line");// 获取<line></line>节点下的节点集合  
  
        for (int i = 0; i < nodelist.getLength(); i++) {  
            Element element = (Element) nodelist.item(i);// 获取<line></line>节点下的元素  
            NodeList childNode = element.getChildNodes();// 获取<line></line>节点下的子节点  
            String lid = element.getAttribute("lid");// 获取<line>元素的属性  
            System.out.println("==lid:" + lid);  
            String num = element.getAttribute("num");// 获取<line>元素的属性  
            System.out.println("==num:" + num);  
            for (int j = 0; j < childNode.getLength(); j++) {  
                if ("id".equals(childNode.item(j).getNodeName())) {// 获取<id></id>节点  
                    System.out.println("==路线id:" + childNode.item(j).getFirstChild().getNodeValue());// 获取<id></id>子节点值,即id值  
                }  
                if ("station".equals(childNode.item(j).getNodeName())) {  
                    NodeList childrenNode = childNode.item(j).getChildNodes();// 获取<station></station>节点下的子节点  
                    for (int k = 0; k < childrenNode.getLength(); k++) {  
                        if ("sid".equals(childrenNode.item(k).getNodeName())) {  
                            if (null != childrenNode.item(k).getFirstChild()) {  
                                System.out.println("----站--sid:" + childrenNode.item(k).getFirstChild().getNodeValue());// 获取<sid></sid>子节点值,即sid值  
                            } else {  
                                System.out.println("----站--sid:null");  
                            }  
                        }  
                        if ("sname".equals(childrenNode.item(k).getNodeName())) {  
                            if (null != childrenNode.item(k).getFirstChild()) {  
                                System.out.println("----站--sname:" + childrenNode.item(k).getFirstChild().getNodeValue());// 获取<sname></sname>子节点值,即sname值  
                            } else {  
                                System.out.println("----站--sname:null");  
                            }  
                        }  
                    }  
                }  
            }  
        }  
  
    }  
  
}  
注:XML DOM教程详见 http://www.w3school.com.cn/xmldom/index.asp  


你可能感兴趣的:(Java DOM解析XML)