如何用JDom读取XML文档

原贴地址:http://blog.csdn.net/liumm1983/archive/2007/04/05/1552493.aspx
简介: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的解决方案。
二、环境配置
在我的WINDOWS xp系统平台上采用jdk-1_5_0_06作为开发和测试平台。 
三、获得与安装JDOM
由于目前JDOM并没有包含在SUN的JDK中(我想不久的将来JDOM必然会成为SUN JDK的一部分),我们必须手工下载与设置JDOM的环境。
http://www.jdom.org可 以下载JDOM的最新版本。这里下载的是jdom-1.0。JDOM的jar文件就是build目录下的文件jdom.jar,将上述文件拷贝到jdk- 1_5_0_06目录下的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树
每个Element对象包含一列子元素:Comment,ProcessingInstruction,Text和其他Element对象。此外,属性和其他名字空间还有单独的列表。
分 析文档和建立Document对象之后,可能要通过搜索来选择其中程序感兴趣的部分。在JDOM中,大多数导航通过Element类的方法进行。每个 Element的完整子元素(包括了子元素的所有内容,包括说明、处理指令、文本节点和元素,要进行深度搜索,就要对当前元素的子元素应用 getContent()方法,通常要采用递归)在getContent()方法返回java.util.List中提供。getChildren()方 法返回的java.util.List中只有每个Element的子元素。
JDOM的处理方式有些类似于DOM,但它主要是用SAX实现的,你不必担心处理速度和内存的问题。另外,JDOM中几乎没有接口,的类全部是实实在在的类,没有类工厂类的。其最重要的一个包org.jdom中主要有以下类:
Document(文档节点)
每个Document对象包括下列三个属性:
1、根Element
2、表示文档类型声明的DocType对象
3、包含根元素和任何处理指令与说明的List,按文档顺序出现
Attribute(属性节点)
Public Element setAttributes (List attributes)Throws IllegalAddException
Public List getAttributes()
setAttribute()
getAttribute()
getAttributeValue()
attribute.getName()
attribute.getValue()

CDATA (CDATA段节点)
Comment(说明节点)
XML文件的说明:<!-- wire configuration -->
DocType (文档类型节点)
Element(元素节点)
元素名设置和获取
Public Element setName(String name) throws IllegalNameException
Public String getName()

Public String  get(int i)  //i>=0


Content(内容节点)
Public Element setContent(List list) throws IllegalAddException;
public List getContent();
addContent();
removeContent();

EntityRef(实例节点)
Namespace(名字空间节点)
ProcessingInstruction(处理指令节点)

Text(文本节点)
getText();
setText(String s);
 
example.xml文件

<?xml version="1.0" encoding="GBK"?>
<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>

cute.xml文件

<?xml version="1.0" encoding="gb2312"?>   
<bookList>     //RootElement
  <book hot="true">    //<childelement name="value">---->Attribute
      <name>Java编程入门</name>  //<element>This is my text content</element>
      <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>

数据输入要用到XML文档要通过org.jdom.input包,反过来需要org.jdom.output。如前面所说,关是看API文档就能够使用。
我们的例子读入XML文件example.xml,加入一条处理指令,修改第一本书的价格和作者,并添加一条属性,然后写入文件cute.xml

cute.java:

package jdom;

import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import java.io.*;
import java.util.*;

public class Cute {

 public static void main(String args[]) {
  try {
   /*
    * 用无变元构造函数构造一个SAXBuilder对象, 用sax解析器从文件中构造文档,
    * SAXBuilder侦听sax事件并从内存中建立一个相应的文档
    */
   SAXBuilder sb = new SAXBuilder();
   // 创建文档
   Document doc = sb.build(new FileInputStream("example.xml"));
   // 加入一条处理指令
   ProcessingInstruction pi = new ProcessingInstruction(
     "xml-stylesheet",
     "href=/"bookList.html.xsl/" type=/"text/xsl/"");
   // 把这条处理指令,加入文档中
   doc.addContent(pi);
   // 获得这个文档的根元素
   Element root = doc.getRootElement();
   java.util.List ls = root.getChildren();
   // 获得这个根元素的所有子元素(不包含子元素的子元素),却完全忽略其内容  Iterator i = ls.iterator();

    while (i.hasNext()) {
    Object o = i.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());
   }
   
   // 得到第一个子元素的子元素,却完全忽略其内容
   Element book = (Element) ls.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));
   String indent = " ";
   boolean newLines = true;
   XMLOutputter xml = new XMLOutputter(indent, newLines, "gb2312");
   xml.output(doc, new FileOutputStream("e://cute.xml"));   
  } catch (Exception e) {
   System.out.println(e.getMessage());

  }

 }
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值