﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-丄諦啲仇魜ヤ              -文章分类-JDOM操作XML</title><link>http://www.blogjava.net/Crying/category/28486.html</link><description>
如 果 敌 人 让 你 生 气 , 那 说 明 你 没 有 胜 他 的 把 握！ 
</description><language>zh-cn</language><lastBuildDate>Tue, 29 Jan 2008 13:12:04 GMT</lastBuildDate><pubDate>Tue, 29 Jan 2008 13:12:04 GMT</pubDate><ttl>60</ttl><item><title>JDom读取xml</title><link>http://www.blogjava.net/Crying/articles/171431.html</link><dc:creator>Crying</dc:creator><author>Crying</author><pubDate>Sat, 29 Dec 2007 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/Crying/articles/171431.html</guid><wfw:comment>http://www.blogjava.net/Crying/comments/171431.html</wfw:comment><comments>http://www.blogjava.net/Crying/articles/171431.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Crying/comments/commentRss/171431.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Crying/services/trackbacks/171431.html</trackback:ping><description><![CDATA[&nbsp;自己写的例子操作XML<a href="http://www.blogjava.net/Files/Crying/防盗链.rar">http://www.blogjava.net/Files/Crying/防盗链.rar</a><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;<br />
&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>
<img src ="http://www.blogjava.net/Crying/aggbug/171431.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Crying/" target="_blank">Crying</a> 2007-12-29 10:41 <a href="http://www.blogjava.net/Crying/articles/171431.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>