﻿<?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-ultramarine-文章分类-Xml</title><link>http://www.blogjava.net/ultramarine/category/3380.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 15:38:00 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 15:38:00 GMT</pubDate><ttl>60</ttl><item><title>使用 domj4 API 创建与修改 XML 文档</title><link>http://www.blogjava.net/ultramarine/articles/12970.html</link><dc:creator>ultramarine</dc:creator><author>ultramarine</author><pubDate>Wed, 14 Sep 2005 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/ultramarine/articles/12970.html</guid><wfw:comment>http://www.blogjava.net/ultramarine/comments/12970.html</wfw:comment><comments>http://www.blogjava.net/ultramarine/articles/12970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ultramarine/comments/commentRss/12970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ultramarine/services/trackbacks/12970.html</trackback:ping><description><![CDATA[<a href="http://www-900.ibm.com/developerWorks/cn/xml/x-dom4j.shtml#author1"><name><font color="#003366"><font size="2">Deepak Vohra</font></font></name></a><font size="2"> (</font><a href="mailto:dvohra09@yahoo.com?cc=&amp;subject=%E4%BD%BF%E7%94%A8%20dom4j%20%E8%A7%A3%E6%9E%90%20XML"><font color="#003366" size="2">dvohra09@yahoo.com</font></a>)<br>
<span class="atitle2"><p><font size="2">Web 开发人员<br>2004 年 4 月</font></p>
<blockquote><font size="2">dom4j 是一种解析 XML 文档的开放源代码 XML 框架。本文介绍如何使用包含在 dom4j 中的解析器创建并修改 XML 文档。</font></blockquote>
<p><font size="2">dom4j API 包含一个解析 XML 文档的工具。本文中将使用这个解析器创建一个示例 XML 文档。清单 1 显示了这个示例 XML 文档，catalog.xml。</font></p></span>
<p><a name="code1"><b><font color="#003366" size="2">清单 1. 示例 XML 文档（catalog.xml）</font></b></a><br>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="50%">
<tbody>
<tr>
<td><pre><code><br><font face="Courier" size="2"> <br><catalog> <br><!--An XML Catalog--> <br><br>  <journal title="XML Zone"><br>                  publisher="IBM developerWorks"&gt; <br><br><article level="Intermediate" date="December-2001"><br>  <br> <author> <br>     <firstname>Marcello</firstname> <br>     <lastname>Vitaletti</lastname> <br> </author><br>  </article><br>  </journal> <br></catalog><br></font></code></pre></td></tr></tbody></table></p>

<p><font size="2">然后使用同一个解析器修改 catalog.xml，清单 2 是修改后的 XML 文档，catalog-modified.xml。</font></p>

<p><a name="code2"><b><font color="#003366" size="2">清单 2. 修改后的 XML 文档（catalog-modified.xml）</font></b></a><br>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="50%">
<tbody>
<tr>
<td><pre><code><br><font face="Courier" size="2"> <br><catalog> <br><!--An XML catalog--> <br><br>  <journal title="XML Zone"><br>                   publisher="IBM developerWorks"&gt; <br><br><article level="Introductory" date="October-2002"><br>  <br> <author> <br>     <firstname>Ayesha</firstname> <br>     <lastname>Malik</lastname> <br> </author> <br>  </article><br>  </journal> <br></catalog><br></font></code></pre></td></tr></tbody></table></p>

<p><font size="2">与 W3C DOM API 相比，使用 dom4j 所包含的解析器的好处是 dom4j 拥有本地的 XPath 支持。DOM 解析器不支持使用 XPath 选择节点。</font></p>

<p><font size="2">本文包括以下几个部分：</font></p>

<ul xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<li><font size="2">预先设置 </font>
</li><li><font size="2">创建文档 </font>
</li><li><font size="2">修改文档</font></li>
</ul>

<p><a name="h1"><span class="atitle2"><font color="#003366" size="2">预先设置</font></span></a><br><font size="2">这个解析器可以从 </font><a href="http://dom4j.org/" target="_new" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">http://dom4j.org</font></a><font size="2"> 获取。通过设置使 <code><font face="Courier">dom4j-1.4/dom4j-full.jar</font></code> 能够在 classpath 中访问，该文件中包括 dom4j 类、XPath 引擎以及 SAX 和 DOM 接口。如果已经使用了 JAXP 解析器中包含的 SAX 和 DOM 接口，向 classpath 中增加 <code><font face="Courier">dom4j-1.4/dom4j.jar</font></code>。<code><font face="Courier">dom4j.jar </font></code>包括 dom4j 类和 XPath 引擎，但是不含 SAX 与 DOM 接口。 </font></p>

<p><a name="h2"><span class="atitle2"><font color="#003366" size="2">创建文档</font></span></a><br><font size="2">本节讨论使用 dom4j API 创建 XML 文档的过程，并创建示例 XML 文档 catalog.xml。</font></p>

<p><font size="2">使用 import 语句导入 dom4j API 类：</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><br><font face="Courier" size="2">import org.dom4j.Document;<br>import org.dom4j.DocumentHelper;<br>import org.dom4j.Element;<br></font></code></pre></td></tr></tbody></table></p>

<p><font size="2">使用 <code><font face="Courier">DocumentHelper</font></code> 类创建一个文档实例。<code><font face="Courier">DocumentHelper</font></code> 是生成 XML 文档节点的 dom4j API 工厂类。 </font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2"> Document document = DocumentHelper.createDocument();</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">使用 <code><font face="Courier">addElement()</font></code> 方法创建根元素 <code><font face="Courier">catalog</font></code>。<code><font face="Courier"> addElement()</font></code> 用于向 XML 文档中增加元素。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">Element catalogElement = document.addElement("catalog");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">在 <code><font face="Courier">catalog</font></code> 元素中使用 <code><font face="Courier">addComment()</font></code> 方法添加注释“An XML catalog”。 </font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2"> catalogElement.addComment("An XML catalog");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">在 <code><font face="Courier">catalog</font></code> 元素中使用 <code><font face="Courier">addProcessingInstruction()</font></code> 方法增加一个处理指令。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">catalogElement.addProcessingInstruction("target","text");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">在 <code><font face="Courier">catalog</font></code> 元素中使用 <code><font face="Courier">addElement()</font></code> 方法增加 <code><font face="Courier">journal</font></code> 元素。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">Element journalElement =  catalogElement.addElement("journal");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">使用 <code><font face="Courier">addAttribute()</font></code> 方法向 <code><font face="Courier">journal</font></code> 元素添加 <code><font face="Courier">title</font></code> 和 <code><font face="Courier">publisher</font></code> 属性。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">journalElement.addAttribute("title", "XML Zone");<br>         journalElement.addAttribute("publisher", "IBM developerWorks");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">向 <code><font face="Courier">article</font></code> 元素中添加 <code><font face="Courier">journal</font></code> 元素。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">Element articleElement=journalElement.addElement("article");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">为 <code><font face="Courier">article</font></code> 元素增加 <code><font face="Courier">level</font></code> 和 <code><font face="Courier">date</font></code> 属性。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">articleElement.addAttribute("level", "Intermediate");<br>      articleElement.addAttribute("date", "December-2001");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">向 <code><font face="Courier">article</font></code> 元素中增加 <code><font face="Courier">title</font></code> 元素。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">Element titleElement=articleElement.addElement("title");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">使用 <code><font face="Courier">setText()</font></code> 方法设置 <code><font face="Courier">article</font></code> 元素的文本。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">titleElement.setText("Java configuration with XML Schema");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">在 <code><font face="Courier">article</font></code> 元素中增加 <code><font face="Courier">author</font></code> 元素。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">Element authorElement=articleElement.addElement("author");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">在 <code><font face="Courier">author</font></code> 元素中增加 <code><font face="Courier">firstname</font></code> 元素并设置该元素的文本。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">Element  firstNameElement=authorElement.addElement("firstname");<br>     firstNameElement.setText("Marcello");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">在 <code><font face="Courier">author</font></code> 元素中增加 <code><font face="Courier">lastname</font></code> 元素并设置该元素的文本。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">Element lastNameElement=authorElement.addElement("lastname");<br>     lastNameElement.setText("Vitaletti");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">可以使用 <code><font face="Courier">addDocType() </font></code>方法添加文档类型说明。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">document.addDocType("catalog", null,"file://c:/Dtds/catalog.dtd");</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">这样就向 XML 文档中增加文档类型说明：</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2"></font></code></pre><br>
</td></tr></tbody></table></p>

<p><font size="2">如果文档要使用文档类型定义（DTD）文档验证则必须有 Doctype。</font></p>

<p><font size="2">XML 声明 <code><font face="Courier"></font></code> 自动添加到 XML 文档中。</font></p>

<p><font size="2">清单 3 所示的例子程序 XmlDom4J.java 用于创建 XML 文档 catalog.xml。</font></p>

<p><a name="code3"><b><font color="#003366" size="2">清单 3. 生成 XML 文档 catalog.xml 的程序（XmlDom4J.java）</font></b></a><br>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><br><font face="Courier" size="2">import org.dom4j.Document;<br>import org.dom4j.DocumentHelper;<br>import org.dom4j.Element;<br>import org.dom4j.io.XMLWriter;<br>import java.io.*;<br><br><br><br>public class XmlDom4J{<br><br><br>public void generateDocument(){<br>Document document = DocumentHelper.createDocument();<br>     Element catalogElement = document.addElement("catalog");<br>     catalogElement.addComment("An XML Catalog");<br>     catalogElement.addProcessingInstruction("target","text");<br>     Element journalElement =  catalogElement.addElement("journal");<br>     journalElement.addAttribute("title", "XML Zone");<br>     journalElement.addAttribute("publisher", "IBM developerWorks");<br><br><br>     Element articleElement=journalElement.addElement("article");<br>     articleElement.addAttribute("level", "Intermediate");<br>     articleElement.addAttribute("date", "December-2001");<br>     Element  titleElement=articleElement.addElement("title");<br>     titleElement.setText("Java configuration with XML Schema");<br>     Element authorElement=articleElement.addElement("author");<br>     Element  firstNameElement=authorElement.addElement("firstname");<br>     firstNameElement.setText("Marcello");<br>     Element lastNameElement=authorElement.addElement("lastname");<br>     lastNameElement.setText("Vitaletti");<br><br>     document.addDocType("catalog",<br>                           null,"file://c:/Dtds/catalog.dtd");<br>    try{<br>    XMLWriter output = new XMLWriter(<br>            new FileWriter( new File("c:/catalog/catalog.xml") ));<br>        output.write( document );<br>        output.close();<br>        }<br>     catch(IOException e){System.out.println(e.getMessage());}<br>}<br><br>public static void main(String[] argv){<br>XmlDom4J dom4j=new XmlDom4J();<br>dom4j.generateDocument();<br>}}<br></font></code></pre></td></tr></tbody></table></p>

<p><font size="2">这一节讨论了创建 XML 文档的过程，下一节将介绍使用 dom4j API 修改这里创建的 XML 文档。 </font></p>

<p><a name="h3"><span class="atitle2"><font color="#003366" size="2">修改文档</font></span></a><br><font size="2">这一节说明如何使用 dom4j API 修改示例 XML 文档 catalog.xml。</font></p>

<p><font size="2">使用 SAXReader 解析 XML 文档 catalog.xml：</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">SAXReader saxReader = new SAXReader();<br> Document document = saxReader.read(inputXml);</font></code></pre></td></tr></tbody></table></p>

<p><font size="2"><code><font face="Courier">SAXReader</font></code> 包含在 org.dom4j.io 包中。</font></p>

<p><font size="2"><code><font face="Courier">inputXml</font></code> 是从 c:/catalog/catalog.xml 创建的 java.io.File。使用 XPath 表达式从 <code><font face="Courier">article</font></code> 元素中获得 <code><font face="Courier">level</font></code> 节点列表。如果 <code><font face="Courier">level</font></code> 属性值是“Intermediate”则改为“Introductory”。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">List list = document.selectNodes("//article/@level" );<br>      Iterator iter=list.iterator();<br>        while(iter.hasNext()){<br>            Attribute attribute=(Attribute)iter.next();<br>               if(attribute.getValue().equals("Intermediate"))<br>               attribute.setValue("Introductory"); <br>       }</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">获取 <code><font face="Courier">article</font></code> 元素列表，从 <code><font face="Courier">article</font></code> 元素中的 <code><font face="Courier">title</font></code> 元素得到一个迭代器，并修改 <code><font face="Courier">title</font></code> 元素的文本。</font></p>

<p>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><font face="Courier" size="2">list = document.selectNodes("//article" );<br>     iter=list.iterator();<br>   while(iter.hasNext()){<br>       Element element=(Element)iter.next();<br>      Iterator iterator=element.elementIterator("title");<br>   while(iterator.hasNext()){<br>   Element titleElement=(Element)iterator.next();<br>   if(titleElement.getText().equals("Java configuration with XML Schema"))<br>     titleElement.setText("Create flexible and extensible XML schema");<br><br>    }}</font></code></pre></td></tr></tbody></table></p>

<p><font size="2">通过和 <code><font face="Courier">title</font></code> 元素类似的过程修改 <code><font face="Courier">author</font></code> 元素。</font></p>

<p><font size="2">清单 4 所示的示例程序 Dom4JParser.java 用于把 catalog.xml 文档修改成 catalog-modified.xml 文档。</font></p>

<p><a name="code4"><b><font color="#003366" size="2">清单 4. 用于修改 catalog.xml 的程序（Dom4Jparser.java）</font></b></a><br>
<table bgcolor="#cccccc" border="1" cellpadding="5" cellspacing="0" width="100%">
<tbody>
<tr>
<td><pre><code><br><font face="Courier" size="2">import org.dom4j.Document;<br>import org.dom4j.Element;<br>import org.dom4j.Attribute;<br>import java.util.List;<br>import java.util.Iterator;<br>import org.dom4j.io.XMLWriter;<br>import java.io.*;<br>import org.dom4j.DocumentException;<br>import org.dom4j.io.SAXReader; <br><br>public class Dom4JParser{<br><br> public void modifyDocument(File inputXml){<br><br>  try{<br>   SAXReader saxReader = new SAXReader();<br>   Document document = saxReader.read(inputXml);<br><br>   List list = document.selectNodes("//article/@level" );<br>   Iterator iter=list.iterator();<br>   while(iter.hasNext()){<br>    Attribute attribute=(Attribute)iter.next();<br>    if(attribute.getValue().equals("Intermediate"))<br>      attribute.setValue("Introductory"); <br><br>       }<br>   <br>   list = document.selectNodes("//article/@date" );<br>   iter=list.iterator();<br>   while(iter.hasNext()){<br>    Attribute attribute=(Attribute)iter.next();<br>    if(attribute.getValue().equals("December-2001"))<br>      attribute.setValue("October-2002");<br><br>       }<br><br>   list = document.selectNodes("//article" );<br>   iter=list.iterator();<br>   while(iter.hasNext()){<br>    Element element=(Element)iter.next();<br>    Iterator iterator=element.elementIterator("title");<br>      while(iterator.hasNext()){<br>        Element titleElement=(Element)iterator.next();<br>        if(titleElement.getText().equals("Java configuration with XML<br><br>      Schema"))<br>        titleElement.setText("Create flexible and extensible XML schema");<br><br>                                          }<br><br>                                }<br><br>    list = document.selectNodes("//article/author" );<br>    iter=list.iterator();<br>     while(iter.hasNext()){<br>     Element element=(Element)iter.next();<br>     Iterator iterator=element.elementIterator("firstname");<br>     while(iterator.hasNext()){<br>      Element firstNameElement=(Element)iterator.next();<br>      if(firstNameElement.getText().equals("Marcello"))<br>      firstNameElement.setText("Ayesha");<br>                                     }<br><br>                              }<br><br>    list = document.selectNodes("//article/author" );<br>    iter=list.iterator();<br>     while(iter.hasNext()){<br>      Element element=(Element)iter.next();<br>      Iterator iterator=element.elementIterator("lastname");<br>     while(iterator.hasNext()){<br>      Element lastNameElement=(Element)iterator.next();<br>      if(lastNameElement.getText().equals("Vitaletti"))<br>      lastNameElement.setText("Malik");<br><br>                                  }<br><br>                               }<br>     XMLWriter output = new XMLWriter(<br>      new FileWriter( new File("c:/catalog/catalog-modified.xml") ));<br>     output.write( document );<br>     output.close();<br>   }<br> <br>  catch(DocumentException e)<br>                 {<br>                  System.out.println(e.getMessage());<br>                            }<br><br>  catch(IOException e){<br>                       System.out.println(e.getMessage());<br>                    }<br> }<br><br> public static void main(String[] argv){<br><br>  Dom4JParser dom4jParser=new Dom4JParser();<br>  dom4jParser.modifyDocument(new File("c:/catalog/catalog.xml"));<br><br>                                        }<br><br>   }<br></font></code></pre></td></tr></tbody></table></p>

<p><font size="2">这一节说明了如何使用 dom4j 中的解析器修改示例 XML 文档。这个解析器不使用 DTD 或者模式验证 XML 文档。如果 XML 文档需要验证，可以解释用 dom4j 与 JAXP SAX 解析器。</font></p>

<p><a name="h4"><span class="atitle2"><font color="#003366" size="2">结束语</font></span></a><br><font size="2">包含在 dom4j 中的解析器是一种用于解析 XML 文档的非验证性工具，可以与JAXP、Crimson 或 Xerces 集成。本文说明了如何使用该解析器创建和修改 XML 文档。 </font></p>

<p><a name="resources"><span class="atitle2"><font color="#003366" size="2">参考资料</font></span></a><font size="2"> </font>
</p>
<ul>
<li><font size="2">请访问 </font><a href="http://dom4j.org/" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">dom4j Web 站点</font></a><font size="2">，那里有一个很有用的 </font><a href="http://dom4j.org/faq.html" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">FAQ</font></a><font size="2">。<br><br></font>
</li><li><font size="2">阅读 XML.com 上的文章“</font><a href="http://www.xml.com/pub/r/1052" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">dom4j: the flexible XML framework for Java</font></a><font size="2">”。<br><br></font>
</li><li><font size="2">通过 Dennis Sosnoski 的 <i xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks</i> 文章“</font><a href="http://www-900.ibm.com/developerWorks/cn/xml/x-injava/index.shtml" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">文档模型，第一部分：性能</font></a><font size="2">”（2001 年9 月）和“</font><a href="http://www-900.ibm.com/developerWorks/cn/xml/x-injava2/index.shtml" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">Java 文档模型的用法</font></a><font size="2">”（2002 年 2 月）进一步研究 dom4j。<br><br></font>
</li><li><font size="2">通过 Elliotte Rusty Harold 的“</font><a href="http://devworks.krcinfo.com/WebForms/ProductDetails.aspx?ProductID=0201771861" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">Processing XML with Java</font></a><font size="2">”了解如何编制读写 XML 文档的 Java 程序。<br><br></font>
</li><li><font size="2">在 <i xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks </i></font><a href="http://www-900.ibm.com/developerWorks/cn/xml/" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">XML</font></a><font size="2"> 和 </font><a href="http://www-900.ibm.com/developerWorks/cn/webservices/" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">Web 服务</font></a><font size="2">专区可以找到更多的 XML 资源。也可以订阅每周一期的 </font><a href="http://www-106.ibm.com/developerworks/newsletter/" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">Web 服务/XML 技巧新闻邮件</font></a><font size="2">。<br><br></font>
</li><li><font size="2">在 <i xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks </i></font><a href="http://devworks.krcinfo.com/" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#003366" size="2">Developer Bookstore</font></a><font size="2"> 可以找到各种关于 XML 的书籍。<br></font></li>
</ul>
<img src ="http://www.blogjava.net/ultramarine/aggbug/12970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ultramarine/" target="_blank">ultramarine</a> 2005-09-14 09:22 <a href="http://www.blogjava.net/ultramarine/articles/12970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML配置文件的读取处理</title><link>http://www.blogjava.net/ultramarine/articles/12963.html</link><dc:creator>ultramarine</dc:creator><author>ultramarine</author><pubDate>Wed, 14 Sep 2005 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/ultramarine/articles/12963.html</guid><wfw:comment>http://www.blogjava.net/ultramarine/comments/12963.html</wfw:comment><comments>http://www.blogjava.net/ultramarine/articles/12963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ultramarine/comments/commentRss/12963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ultramarine/services/trackbacks/12963.html</trackback:ping><description><![CDATA[<font size="2">这篇文章转自</font><a href="http://www.jdon.com/"><font size="2">www.jdon.com</font></a><font size="2">，也是一个很好的学习java的站点。</font>

<p><font size="2">内容：</font></p>

<p><font size="2">XML配置文件的读取处理<br>板桥里人 jdon.com 2002/2</font></p>

<p><font size="2">Java和XML是黄金组合,网上已经有很多文章介绍,XML作为电子商务中数据交换,已经有其不可替代的作用,但是在平时系统开发中,我们不一定都用到数据交换,是不是无法使用XML了?</font></p>

<p><font size="2">当然不是,现在已经有一个新趋势,java程序的配置文件都开始使用XML格式,以前是使用类似windows的
INI格式.(Java中也有Propertiesy这样的类专门处理这样的属性配置文件).使用XML作为Java的配置文件有很多好处,从
Tomcat的安装配置文件和J2ee的配置文件中,我们已经看到XML的普遍应用,让我们也跟随流行趋势用XML武装起来.</font></p>

<p><font size="2">现在关键是如何读取XML配置文件?有好几种XML解析器:主要有DOM和SAX ,这些区别网上文章介绍很多.</font></p>

<p><font size="2">在apache的XML项目组中,目前有Xerces Xalan Cocoon几个开发XML相关技术的project.Tomcat本身使用的是 Sun 的 JAXP,而其XSL Taglib project中使用Xerces解析器.</font></p>

<p><font size="2">好了,上面都是比较烦人的理论问题,还是赶快切入XML的配置文件的读取吧.</font></p>

<p><font size="2">在我们的程序中,通常要有一些根据主机环境确定的变量.比如数据库访问用户名和密码,不同的主机可能设置不一样.只要更改XML配置文件,就可以正常运行.</font></p>

<p><font size="2"><myenv></myenv></font></p>

<p><font size="2"><datasource><br><dbhost>localhost</dbhost><br><dbname>sqlname</dbname><br><dbuser>username</dbuser><br><dbpassword>password</dbpassword><br></datasource></font></p>

<p><font size="2"></font></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p><br><font size="2">上面这个myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目录下.</font></p>

<p><font size="2">我们编制一个Java程序直接读取,将dbhost dbuser dbpassword提取出来供其他程序访问数据库用.</font></p>

<p><font size="2">目前使用SAX比较的多,与DOM主要区别是
SAX是一行一行读取XML文件进行分析,适合比较大文件,DOM是一次性读入内存,显然不能对付大文件.这里我们使用SAX解析,由于SAX解析器不断
在发展,网上有不少文章是针对老版本的.如果你使用JDK1.4 ,可以参考 使用SAX处理XML文档
一文.这里的程序是根据其改进并且经过实践调试得来的.</font></p>

<p><font size="2">对上面myenv.xml读取的Java程序:</font></p>

<p><font size="2">import org.xml.sax.Attributes;<br>import org.xml.sax.helpers.DefaultHandler;<br>import org.xml.sax.SAXException; <br>import java.util.Properties;</font></p>

<p><font size="2">//使用DefaultHandler的好处 是 不必陈列出所有方法,<br>public class ConfigParser extends DefaultHandler {</font></p>

<p><font size="2">////定义一个Properties 用来存放 dbhost dbuser dbpassword的值<br>private Properties props;</font></p>

<p><font size="2">private String currentSet;<br>private String currentName;<br>private StringBuffer currentValue = new StringBuffer();</font></p>

<p><font size="2">//构建器初始化props<br>public ConfigParser() {</font></p>

<p><font size="2">this.props = new Properties();<br>}</font></p>

<p><font size="2">public Properties getProps() {<br>return this.props;<br>}</font></p>

<p><font size="2">//定义开始解析元素的方法. 这里是将<xxx>中的名称xxx提取出来.<br>public void startElement(String uri, String localName, String qName, Attributes attributes) <br>throws SAXException {<br>currentValue.delete(0, currentValue.length());<br>this.currentName =qName;</xxx></font></p>

<p><font size="2">}</font></p>

<p><font size="2">//这里是将<xxx></xxx>之间的值加入到currentValue</font></p>

<p><font size="2">public void characters(char[] ch, int start, int length) throws SAXException { </font></p>

<p><font size="2">currentValue.append(ch, start, length);</font></p>

<p><font size="2">}</font></p>

<p><font size="2">//在遇到结束后,将之前的名称和值一一对应保存在props中</font></p>

<p><font size="2">public void endElement(String uri, String localName, String qName) throws SAXException {</font></p>

<p><font size="2">props.put(qName.toLowerCase(), currentValue.toString().trim());<br>}</font></p>

<p><font size="2">}</font></p>

<p><br><font size="2">上面的这个解析程序比较简单吧? 其实解析XML就是这么简单.</font></p>

<p><font size="2">现在我们已经将dbhost dbuser dbpassword的值localhost sqlname username password提取了出来.但是这只是在在解析器内部,我们的程序还不能访问.需要再编制一个程序.</font></p>

<p>&nbsp;</p>

<p><font size="2">import java.util.Properties;<br>import javax.xml.parsers.SAXParser;<br>import javax.xml.parsers.SAXParserFactory;<br>import java.net.URL;</font></p>

<p><font size="2">public class ParseXML{</font></p>

<p><font size="2">//定义一个Properties 用来存放 dbhost dbuser dbpassword的值<br>private Properties props;</font></p>

<p><font size="2">//这里的props<br>public Properties getProps() {<br>return this.props;<br>}</font></p>

<p><font size="2">public void parse(String filename) throws Exception {</font></p>

<p><font size="2">//将我们的解析器对象化<br>ConfigParser handler = new ConfigParser();</font></p>

<p><font size="2">//获取SAX工厂对象<br>SAXParserFactory factory = SAXParserFactory.newInstance();<br>factory.setNamespaceAware(false);<br>factory.setValidating(false);</font></p>

<p><font size="2">//获取SAX解析<br>SAXParser parser = factory.newSAXParser();</font></p>

<p><font size="2">//得到配置文件myenv.xml所在目录. tomcat中是在WEB-INF/classes<br>//下例中BeansConstants是用来存放xml文件中配置信息的类,可以自己代替或定义<br>URL confURL = BeansConstants.class.getClassLoader().getResource(filename);</font></p>

<p><font size="2">try<br>{<br>//将解析器和解析对象myenv.xml联系起来,开始解析 <br>parser.parse(confURL.toString(), handler); <br>//获取解析成功后的属性 以后 我们其他应用程序只要调用本程序的props就可以提取出属性名称和值了<br>props = handler.getProps();<br>}finally{<br>factory=null;<br>parser=null;<br>handler=null;<br>}</font></p>

<p><font size="2">}</font></p>

<p><font size="2">}</font></p>

<p><br><font size="2">由于我们的XML文件是使用最简单的形式 ,因此解析器相对简单,但是这已经足够对付我们的配置文件了.</font></p>

<font size="2">判断一个程序系统的先进性,我们先看看他的配置文件,如果还在使用老套的xxx=123 这样类似.ini的文件,<br>我们也许会微微一笑,他又落伍了..... </font><img src ="http://www.blogjava.net/ultramarine/aggbug/12963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ultramarine/" target="_blank">ultramarine</a> 2005-09-14 09:19 <a href="http://www.blogjava.net/ultramarine/articles/12963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>