xml的Jdom解析过程详解
JDOM
与
DOM
类似,也是一组用于解析
XML
的
API
,它本身不是一个解析器,默认的它内置了
Apache
的
Xerces
解析器;
JDOM
与
DOM
不同的是,
DOM
是跨语言的一套
API
,
Java
世界中有很多
DOM
的解析器,同样的
.Net
中也一样内置了
DOM
的实现,但是
JDOM
是专门为
Java
打造的一批
API
,
JDOM
采用了
Java
中的
Collection
架构来封装集合,是
Java
爱好者更加熟悉的模式。
JDOM
的核心类
JDOMException
Document <- DocType
<- Comment
<- ProcessingInstruction
<- Element <- Attribute
<- Comment
<- ProcessingInstruction
<- CDATA
<- Text
<- EntityRef
JDOM
对外都是具体类,无需工厂
Element
、
Attribute
、
ProcessingInstruction
、
Comment
和其他类都可以直接通过
new
来声明实例,不需要工厂了,具有使用方便的一面,但同时也限制了扩展,这些暂且不做讨论,我们关心的如何使用,而不是如何优化它的设计。
Eement rootElem = new Element("root");
Document doc = new Document(rootElem);
就这么简单,一个
JDOM
的
Document
对象产生了。
JDOM
的输入
JDOM
的输入允许各种类型,如
SAX
事件、
DOM
文档、
JDBC
的
ResultSet
、文件、
Stream
、远程
URI
等等,这里先研究最简单也是最常用的两种(
SAXBuilder
,
DOMBuilder
)。
//SAXBuilder
构建一个
JDOM
的
Document
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new FileInputStream("text.xml"));
//DOMBuilder
构建一个
JDOM
的
Document
DOMBuilder builder = new DOMBuilder();
Document doc = builder.build(aDOMDocument);
记住:只有当输入是一个
DOM
的
Document
的时候,才采用
DOMBuilder
,否则
SAXBuilder
是首选。原因不是
DOMBuilder
不能接受其他参数,而是性能问题。在实现中与
SAXBuilder
比起来,
DOMBuilder
绕了一个圈子,所以理论上说性能必有影响。
JDOM
的输出
JDOM
有专门的输入类
XMLOutputer,SAXOutputer,DOMOutputer
。与允许各种输入一样,
JDOM
通过这些类允许各种输出。如输出一个
DOM
的
Document
,输出
XML
文件,输入
Stream
等等,方法很简单,都是通过
output()
的重载方法来实现,具体产看
JavaDoc
即可。一个简单的例子:
XMLOutputer outputer = new XMLOutputer(" ",true,"UTF-8");
outputer.output(jdomDocument, new FileOutputStream("result.xml"));
这里的
XMLOutputer
的构造有几种:
public XMLOutputer();
public XMLOutputer(String indent);
public XMLOutputer(String indent, boolean newLines);
public XMLOutputer(String indent, boolean newLines,
String encoding);
其中
indent
为每行的缩进字符;
newLines
自动换行,如果为
false
则所有的输出都在一行,可读性很差;
encoding
为编码,即
<?xml version=1.0 encoding="UTF-8">
中的
UTF-8
。
JDOM
的常用
API
1. Document
doc.getContent()
与
doc.setContent(child)
可以为
Document
添加任何类型的节点,其实不止是
Document
可以,其他可以有子节点的节点都可以,如
Element
。
2. Element
与
DOM
不同,
Element
下无需获得
Text
就可以直接获取元素文本,尽管
JDOM
的内部实现依然是存在
Text
节点的,但是从使用这个角度来说
elem.getText()
与
elem.setText("val")
这样的方式还是方便了很多。
与
DOM
一样,
Element
中可以不通过
Attribute
节点直接操作属性,
elem.getAttribute("key")
和
elem.setAttribte("key","value")
3.
其他
其他的参照
JavaDoc
即可了,没有什么特别的。
-----
值得注意的地方
-----
1.
关于添加节点的顺序
通过如下代码为根元素添加一个注释:
Element rootElem = new Element("Root");
Document doc = new Document(rootElem);
Comment comm = new Comment("This is a comment Test");
doc.addContent(comm);
表面看上去没什么问题,但是结果会是如下状况:
<?xml version = "1.0 encoding="UTF-8">
<Root>
...
</Root>
<!--This is a comment Test-->
问题应该可以看出来了,原因是
doc.addContent(comm)
,
comm
在
doc
之后。但是没有
doc
又无法添加
comm
,这似乎有些矛盾,怎么办呢?我们可以采用如下办法:
doc.getContent.add(0,comment);
这与
List
的
insert()
有异曲同工之效,即指定了
comment
的位置是
0
,即最前面。
===================================================================================
使用
JDOM
解析
XML
(转载,简单又详细)
一、前言
JDOM
是
Breet Mclaughlin
和
Jason Hunter
两大
Java
高手的创作成果,
2000
年初,
JDOM
作为一个开放源代码项目正式开始研发。
JDOM
是一种解析
XML
的
Java
工具包。
DOM
适合于当今流行的各种语言,包括
Java,JavaScripte,VB,VBScript
,
Perl,C,C++
等。它了为
HTML
和
XML
文档提供了一个可应用于不同平台的编程接口。
W 3C DOM
的最新信息可从
[url]http://www.w3.org/TR2001/WD-DOM-Lever-3-Core-20010913[/url]
查阅。微软在
[url]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmconxmldomuserguide.asp[/url]
上也有
DOM
的详细技术信息。
DOM
的设计为了适用于不同的语言,它保留了不同语言中非常相似的
API
。但是它并不适合于
Java
编程者的习惯。而
JDOM
作为一种轻量级
API
被制定,它最核心的要求是以
Java
为中心,只适合于
Java
语言,它遵循
DOM
的接口主要规则,除去了
DOM
中为了兼容各语言而与
Java
习惯的不同。
二、使用
JDOM
的前提条件
须要有
SAX
、
DOM
解析器的类文件,
JDOM
只是一种适合
Java
程序员来使用的
Java XML
解析器,目前流行的
Java XML
解析器还有:
Apache Xerces Java
、
JAXP
。
Xerces Java
解析器是完全用
Java
编写的
XML
解析器,最新版本是
2.5
,它支持以下标准和
API
:
(
1
)
XML1.0
规范(第二版本)
(
2
)
XML
命名空间规范
(
3
)
DOM2
核心标准规范
(
4
)
SAX2
核心扩展
(
5
)
JAXP1.2
:是
Sun
提供的使用
Java
处理
XML
的接口
API
。
(
6
)
XML Schema
结构和数据类型标准
还有最好的是它开放源代码,我们可以在
[url]http://xml.apache.org/dist/xerces-j/[/url]
处去下载。下载文件
Xerces-J-bin. 2.5.0 .zip
。
解压下载文件,得到四个压缩包加到项目的路径中(其实不要全加,但不熟的情况下考虑这么做)。
JDOM
的二进制版本下载:
[url]http://www.jdom.org/downloads/index.html[/url]
把解压后的
jdom.jar
文件加到项目的类路径中,另外便于调试,还要下载它的源代码。
三、使用
JDOM
解析
XML
好了,现在该是正题了。下面通过一个简单的例子说明一下怎么用
JDOM
这一适合
Java
程序员习惯的工具包来解析
XML
文档。
为了简单,我用了如下
XML
作为要解析的
XML
文件:
<?xml version="1.0" encoding="gb2312"?>
<books>
<book email="zhoujunhui">
<name>rjzjh</name>
<price>60.0</price>
</book>
</books>
够简单的吧,但它对于我们关心的东西都有了,子节点,属性。
下面是用于解析这个
XML
文件的
Java
文件:
1 public class JDomParse {2 public JDomParse(){3 String xmlpath="library.xml";4 SAXBuilder builder=new SAXBuilder(false);5 try {6 Document doc=builder.build(xmlpath);7 Element books=doc.getRootElement();8 List booklist=books.getChildren("book");9 for (Iterator iter = booklist.iterator(); iter.hasNext();) {10 Element book = (Element) iter.next();11 String email=book.getAttributeValue("email");12 System.out.println(email);13 String name=book.getChildTextTrim("name");14 System.out.println(name);15 book.getChild("name").setText("alterrjzjh");16 17 }18 19 XMLOutputter outputter=new XMLOutputter();20 outputter.output(doc,new FileOutputStream(xmlpath));21 22 } catch (JDOMException e) {23 e.printStackTrace();24 } catch (IOException e) {25 e.printStackTrace();26 }27 }28 public static void main(String[] args) {29 new JDomParse();30 }31}
不到
30
行代码,现在我对代码解释一下:
四、解释代码
引用的类:
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
//
下面是引用到
JDOM
中的类
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
(
1
)使用
JDOM
首先要指定使用什么解析器。如:
SAXBuilder builder=new SAXBuilder(false);
这表示使用的是默认的解析器
(
2
)得到
Document
,我们以后要进行的所有操作都是对这个
Document
操作的:
Document doc=builder.build(xmlpath);
(
3
)得到根元素:
Element books=doc.getRootElement();
在
JDOM
中所有的节点(
DOM
中的概念)都是一个
org.jdom.Element
类,当然他的子节点也是一个
org.jdom.Element
类。
(
4
)得到元素(节点)的集合:
List booklist=books.getChildren("book");
这表示得到
“books”
元素的所在名称为
“book”
的元素,并把这些元素都放到一个
List
集合中
(
5
)轮循
List
集合
for (Iterator iter = booklist.iterator(); iter.hasNext();) {
Element book = (Element) iter.next();
}
还有一种轮循方法是:
for(int i=0;I<booklist.size();I++){
Element book=(Element)booklist.get(i);
}
(
6
)取得元素的属性:
String email=book.getAttributeValue("email");
取得元素
book
的属性名为
“email”
的属性值。
(
7
)取得元素的子元素(为最低层元素)的值:
String name=book.getChildTextTrim("name");
注意的是,必须确定
book
元素的名为
“name”
的子元素只有一个。
(
8
)改变元素(为最低层元素)的值:
book.getChild("name").setText("alterrjzjh");
这只是对
Document
的修改,并没有在实际的
XML
文档中进行修改
(
9
)保存
Document
的修改到
XML
文件中:
XMLOutputter outputter=new XMLOutputter();
outputter.output(doc,new FileOutputStream(xmlpath));
我们先要有一个
XMLOutputter
类,再把已经修改了的
Document
保存进
XML
文档中。
到此。用
JDOM
解析和处理
XML
文档讲解完了,麻雀虽小,五脏俱全。现在已对
JDOM
有个整体上的概念了吧
Trackback: [url]http://tb.blog.csdn.net/TrackBack.aspx?PostId=1592806[/url]