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文件如下:
Java解析代码如下:
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