<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
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 工具包。
JDOM 是 Breet Mclaughlin 和 Jason Hunter 两大 Java 高手的创作成果, 2000 年初, JDOM 作为一个开放源代码项目正式开始研发。 JDOM 是一种解析 XML 的 Java 工具包。
DOM
适合于当今流行的各种语言,包括
Java,JavaScripte,VB,VBScript
,
Perl,C,C++
等。它了为
HTML
和
XML
文档提供了一个可应用于不同平台的编程接口。
W<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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 结构和数据类型标准
须要有 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 的二进制版本下载: [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 文件:
好了,现在该是正题了。下面通过一个简单的例子说明一下怎么用 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 有个整体上的概念了吧
四、解释代码
引用的类:
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]
转载于:https://blog.51cto.com/su3390/32172