Java
java的控制力很吸引我。
BlogJava
首页
新随笔
联系
聚合
管理
随笔-18 评论-20 文章-0 trackbacks-0
java dom解析xml
java dom解析xml
一、前言
用Java解析XML文档,最常用的有两种方法:使用基于事件的XML简单API (Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。
JAXP接口包含了三个包:
(1)org.w3c.dom W3C推荐的用于XML标准规划文档对象模型的接口。
(2)org.xml.sax 用于对XML进行语法分析的事件驱动的XML简单API(SAX)
(3)javax.xml.parsers解析器工厂工具,程序员获得并配置特殊的特殊语法分析器。
二、使用DOM解析XML文档
我们现在来看看DOM是如何解析XML的吧!同样的,我将从一个简单的不能再简单的例子来说明DOM是如何解析XML文档的,先让我们看看XML是什么内容吧:
<?
xml version="1.0" encoding="gb2312"
?>
<
books
>
<
book
email
="123@990.net"
>
<
name
>bookname
</
name
>
<
price
>102
</
price
>
</
book
>
</
books
>
解析这个XML文件的Java代码
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import
java.io.InputStream;
import
javax.xml.parsers.DocumentBuilder;
import
javax.xml.parsers.DocumentBuilderFactory;
import
javax.xml.parsers.ParserConfigurationException;
import
org.w3c.dom.Document;
import
org.w3c.dom.Element;
import
org.w3c.dom.Node;
import
org.w3c.dom.NodeList;
import
org.xml.sax.SAXException;
public
class
DomParse
{
public
DomParse()
...
{
DocumentBuilderFactory domfac
=
DocumentBuilderFactory.newInstance();
try
...
{
DocumentBuilder dombuilder
=
domfac.newDocumentBuilder();
InputStream is
=
new
FileInputStream(
"
WebRoot/WEB-INF/hell.xml
"
);
Document doc
=
dombuilder.parse(is);
Element root
=
doc.getDocumentElement();
NodeList books
=
root.getChildNodes();
if
(books
!=
null
)
...
{
for
(
int
i
=
0
;i
<
books.getLength();i
++
)
...
{
Node book
=
books.item(i);
if
(book.getNodeType()
==
Node.ELEMENT_NODE)
...
{
String email
=
book.getAttributes().getNamedItem(
"
email
"
).getNodeValue();
System.out.println(email);
for
(Node node
=
book.getFirstChild();node
!=
null
;node
=
node.getNextSibling())
...
{
if
(node.getNodeType()
==
Node.ELEMENT_NODE)
...
{
if
(node.getNodeName().equals(
"
name
"
))
...
{
String name
=
node.getNodeValue();
String name1
=
node.getFirstChild().getNodeValue();
System.out.println(name);
System.out.println(name1);
}
if
(node.getNodeName().equals(
"
price
"
))
...
{
String price
=
node.getFirstChild().getNodeValue();
System.out.println(price);
}
}
}
}
}
}
}
catch
(ParserConfigurationException e)
...
{
e.printStackTrace();
}
catch
(FileNotFoundException e)
...
{
e.printStackTrace();
}
catch
(SAXException e)
...
{
e.printStackTrace();
}
catch
(IOException e)
...
{
e.printStackTrace();
}
}
public
static
void
main(String[] args)
...
{
new
DomParse();
}
}
...
三、代码解释
先看看这个程序引用类:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
//下面主要是org.xml.sax包的类
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
上面那么简单的代码一看就明白了,但是为了介绍个DOM编程的大概还是来看看这个程序吧:
(1)得到DOM解析器的工厂实例
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
得到javax.xml.parsers.DocumentBuilderFactory;类的实例就是我们要的解析器工厂
(2)从DOM工厂获得DOM解析器
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
通过javax.xml.parsers.DocumentBuilderFactory实例的静态方法newDocumentBuilder()得到DOM解析器
(3)把要解析的XML文档转化为输入流,以便DOM解析器解析它
InputStream is=new FileInputStream("bin/library.xml");
InputStream是一个接口。
(4)解析XML文档的输入流,得到一个Document
Document doc=dombuilder.parse(is);
由XML文档的输入流得到一个org.w3c.dom.Document对象,以后的处理都是对Document对象进行的
(5)得到XML文档的根节点
Element root=doc.getDocumentElement();
在DOM中只有根节点是一个org.w3c.dom.Element对象。
(6)得到节点的子节点
NodeList books=root.getChildNodes();
for(int i=0;i<books.getLength();i++){
Node book=books.item(i);}
这是用一个org.w3c.dom.NodeList接口来存放它所有子节点的,还有一种轮循子节点的方法,后面有介绍
(7)取得节点的属性值
String email=book.getAttributes().getNamedItem("email").getNodeValue();
System.out.println(email);
注意,节点的属性也是它的子节点。它的节点类型也是Node.ELEMENT_NODE
(8)轮循子节点
for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){
if(node.getNodeType()==Node.ELEMENT_NODE){
if(node.getNodeName().equals("name")){
String name=node.getNodeValue();
String name1=node.getFirstChild().getNodeValue();
System.out.println(name);
System.out.println(name1);
}
if(node.getNodeName().equals("price")){
String price=node.getFirstChild().getNodeValue();
System.out.println(price);
}}
这段代码的打印输出为:
123@990.net
null
bookname
102
从上面可以看出
String name=node.getNodeValue(); 是一个空值。而
String name1=node.getFirstChild().getNodeValue(); 才是真正的值,这是因为DOM把<name> rjzjh</name>也当作是两层结构的节点,其父节点为<name>节点本身,且它只有一个子节点(如果有属性的话就不止一个了!),子节点是它的值“rjzjh”,所以我们看到上面的结果。
还有,子节点的节点类型也是Node.ELEMENT_NODE型的,node.getNextSibling()方法是取下一个相邻的节点。
四、DOM结点
DOM是一些节点的集合,由于文档中可能包含有不同类型的信息,所以定义了几种不同类型的节点。DOM中最常见的节点类型有:
(1)元素:
元素是XML的基本构件。元素的子节点可以是其它元素、文本节点或两者都有。元素节点还可以只含有属性这一唯一类型的节点。
(2)属性:属性节点包含关于元素节点的信息,但它不是元素的子节点
(3)文本:文本节点文本信息,或干脆是空白的文本。
(4)文档:文档节点是整个文档中所有其它节点的父节点
元素是一种很重要的类型节点,元素节点可以是其他节点的容器。
posted on 2007-08-17 09:44
JavaPoint
阅读(735)
评论(0)
编辑
收藏
所属分类:
Java
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
ArcGis Server 中 如何在Task中实现 下拉列表和 checkbox 和 radiobutton.(完整例子) 教程将持续推出
了解 Oracle ADF:入门示例
WTP Tutorials - JavaServer Faces Tools Tutorial
java dom解析xml
用JAXP解析XML文档
<
2007年8月
>
日
一
二
三
四
五
六
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(4)
给我留言
查看公开留言
查看私人留言
随笔分类
ArcGis(12)
Java(5)
随笔档案
2007年8月 (18)
文章分类
ArcGis
Java
Jsf
ArcGis
ArcGis Search
Arcgis search
ArcGis Task
搜索
最新评论
1. re: 了解 Oracle ADF:入门示例
hhhh
--郑州
2. re: ArcGIS Server开发——控制图层是否可见 [未登录]
这个应该是服务端的
--刘
3. re: ArcGIS Server开发——控制图层是否可见 [未登录]
@123
同楼上的,看不懂~~
--刘
4. re: ArcGIS Server开发——控制图层是否可见 [未登录]
@看客
webMap是哪来的?能把要导入的包和里面的变量说明一下吗?
--123
5. re: ArcGis 航线查询完全例子[未登录]
请问下楼主上面的的查询是不是先要把airlines与城市数据建产join连接,我是初学者只是感觉
--king
阅读排行榜
1. ArcGis 航线查询完全例子(3203)
2. ArcGIS Server Java讲座-空间查询和高亮显示的实现(2911)
3. ArcGIS Editor工具中几个Task(任务)的研究(2886)
4. 如何定制ArcGIS Server Java ADF 应用模版(一)--定制工具条(2418)
5. ArcGIS Server开发——控制图层是否可见 (2359)
评论排行榜
1. Server Java讲座-----扩展Tasks框架(8)
2. ArcGIS Server开发——控制图层是否可见 (5)
3. ArcGis Server 中 如何在Task中实现 下拉列表和 checkbox 和 radiobutton.(完整例子) 教程将持续推出(2)
4. ArcGis 航线查询完全例子(1)
5. 了解 Oracle ADF:入门示例(1)