现在的位置: 首页 > 综合 > 正文

JDOM 简介

2013年10月08日 ⁄ 综合 ⁄ 共 5137字 ⁄ 字号 评论关闭

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 
= "<note>"
;

    textXml 
= textXml +


        
"<to>aaa</to><from>bbb</from><heading>ccc</heading><body>ddd</body>";

    textXml 
= 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(
0new 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内容读取

<description>


A cool demo

</description>

// The text is directly available

// Returns "  A cool demo "


抱歉!评论已关闭.