使用 domj4 API 創(chuàng)建與修改 XML 文檔
Posted on 2006-03-20 22:20 fortune 閱讀(728) 評論(0) 編輯 收藏 所屬分類: java技術(shù)
使用 domj4 API 創(chuàng)建與修改 XML 文檔
級別:入門
Deepak Vohra (dvohra09@yahoo.com)
Web 開發(fā)人員
2004 年 4 月
dom4j 是一種解析 XML 文檔的開放源代碼 XML 框架。本文介紹如何使用包含在 dom4j 中的解析器創(chuàng)建并修改 XML 文檔。
dom4j API 包含一個解析 XML 文檔的工具。本文中將使用這個解析器創(chuàng)建一個示例 XML 文檔。清單 1 顯示了這個示例 XML 文檔,catalog.xml。
清單 1. 示例 XML 文檔(catalog.xml)
然后使用同一個解析器修改 catalog.xml,清單 2 是修改后的 XML 文檔,catalog-modified.xml。
清單 2. 修改后的 XML 文檔(catalog-modified.xml)
與 W3C DOM API 相比,使用 dom4j 所包含的解析器的好處是 dom4j 擁有本地的 XPath 支持。DOM 解析器不支持使用 XPath 選擇節(jié)點(diǎn)。
本文包括以下幾個部分:
預(yù)先設(shè)置
創(chuàng)建文檔
修改文檔
預(yù)先設(shè)置
這個解析器可以從 http://dom4j.org 獲取。通過設(shè)置使 dom4j-1.4/dom4j-full.jar 能夠在 classpath 中訪問,該文件中包括 dom4j 類、XPath 引擎以及 SAX 和 DOM 接口。如果已經(jīng)使用了 JAXP 解析器中包含的 SAX 和 DOM 接口,向 classpath 中增加 dom4j-1.4/dom4j.jar。dom4j.jar 包括 dom4j 類和 XPath 引擎,但是不含 SAX 與 DOM 接口。
創(chuàng)建文檔
本節(jié)討論使用 dom4j API 創(chuàng)建 XML 文檔的過程,并創(chuàng)建示例 XML 文檔 catalog.xml。
使用 import 語句導(dǎo)入 dom4j API 類:
使用 DocumentHelper 類創(chuàng)建一個文檔實(shí)例。DocumentHelper 是生成 XML 文檔節(jié)點(diǎn)的 dom4j API 工廠類。
使用 addElement() 方法創(chuàng)建根元素 catalog。 addElement() 用于向 XML 文檔中增加元素。
在 catalog 元素中使用 addComment() 方法添加注釋“An XML catalog”。
在 catalog 元素中使用 addProcessingInstruction() 方法增加一個處理指令。
在 catalog 元素中使用 addElement() 方法增加 journal 元素。
使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 屬性。
向 article 元素中添加 journal 元素。
為 article 元素增加 level 和 date 屬性。
向 article 元素中增加 title 元素。
使用 setText() 方法設(shè)置 article 元素的文本。
在 article 元素中增加 author 元素。
在 author 元素中增加 firstname 元素并設(shè)置該元素的文本。
在 author 元素中增加 lastname 元素并設(shè)置該元素的文本。
可以使用 addDocType() 方法添加文檔類型說明。
這樣就向 XML 文檔中增加文檔類型說明:
如果文檔要使用文檔類型定義(DTD)文檔驗(yàn)證則必須有 Doctype。
XML 聲明 <?xml version="1.0" encoding="UTF-8"?> 自動添加到 XML 文檔中。
清單 3 所示的例子程序 XmlDom4J.java 用于創(chuàng)建 XML 文檔 catalog.xml。
清單 3. 生成 XML 文檔 catalog.xml 的程序(XmlDom4J.java)
這一節(jié)討論了創(chuàng)建 XML 文檔的過程,下一節(jié)將介紹使用 dom4j API 修改這里創(chuàng)建的 XML 文檔。
修改文檔
這一節(jié)說明如何使用 dom4j API 修改示例 XML 文檔 catalog.xml。
使用 SAXReader 解析 XML 文檔 catalog.xml:
SAXReader 包含在 org.dom4j.io 包中。
inputXml 是從 c:/catalog/catalog.xml 創(chuàng)建的 java.io.File。使用 XPath 表達(dá)式從 article 元素中獲得 level 節(jié)點(diǎn)列表。如果 level 屬性值是“Intermediate”則改為“Introductory”。
獲取 article 元素列表,從 article 元素中的 title 元素得到一個迭代器,并修改 title 元素的文本。
通過和 title 元素類似的過程修改 author 元素。
清單 4 所示的示例程序 Dom4JParser.java 用于把 catalog.xml 文檔修改成 catalog-modified.xml 文檔。
清單 4. 用于修改 catalog.xml 的程序(Dom4Jparser.java)
這一節(jié)說明了如何使用 dom4j 中的解析器修改示例 XML 文檔。這個解析器不使用 DTD 或者模式驗(yàn)證 XML 文檔。如果 XML 文檔需要驗(yàn)證,可以解釋用 dom4j 與 JAXP SAX 解析器。
結(jié)束語
包含在 dom4j 中的解析器是一種用于解析 XML 文檔的非驗(yàn)證性工具,可以與JAXP、Crimson 或 Xerces 集成。本文說明了如何使用該解析器創(chuàng)建和修改 XML 文檔。
參考資料
請?jiān)L問 dom4j Web 站點(diǎn),那里有一個很有用的 FAQ。
閱讀 XML.com 上的文章“dom4j: the flexible XML framework for Java”。
通過 Dennis Sosnoski 的 developerWorks 文章“文檔模型,第一部分:性能”(2001 年9 月)和“Java 文檔模型的用法”(2002 年 2 月)進(jìn)一步研究 dom4j。
通過 Elliotte Rusty Harold 的“Processing XML with Java”了解如何編制讀寫 XML 文檔的 Java 程序。
在 developerWorks XML 和 Web 服務(wù)專區(qū)可以找到更多的 XML 資源。也可以訂閱每周一期的 Web 服務(wù)/XML 技巧新聞郵件。
在 developerWorks Developer Bookstore 可以找到各種關(guān)于 XML 的書籍。
了解如何才能成為一名 IBM 認(rèn)證的 XML 及相關(guān)技術(shù)的開發(fā)人員。
CSDN上的參考。
http://dev.csdn.net/develop/article/22/22753.shtm
級別:入門
Deepak Vohra (dvohra09@yahoo.com)
Web 開發(fā)人員
2004 年 4 月
dom4j 是一種解析 XML 文檔的開放源代碼 XML 框架。本文介紹如何使用包含在 dom4j 中的解析器創(chuàng)建并修改 XML 文檔。
dom4j API 包含一個解析 XML 文檔的工具。本文中將使用這個解析器創(chuàng)建一個示例 XML 文檔。清單 1 顯示了這個示例 XML 文檔,catalog.xml。
清單 1. 示例 XML 文檔(catalog.xml)
代碼: |
<?xml version="1.0" encoding="UTF-8"?> <catalog> <!--An XML Catalog--> <?target instruction?> ? <journal title="XML Zone" ? ? ? ? ? ? ? ? ? publisher="IBM developerWorks"> <article level="Intermediate" date="December-2001"> ?<title>Java configuration with XML Schema</title> ?<author> ? ? ?<firstname>Marcello</firstname> ? ? ?<lastname>Vitaletti</lastname> ?</author> ? </article> ? </journal> </catalog> |
然后使用同一個解析器修改 catalog.xml,清單 2 是修改后的 XML 文檔,catalog-modified.xml。
清單 2. 修改后的 XML 文檔(catalog-modified.xml)
代碼: |
<?xml version="1.0" encoding="UTF-8"?> <catalog> <!--An XML catalog--> <?target instruction?> ? <journal title="XML Zone" ? ? ? ? ? ? ? ? ? ?publisher="IBM developerWorks"> <article level="Introductory" date="October-2002"> ?<title>Create flexible and extensible XML schemas</title> ?<author> ? ? ?<firstname>Ayesha</firstname> ? ? ?<lastname>Malik</lastname> ?</author> ? </article> ? </journal> </catalog> |
與 W3C DOM API 相比,使用 dom4j 所包含的解析器的好處是 dom4j 擁有本地的 XPath 支持。DOM 解析器不支持使用 XPath 選擇節(jié)點(diǎn)。
本文包括以下幾個部分:
預(yù)先設(shè)置
創(chuàng)建文檔
修改文檔
預(yù)先設(shè)置
這個解析器可以從 http://dom4j.org 獲取。通過設(shè)置使 dom4j-1.4/dom4j-full.jar 能夠在 classpath 中訪問,該文件中包括 dom4j 類、XPath 引擎以及 SAX 和 DOM 接口。如果已經(jīng)使用了 JAXP 解析器中包含的 SAX 和 DOM 接口,向 classpath 中增加 dom4j-1.4/dom4j.jar。dom4j.jar 包括 dom4j 類和 XPath 引擎,但是不含 SAX 與 DOM 接口。
創(chuàng)建文檔
本節(jié)討論使用 dom4j API 創(chuàng)建 XML 文檔的過程,并創(chuàng)建示例 XML 文檔 catalog.xml。
使用 import 語句導(dǎo)入 dom4j API 類:
代碼: |
import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; |
使用 DocumentHelper 類創(chuàng)建一個文檔實(shí)例。DocumentHelper 是生成 XML 文檔節(jié)點(diǎn)的 dom4j API 工廠類。
代碼: |
Document document = DocumentHelper.createDocument(); |
使用 addElement() 方法創(chuàng)建根元素 catalog。 addElement() 用于向 XML 文檔中增加元素。
代碼: |
Element catalogElement = document.addElement("catalog"); |
在 catalog 元素中使用 addComment() 方法添加注釋“An XML catalog”。
代碼: |
catalogElement.addComment("An XML catalog"); |
在 catalog 元素中使用 addProcessingInstruction() 方法增加一個處理指令。
代碼: |
catalogElement.addProcessingInstruction("target","text"); |
在 catalog 元素中使用 addElement() 方法增加 journal 元素。
代碼: |
Element journalElement =? catalogElement.addElement("journal"); |
使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 屬性。
代碼: |
journalElement.addAttribute("title", "XML Zone"); ? ? ? ? ?journalElement.addAttribute("publisher", "IBM developerWorks"); |
向 article 元素中添加 journal 元素。
代碼: |
Element articleElement=journalElement.addElement("article"); |
為 article 元素增加 level 和 date 屬性。
代碼: |
articleElement.addAttribute("level", "Intermediate"); ? ? ? articleElement.addAttribute("date", "December-2001"); |
向 article 元素中增加 title 元素。
代碼: |
Element titleElement=articleElement.addElement("title"); |
使用 setText() 方法設(shè)置 article 元素的文本。
代碼: |
titleElement.setText("Java configuration with XML Schema"); |
在 article 元素中增加 author 元素。
代碼: |
Element authorElement=articleElement.addElement("author"); |
在 author 元素中增加 firstname 元素并設(shè)置該元素的文本。
代碼: |
Element? firstNameElement=authorElement.addElement("firstname"); ? ? ?firstNameElement.setText("Marcello"); |
在 author 元素中增加 lastname 元素并設(shè)置該元素的文本。
代碼: |
Element lastNameElement=authorElement.addElement("lastname"); ? ? ?lastNameElement.setText("Vitaletti"); |
可以使用 addDocType() 方法添加文檔類型說明。
代碼: |
document.addDocType("catalog", null,"file://c:/Dtds/catalog.dtd"); |
這樣就向 XML 文檔中增加文檔類型說明:
代碼: |
<!DOCTYPE catalog SYSTEM "file://c:/Dtds/catalog.dtd"> |
如果文檔要使用文檔類型定義(DTD)文檔驗(yàn)證則必須有 Doctype。
XML 聲明 <?xml version="1.0" encoding="UTF-8"?> 自動添加到 XML 文檔中。
清單 3 所示的例子程序 XmlDom4J.java 用于創(chuàng)建 XML 文檔 catalog.xml。
清單 3. 生成 XML 文檔 catalog.xml 的程序(XmlDom4J.java)
代碼: |
import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.XMLWriter; import java.io.*; public class XmlDom4J{ public void generateDocument(){ Document document = DocumentHelper.createDocument(); ? ? ?Element catalogElement = document.addElement("catalog"); ? ? ?catalogElement.addComment("An XML Catalog"); ? ? ?catalogElement.addProcessingInstruction("target","text"); ? ? ?Element journalElement =? catalogElement.addElement("journal"); ? ? ?journalElement.addAttribute("title", "XML Zone"); ? ? ?journalElement.addAttribute("publisher", "IBM developerWorks"); ? ? ?Element articleElement=journalElement.addElement("article"); ? ? ?articleElement.addAttribute("level", "Intermediate"); ? ? ?articleElement.addAttribute("date", "December-2001"); ? ? ?Element? titleElement=articleElement.addElement("title"); ? ? ?titleElement.setText("Java configuration with XML Schema"); ? ? ?Element authorElement=articleElement.addElement("author"); ? ? ?Element? firstNameElement=authorElement.addElement("firstname"); ? ? ?firstNameElement.setText("Marcello"); ? ? ?Element lastNameElement=authorElement.addElement("lastname"); ? ? ?lastNameElement.setText("Vitaletti"); ? ? ?document.addDocType("catalog", ? ? ? ? ? ? ? ? ? ? ? ? ? ?null,"file://c:/Dtds/catalog.dtd"); ? ? try{ ? ? XMLWriter output = new XMLWriter( ? ? ? ? ? ? new FileWriter( new File("c:/catalog/catalog.xml") )); ? ? ? ? output.write( document ); ? ? ? ? output.close(); ? ? ? ? } ? ? ?catch(IOException e){System.out.println(e.getMessage());} } public static void main(String[] argv){ XmlDom4J dom4j=new XmlDom4J(); dom4j.generateDocument(); } } |
這一節(jié)討論了創(chuàng)建 XML 文檔的過程,下一節(jié)將介紹使用 dom4j API 修改這里創(chuàng)建的 XML 文檔。
修改文檔
這一節(jié)說明如何使用 dom4j API 修改示例 XML 文檔 catalog.xml。
使用 SAXReader 解析 XML 文檔 catalog.xml:
代碼: |
SAXReader saxReader = new SAXReader(); ?Document document = saxReader.read(inputXml); |
SAXReader 包含在 org.dom4j.io 包中。
inputXml 是從 c:/catalog/catalog.xml 創(chuàng)建的 java.io.File。使用 XPath 表達(dá)式從 article 元素中獲得 level 節(jié)點(diǎn)列表。如果 level 屬性值是“Intermediate”則改為“Introductory”。
代碼: |
List list = document.selectNodes("http://article/@level" ); ? ? ? Iterator iter=list.iterator(); ? ? ? ? while(iter.hasNext()){ ? ? ? ? ? ? Attribute attribute=(Attribute)iter.next(); ? ? ? ? ? ? ? ?if(attribute.getValue().equals("Intermediate")) ? ? ? ? ? ? ? ?attribute.setValue("Introductory"); ? ? ? ?} |
獲取 article 元素列表,從 article 元素中的 title 元素得到一個迭代器,并修改 title 元素的文本。
代碼: |
list = document.selectNodes("http://article" ); ? ? ?iter=list.iterator(); ? ?while(iter.hasNext()){ ? ? ? ?Element element=(Element)iter.next(); ? ? ? Iterator iterator=element.elementIterator("title"); ? ?while(iterator.hasNext()){ ? ?Element titleElement=(Element)iterator.next(); ? ?if(titleElement.getText().equals("Java configuration with XML Schema")) ? ? ?titleElement.setText("Create flexible and extensible XML schema"); ? ? }} ? |
通過和 title 元素類似的過程修改 author 元素。
清單 4 所示的示例程序 Dom4JParser.java 用于把 catalog.xml 文檔修改成 catalog-modified.xml 文檔。
清單 4. 用于修改 catalog.xml 的程序(Dom4Jparser.java)
代碼: |
import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Attribute; import java.util.List; import java.util.Iterator; import org.dom4j.io.XMLWriter; import java.io.*; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; public class Dom4JParser{ ?public void modifyDocument(File inputXml){ ? try{ ? ?SAXReader saxReader = new SAXReader(); ? ?Document document = saxReader.read(inputXml); ? ?List list = document.selectNodes("http://article/@level" ); ? ?Iterator iter=list.iterator(); ? ?while(iter.hasNext()){ ? ? Attribute attribute=(Attribute)iter.next(); ? ? if(attribute.getValue().equals("Intermediate")) ? ? ? attribute.setValue("Introductory"); ? ? ? ?} ? ? ? ?list = document.selectNodes("http://article/@date" ); ? ?iter=list.iterator(); ? ?while(iter.hasNext()){ ? ? Attribute attribute=(Attribute)iter.next(); ? ? if(attribute.getValue().equals("December-2001")) ? ? ? attribute.setValue("October-2002"); ? ? ? ?} ? ?list = document.selectNodes("http://article" ); ? ?iter=list.iterator(); ? ?while(iter.hasNext()){ ? ? Element element=(Element)iter.next(); ? ? Iterator iterator=element.elementIterator("title"); ? ? ? while(iterator.hasNext()){ ? ? ? ? Element titleElement=(Element)iterator.next(); ? ? ? ? if(titleElement.getText().equals("Java configuration with XML ? ? ? Schema")) ? ? ? ? titleElement.setText("Create flexible and extensible XML schema"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? list = document.selectNodes("http://article/author" ); ? ? iter=list.iterator(); ? ? ?while(iter.hasNext()){ ? ? ?Element element=(Element)iter.next(); ? ? ?Iterator iterator=element.elementIterator("firstname"); ? ? ?while(iterator.hasNext()){ ? ? ? Element firstNameElement=(Element)iterator.next(); ? ? ? if(firstNameElement.getText().equals("Marcello")) ? ? ? firstNameElement.setText("Ayesha"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? list = document.selectNodes("http://article/author" ); ? ? iter=list.iterator(); ? ? ?while(iter.hasNext()){ ? ? ? Element element=(Element)iter.next(); ? ? ? Iterator iterator=element.elementIterator("lastname"); ? ? ?while(iterator.hasNext()){ ? ? ? Element lastNameElement=(Element)iterator.next(); ? ? ? if(lastNameElement.getText().equals("Vitaletti")) ? ? ? lastNameElement.setText("Malik"); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?} ? ? ?XMLWriter output = new XMLWriter( ? ? ? new FileWriter( new File("c:/catalog/catalog-modified.xml") )); ? ? ?output.write( document ); ? ? ?output.close(); ? ?} ? ? catch(DocumentException e) ? ? ? ? ? ? ? ? ?{ ? ? ? ? ? ? ? ? ? System.out.println(e.getMessage()); ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? catch(IOException e){ ? ? ? ? ? ? ? ? ? ? ? ?System.out.println(e.getMessage()); ? ? ? ? ? ? ? ? ? ? } ?} ?public static void main(String[] argv){ ? Dom4JParser dom4jParser=new Dom4JParser(); ? dom4jParser.modifyDocument(new File("c:/catalog/catalog.xml")); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? } ? ?} |
這一節(jié)說明了如何使用 dom4j 中的解析器修改示例 XML 文檔。這個解析器不使用 DTD 或者模式驗(yàn)證 XML 文檔。如果 XML 文檔需要驗(yàn)證,可以解釋用 dom4j 與 JAXP SAX 解析器。
結(jié)束語
包含在 dom4j 中的解析器是一種用于解析 XML 文檔的非驗(yàn)證性工具,可以與JAXP、Crimson 或 Xerces 集成。本文說明了如何使用該解析器創(chuàng)建和修改 XML 文檔。
參考資料
請?jiān)L問 dom4j Web 站點(diǎn),那里有一個很有用的 FAQ。
閱讀 XML.com 上的文章“dom4j: the flexible XML framework for Java”。
通過 Dennis Sosnoski 的 developerWorks 文章“文檔模型,第一部分:性能”(2001 年9 月)和“Java 文檔模型的用法”(2002 年 2 月)進(jìn)一步研究 dom4j。
通過 Elliotte Rusty Harold 的“Processing XML with Java”了解如何編制讀寫 XML 文檔的 Java 程序。
在 developerWorks XML 和 Web 服務(wù)專區(qū)可以找到更多的 XML 資源。也可以訂閱每周一期的 Web 服務(wù)/XML 技巧新聞郵件。
在 developerWorks Developer Bookstore 可以找到各種關(guān)于 XML 的書籍。
了解如何才能成為一名 IBM 認(rèn)證的 XML 及相關(guān)技術(shù)的開發(fā)人員。
CSDN上的參考。
http://dev.csdn.net/develop/article/22/22753.shtm