<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>heiyuchuanxia的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=heiyuchuanxia</link>
<description>heiyuchuanxia的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[如何用JDom读取XML文档]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=heiyuchuanxia&amp;id=12564</link>
<author>heiyuchuanxia</author>
<pubDate>2006/3/15 12:39:02</pubDate>
<description><![CDATA[如何用JDom读取XML文档<BR>简介：Jdom是用Java语言读、写、操作XML的新API函数。Jason Hunter 和 Brett McLaughlin公开发布了它的1.0版本。在直觉、简单和高效的前提下，这些API函数被最大限度的优化。在接下来的篇幅里将介绍怎么用Jdom去读写一个已经存在的XML文档。<BR>关键词：Java、JDOM、XML <BR>java+xml=Jdom!<BR>这就是Jdom设计者的目标。如果你曾经是用过烦人的SAX或Dom来处理xml,你就会知道为什么要有JDOM.在2002的javaOne会议上JDOM的主要创始人jason Hunter有一篇精彩的演讲介绍了JDom技术，土模就是jdom makes xml easy.<BR>我们知道dom是用于与平台和语言无关的方式表示xml文档的官方W3C标准，利用dom和sax api可以解析和处理 xml文档。这里我们介绍的jdom是基于树操作的纯java api,应该说他提供的是一套用于解析、创建、出来和实现xml的解决方案。<BR>二、环境配置 <BR>在我的WINDOWS xp系统平台上采用jdk-1_5_0_06作为开发和测试平台。&nbsp; <BR>三、获得与安装JDOM <BR>由于目前JDOM并没有包含在SUN的JDK中（我想不久的将来JDOM必然会成为SUN JDK的一部分），我们必须手工下载与设置JDOM的环境。 <BR>在<A href="http://www.jdom.org/">http://www.jdom.org</A>可以下载JDOM的最新版本。这里下载的是jdom-1.0。JDOM的jar文件就是build目录下的文件jdom.jar，将上述文件拷贝到jdk-1_5_0_06目录下的jre/lib/ext目录下，而用eclipse的用户可以手动添加到user liberary 
<P><BR>Jdom模型：<BR>每个元素都有四个关键段：</P>
<P>&nbsp;&nbsp; 1、名称<BR>&nbsp;&nbsp;&nbsp;2、元素属性<BR>&nbsp;&nbsp;&nbsp;3、元素范围名字空间<BR>&nbsp;&nbsp;&nbsp;4、元素内容</P>
<P>用JDOM处理现有XML文档的大致过程如下：<BR>1、用简单无变元构造函数构造一个org.jdom.input.SAXBuilder对象。SAXBuilder用sax解析器从文件中构造文档。SAXBuilder侦听sax事件并从内存中建立一个相应的文档。这种方式非常快（基本上和sax一样快），Jdom的速度有值得期待的提高的潜力通过一个延期的构造器的完成。这个构造器检查XML数据源，但当请求的时候才对它解析。例如：文档的属性当不访问时是不需要解析的.构造器仍在发展，可以通sql查询、ldap查询和其他的数据格式来够造Jdom文档。所以，一旦进到内存中，文档就和建造它的工具没有关系了。<BR>2、用建立器的build()方法从Reader,InputStream,URL,File或包含系统ID的字符串建立Document对象。<BR>3、如果读取文档遇到问题，则抛出IOException,如果建立文档遇到问题，则抛出JDOMException。<BR>4、否则用Document类，Element类和其他JDOM类的方法在文档中建立导航。</P>
<P>导航JDOM树<BR>每个Element对象包含一列子元素：Comment,ProcessingInstruction,Text和其他Element对象。此外，属性和其他名字空间还有单独的列表。<BR>分析文档和建立Document对象之后，可能要通过搜索来选择其中程序感兴趣的部分。在JDOM中，大多数导航通过Element类的方法进行。每个Element的完整子元素(包括了子元素的所有内容，包括说明、处理指令、文本节点和元素，要进行深度搜索，就要对当前元素的子元素应用getContent()方法，通常要采用递归)在getContent()方法返回java.util.List中提供。getChildren()方法返回的java.util.List中只有每个Element的子元素。<BR>JDOM的处理方式有些类似于DOM，但它主要是用SAX实现的，你不必担心处理速度和内存的问题。另外，JDOM中几乎没有接口，的类全部是实实在在的类，没有类工厂类的。其最重要的一个包org.jdom中主要有以下类： <BR>Document(文档节点)<BR>每个Document对象包括下列三个属性：<BR>1、根Element<BR>2、表示文档类型声明的DocType对象<BR>3、包含根元素和任何处理指令与说明的List,按文档顺序出现<BR>Attribute(属性节点)<BR>Public Element setAttributes (List attributes)Throws IllegalAddException<BR>Public List getAttributes()<BR>setAttribute()<BR>getAttribute()<BR>getAttributeValue()<BR>attribute.getName() <BR>attribute.getValue()</P>
<P>CDATA (CDATA段节点)<BR>Comment(说明节点) <BR>XML文件的说明：&lt;!-- wire configuration --&gt;<BR>DocType (文档类型节点)<BR>Element(元素节点) <BR>元素名设置和获取<BR>Public Element setName(String name) throws IllegalNameException<BR>Public String getName()</P>
<P>Public String&nbsp; get(int i)&nbsp; //i&gt;=0</P>
<P><BR>Content(内容节点)<BR>Public Element setContent(List list) throws IllegalAddException;<BR>public List getContent(); <BR>addContent();<BR>removeContent();</P>
<P>EntityRef(实例节点) <BR>Namespace(名字空间节点) <BR>ProcessingInstruction(处理指令节点) </P>
<P>Text(文本节点)<BR>getText();<BR>setText(String s);<BR>&nbsp;<BR>example.xml文件</P>
<P>&lt;?xml version="1.0" encoding="GBK"?&gt; <BR>&lt;bookList&gt; <BR>&nbsp; &lt;book&gt;<BR>&lt;name&gt;Java编程入门&lt;/name&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;author&gt;张三&lt;/author&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;publishDate&gt;2002-6-6&lt;/publishDate&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;price&gt;35.0&lt;/price&gt; <BR>&nbsp; &lt;/book&gt; <BR>&nbsp; &lt;book&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;XML在Java中的应用&lt;/name&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;author&gt;李四&lt;/author&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;publishDate&gt;2002-9-16&lt;/publishDate&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;price&gt;92.0&lt;/price&gt; <BR>&nbsp; &lt;/book&gt; <BR>&lt;/bookList&gt; </P>
<P>cute.xml文件</P>
<P>&lt;?xml version="1.0" encoding="gb2312"?&gt;&nbsp;&nbsp;&nbsp;<BR>&lt;bookList&gt; &nbsp;&nbsp;&nbsp;&nbsp;//RootElement<BR>&nbsp; &lt;book hot="true"&gt; &nbsp;&nbsp;&nbsp;//&lt;childelement name="value"&gt;----&gt;Attribute<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;Java编程入门&lt;/name&gt; &nbsp;//&lt;element&gt;This is my text content&lt;/element&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;author&gt;cute&lt;/author&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;publishDate&gt;2002-6-6&lt;/publishDate&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;price&gt;50.0&lt;/price&gt; <BR>&nbsp; &lt;/book&gt; <BR>&nbsp; &lt;book&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;XML在Java中的应用&lt;/name&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;author&gt;李四&lt;/author&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;publishDate&gt;2002-9-16&lt;/publishDate&gt; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;price&gt;92.0&lt;/price&gt; <BR>&nbsp; &lt;/book&gt; <BR>&lt;/bookList&gt;</P>
<P>数据输入要用到XML文档要通过org.jdom.input包，反过来需要org.jdom.output。如前面所说，关是看API文档就能够使用。 <BR>我们的例子读入XML文件example.xml，加入一条处理指令，修改第一本书的价格和作者，并添加一条属性，然后写入文件cute.xml</P>
<P>cute.java：</P>
<P>package jdom;</P>
<P>import org.jdom.*;<BR>import org.jdom.input.*;<BR>import org.jdom.output.*;<BR>import java.io.*;<BR>import java.util.*;</P>
<P>public class Cute {</P>
<P>&nbsp;public static void main(String args[]) {<BR>&nbsp;&nbsp;try {<BR>&nbsp;&nbsp;&nbsp;/*<BR>&nbsp;&nbsp;&nbsp; * 用无变元构造函数构造一个SAXBuilder对象, 用sax解析器从文件中构造文档,<BR>&nbsp;&nbsp;&nbsp; * SAXBuilder侦听sax事件并从内存中建立一个相应的文档<BR>&nbsp;&nbsp;&nbsp; */<BR>&nbsp;&nbsp;&nbsp;SAXBuilder sb = new SAXBuilder();<BR>&nbsp;&nbsp;&nbsp;// 创建文档<BR>&nbsp;&nbsp;&nbsp;Document doc = sb.build(new FileInputStream("example.xml"));<BR>&nbsp;&nbsp;&nbsp;// 加入一条处理指令<BR>&nbsp;&nbsp;&nbsp;ProcessingInstruction pi = new ProcessingInstruction(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"xml-stylesheet",<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"href=\"bookList.html.xsl\" type=\"text/xsl\"");<BR>&nbsp;&nbsp;&nbsp;// 把这条处理指令，加入文档中<BR>&nbsp;&nbsp;&nbsp;doc.addContent(pi);<BR>&nbsp;&nbsp;&nbsp;// 获得这个文档的根元素<BR>&nbsp;&nbsp;&nbsp;Element root = doc.getRootElement();<BR>&nbsp;&nbsp; java.util.List ls = root.getChildren();<BR>&nbsp;&nbsp; // 获得这个根元素的所有子元素(不包含子元素的子元素)，却完全忽略其内容&nbsp; Iterator i = ls.iterator();</P>
<P>&nbsp;&nbsp;&nbsp; while (i.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;Object o = i.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (o instanceof Text)/*使用instanceof 来获得所需要的内容*/<BR>&nbsp;&nbsp;&nbsp;&nbsp;{Text t=(Text)o;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Text: " + t.getText());}<BR>&nbsp;&nbsp;&nbsp;&nbsp;else if(o instanceof Attribute)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Attribute: " + o);<BR>&nbsp;&nbsp;&nbsp;&nbsp;else if (o instanceof Element)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Element: " + ((Element) o).getName());<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;// 得到第一个子元素的子元素，却完全忽略其内容<BR>&nbsp;&nbsp;&nbsp;Element book = (Element) ls.get(0);<BR>&nbsp;&nbsp;&nbsp;// 给这个子元素添加一条属性，<BR>&nbsp;&nbsp;&nbsp;Attribute attr = new Attribute("hot", "true");<BR>&nbsp;&nbsp;&nbsp;book.setAttribute(attr);<BR>&nbsp;&nbsp;&nbsp;// 获得这个元素的子元素（指定）以及其值<BR>&nbsp;&nbsp;&nbsp;Element el2 = book.getChild("author");<BR>&nbsp;&nbsp;&nbsp;// 输出这个元素的值<BR>&nbsp;&nbsp;&nbsp;System.out.println(el2.getName());<BR>&nbsp;&nbsp;&nbsp;// 给这个元素的值改个名字<BR>&nbsp;&nbsp;&nbsp;el2.setText("cute");<BR>&nbsp;&nbsp;&nbsp;// 再获得这个元素的子元素（指定）<BR>&nbsp;&nbsp;&nbsp;Element el3 = book.getChild("price");<BR>&nbsp;&nbsp;&nbsp;// 给这个值换个值<BR>&nbsp;&nbsp;&nbsp;el3.setText(Float.toString(50.0f));<BR>&nbsp;&nbsp;&nbsp;String indent = " ";<BR>&nbsp;&nbsp; boolean newLines = true;<BR>&nbsp;&nbsp; XMLOutputter xml = new XMLOutputter(indent, newLines, "gb2312");<BR>&nbsp;&nbsp; xml.output(doc, new FileOutputStream("e:\\cute.xml"));&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;} catch (Exception e) {<BR>&nbsp;&nbsp;&nbsp;System.out.println(e.getMessage());</P>
<P>&nbsp;&nbsp;}</P>
<P>&nbsp;}<BR>}</P>]]></description>
</item>
</channel>
</rss>