<?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 工具包。

     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 结构和数据类型标准

       还有最好的是它开放源代码,我们可以在 [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]