JDOM使用详解及实例

JDOM使用详解及实例

一、 JDOM 简介

JDOM 是一个开源项目,它基于树型结构,利用纯 JAVA 的技术对 XML 文档实现解析、生成、序列化以及多种操作。

JDOM 直接为 JAVA 编程服务。它利用更为强有力的 JAVA 语言的诸多特性(方法重载、集合概念以及映射),把 SAX 和 DOM 的功能有效地结合起来。

在使用设计上尽可能地隐藏原来使用 XML 过程中的复杂性。利用 JDOM 处理 XML 文档将是一件轻松、简单的事。

JDOM 在 2000 年的春天被 Brett McLaughlin 和 Jason Hunter 开发出来,以弥补 DOM 及 SAX 在实际应用当中的不足之处。

这些不足之处主要在于 SAX 没有文档修改、随机访问以及输出的功能,而对于 DOM 来说, JAVA 程序员在使用时来用起来总觉得不太方便。

DOM 的缺点主要是来自于由于 Dom 是一个接口定义语言( IDL ) , 它的任务是在不同语言实现中的一个最低的通用标准,并不是为 JAVA 特别设计的。 JDOM 的最新版本为 JDOM Beta 9 。最近 JDOM 被收录到 JSR-102 内,这标志着 JDOM 成为了 JAVA 平台组成的一部分。

二、 JDOM 包概览

JDOM 是由以下几个包组成的
org.jdom 包含了所有的 xml 文档要素的 java 类

org.jdom.adapters 包含了与 dom 适配的 java 类

org.jdom.filter 包含了 xml 文档的过滤器类

org.jdom.input 包含了读取 xml 文档的类

org.jdom.output 包含了写入 xml 文档的类

org.jdom.transform 包含了将 jdom xml 文档接口转换为其他 xml 文档接口

org.jdom.xpath 包含了对 xml 文档 xpath 操作的类 三、 JDOM 类说明

1 、 org.JDOM 这个包里的类是你J解析 xml 文件后所要用到的所有数据类型。

Attribute

CDATA

Coment

DocType

Document

Element

EntityRef

Namespace

ProscessingInstruction

Text

2 、 org.JDOM.transform 在涉及 xslt 格式转换时应使用下面的 2 个类

JDOMSource

JDOMResult

org.JDOM.input

3 、输入类,一般用于文档的创建工作

SAXBuilder

DOMBuilder

ResultSetBuilder

org.JDOM.output

4 、输出类,用于文档转换输出

XMLOutputter

SAXOutputter

DomOutputter

JTreeOutputter

使用前注意事项:

1.JDOM 对于 JAXP 以及 TRax 的支持

JDOM 支持 JAXP1.1 :你可以在程序中使用任何的 parser 工具类 , 默认情况下是 JAXP 的 parser 。

制定特别的 parser 可用如下形式

SAXBuilder parser

= new SAXBuilder("org.apache.crimson.parser.XMLReaderImpl");

Document doc = parser.build("http://www.cafeconleche.org/");

// work with the document...

JDOM 也支持 TRaX : XSLT 可通过 JDOMSource 以及 JDOMResult 类来转换(参见以后章节)

2. 注意在 JDOM 里文档( Document )类由 org.JDOM.Document 来表示。这要与 org.w3c.dom 中的 Document 区别开,这 2 种格式如何转换在后面会说明。

以下如无特指均指 JDOM 里的 Document 。

四、 JDOM 主要使用方法

1.Ducument 类

(1)Document 的操作方法:

Element root = new Element("GREETING");

Document doc = new Document(root);

root.setText("Hello JDOM!");

或者简单的使用 Document doc = new Document(new Element("GREETING").setText("Hello JDOM!t"));

这点和 DOM 不同。 Dom 则需要更为复杂的代码,如下:

DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilder builder =factory.newDocumentBuilder();

Document doc = builder.newDocument();

Element root =doc.createElement("root");

Text text = doc.createText("This is the root");

root.appendChild(text);

doc.appendChild(root);

注意事项: JDOM 不允许同一个节点同时被 2 个或多个文档相关联,要在第 2 个文档中使用原来老文档中的节点的话。首先需要使用 detach() 把这个节点分开来。

(2) 从文件、流、系统 ID 、 URL 得到 Document 对象:

DOMBuilder builder = new DOMBuilder();

Document doc = builder.build(new File("jdom_test.xml"));

SAXBuilder builder = new SAXBuilder();

Document doc = builder.build(url);

在新版本中 DOMBuilder 已经 Deprecated 掉 DOMBuilder.builder(url) ,用 SAX 效率会比较快。

这里举一个小例子,为了简单起见,使用 String 对象直接作为 xml 数据源:

public jdomTest() {

String textXml = null;

textXml = "

1<note>"; 
2
3textXml = textXml + 
4
5"<to>aaa</to><from>bbb</from><heading>ccc</heading><body>ddd</body>"; 
6
7textXml = textXml + "</note>

";

SAXBuilder builder = new SAXBuilder();

Document doc = null;

Reader in= new StringReader(textXml);

try {

doc = builder.build(in);

Element root = doc.getRootElement();

List ls = root.getChildren();// 注意此处取出的是 root 节点下面的一层的 Element 集合

for (Iterator iter = ls.iterator(); iter.hasNext(); ) {

Element el = (Element) iter.next();

if(el.getName().equals("to")){

System.out.println(el.getText());

}

}

}

catch (IOException ex) {

ex.printStackTrace();

}

catch (JDOMException ex) {

ex.printStackTrace();

}

}

(3)DOM 的 document 和 JDOM 的 Document 之间的相互转换使用方法,简单!

DOMBuilder builder = new DOMBuilder();

org.jdom.Document jdomDocument = builder.build(domDocument);

DOMOutputter converter = new DOMOutputter();// work with the JDOM document…

org.w3c.dom.Document domDocument = converter.output(jdomDocument);

// work with the DOM document…

2.XML 文档输出

XMLOutPutter 类:

JDOM 的输出非常灵活 , 支持很多种 io 格式以及风格的输出

Document doc = new Document(...);

XMLOutputter outp = new XMLOutputter();

outp.output(doc, fileOutputStream); // Raw output

outp.setTextTrim(true); // Compressed output

outp.output(doc, socket.getOutputStream());

outp.setIndent(" ");// Pretty output

outp.setNewlines(true);

outp.output(doc, System.out);

详细请参阅最新的 JDOM API 手册

3.Element 类:

(1) 浏览 Element 树

Element root = doc.getRootElement();// 获得根元素 element

List allChildren = root.getChildren();// 获得所有子元素的一个 list

List namedChildren = root.getChildren("name");// 获得指定名称子元素的 list

Element child = root.getChild("name");// 获得指定名称的第一个子元素

JDOM 给了我们很多很灵活的使用方法来管理子元素(这里的 List 是 java.util.List )

List allChildren = root.getChildren();

allChildren.remove(3); // 删除第四个子元素

allChildren.removeAll(root.getChildren("jack"));// 删除叫“ jack ”的子元素

root.removeChildren("jack"); // 便捷写法

allChildren.add(new Element("jane"));// 加入

root.addContent(new Element("jane")); // 便捷写法

allChildren.add(0, new Element("first"));

(2) 移动 Elements:

在 JDOM 里很简单

Element movable = new Element("movable");

parent1.addContent(movable); // place

parent1.removeContent(movable); // remove

parent2.addContent(movable); // add

在 Dom 里

Element movable = doc1.createElement("movable");

parent1.appendChild(movable); // place

parent1.removeChild(movable); // remove

parent2.appendChild(movable); // 出错 !

补充:纠错性

JDOM 的 Element 构造函数(以及它的其他函数)会检查 element 是否合法。

而它的 add/remove 方法会检查树结构,检查内容如下:

1. 在任何树中是否有回环节点

2. 是否只有一个根节点

3. 是否有一致的命名空间( Namespaces )

(3)Element 的 text 内容读取

1<description>
2
3A cool demo 
4
5</description>

// The text is directly available

// Returns "\n A cool demo\n"

String desc = element.getText();

// There's a convenient shortcut

// Returns "A cool demo"

String desc = element.getTextTrim();

(4)Elment 内容修改

element.setText("A new description");

<p class="MsoNormal" style="MARGIN: 0

Published At
Categories with Web编程
Tagged with
comments powered by Disqus