您的位置:首页 > 其它

解析XML文档方式之三:jdom方式

2011-03-24 13:03 246 查看
一、简介:

Jdom是用Java语言读、写、操作XML的新API函数。Jason Hunter 和 Brett McLaughlin公开发布了它的1.0版本。在直觉、简单和高效的前提下,这些API函数被最大限度的优化。在接下来的篇幅里将介绍怎么用Jdom去读写一个已经存在的XML文档。
关键词:Java、JDOM、XML
java+xml=Jdom!这就是Jdom设计者的目标。如果你曾经是用过烦人的SAX或Dom来处理xml,你就会知道为什么要有JDOM.在2002的javaOne会议上JDOM的主要创始人jason Hunter有一篇精彩的演讲介绍了JDom技术,土模就是jdom makes xml easy.
我们知道dom是用于与平台和语言无关的方式表示xml文档的官方W3C标准,利用dom和sax api可以解析和处理 xml文档。这里我们介绍的jdom是基于树操作的纯java api,应该说他提供的是一套用于解析、创建、出来和实现xml的解决方案。

为减少DOM、SAX的编码量,出现了JDOM;

优点:20-80原则,极大减少了代码量。

使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。
二、环境配置 :
在我的WINDOWS xp系统平台上采用jdk1.6.0_13作为开发和测试平台。
三、获得与安装JDOM :
由于目前JDOM并没有包含在SUN的JDK中,我们必须手工下载与设置JDOM的环境。
http://www.jdom.org可以下载JDOM的最新版本。这里下载的是jdom-1.1.1。JDOM的jar文件就是build目录下的文件jdom.jar,将上述文件拷贝到jdk1.6.0_13目录下的jre/lib/ext目录下,而用eclipse的用户可以手动添加到user liberary

四、Jdom模型:
每个元素都有四个关键段:

1、名称
2、元素属性
3、元素范围名字空间
4、元素内容

用JDOM处理现有XML文档的大致过程如下:
1、用简单无变元构造函数构造一个org.jdom.input.SAXBuilder对象。SAXBuilder用sax解析器从文件中构造文档。SAXBuilder侦听sax事件并从内存中建立一个相应的文档。这种方式非常快(基本上和sax一样快),Jdom的速度有值得期待的提高的潜力通过一个延期的构造器的完成。这个构造器检查XML数据源,但当请求的时候才对它解析。例如:文档的属性当不访问时是不需要解析的.构造器仍在发展,可以通sql查询、ldap查询和其他的数据格式来够造Jdom文档。所以,一旦进到内存中,文档就和建造它的工具没有关系了。
2、用建立器的build()方法从Reader,InputStream,URL,File或包含系统ID的字符串建立Document对象。
3、如果读取文档遇到问题,则抛出IOException,如果建立文档遇到问题,则抛出JDOMException。
4、否则用Document类,Element类和其他JDOM类的方法在文档中建立导航。

五、jdom解析xml文档实例:

(1)、待解析Books.xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<bookList>
<book>
<name>Java编程入门</name>
<author>张三</author>
<publishDate>2002-6-6</publishDate>
<price>35.0</price>
</book>
<book>
<name>XML在Java中的应用</name>
<author>李四</author>
<publishDate>2002-9-16</publishDate>
<price>92.0</price>
</book>
</bookList>


(2)、将要生成的cute.xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<bookList>
<book hot="true">
<name>Java编程入门</name>
<author>cute</author>
<publishDate>2002-6-6</publishDate>
<price>50.0</price>
</book>
<book>
<name>XML在Java中的应用</name>
<author>李四</author>
<publishDate>2002-9-16</publishDate>
<price>92.0</price>
</book>
</bookList>


(3)、jdom解析xml文档测试代码:

package com.hmk.jdom;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Text;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class TestJdomPxml {

public static void main(String[] args) {
try {
SAXBuilder saxBuilder = new SAXBuilder();
InputStream in = new FileInputStream("bin/com/hmk/jdom/Books.xml");
Document doc = saxBuilder.build(in);
Element root = doc.getRootElement();
//showXML(root);

List list = root.getChildren();
//简单打印一下元素
Iterator it = list.iterator();
while (it.hasNext()) {
Object o = it.next();
if (o instanceof Text)
{
Text t = (Text) o;
System.out.println("Text: " + t.getText());
} else if (o instanceof Attribute) {
System.out.println("Attribute: " + o);
} else if (o instanceof Element) {
System.out.println("Element: " + ((Element) o).getName());
}
}

// 得到第一个子元素的子元素,却完全忽略其内容
Element book = (Element) list.get(0);
// 给这个子元素添加一条属性,
Attribute attr = new Attribute("hot", "true");
book.setAttribute(attr);
// 获得这个元素的子元素(指定)以及其值
Element el2 = book.getChild("author");
// 输出这个元素的值
System.out.println(el2.getName());
// 给这个元素的值改个名字
el2.setText("cute");
// 再获得这个元素的子元素(指定)
Element el3 = book.getChild("price");
// 给这个值换个值
el3.setText(Float.toString(50.0f));

XMLOutputter outputter = new XMLOutputter();
outputter.output(doc, new FileOutputStream("src/com/hmk/jdom/cute.xml"));

} catch (Exception e) {
e.printStackTrace();
}
}

public static void showXML(Element root){
List list = root.getChildren();
Iterator it = list.iterator();
while (it.hasNext()) {
Object o = it.next();
if (o instanceof Text)/* 使用instanceof 来获得所需要的内容 */
{
Text t = (Text) o;
System.out.println("Text: " + t.getText());
} else if (o instanceof Attribute) {
System.out.println("Attribute: " + o);
} else if (o instanceof Element) {
System.out.println("Element: " + ((Element) o).getName());
if ("name".equals(((Element) o).getName())) {
System.out.println("name:"+((Element) o).getTextTrim());
} else if ("author".equals(((Element) o).getName())) {
System.out.println("author:"+((Element) o).getTextTrim());
}
showXML((Element)o);
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: