dom4j讀取某個元素的某個屬性

一、dom4j介紹
dom4j是一個Java的XML API,類似於jdom,用來讀寫XML文件的。dom4j是一個非常非常優秀的JavaXMLAPI,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在IBMdeveloperWorks上面可以找到一篇文章,對主流的Java XMLAPI進行的性能、功能和易用性的評測,dom4j無論在那個方面都是非常出色的。如今你可以看到越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這是必須使用的jar包,Hibernate用它來讀寫配置文件。
dom4j主要接口都在org.dom4j這個包裏定義:   
Attribute Attribute定義了XML的屬性
BranchBranch爲能夠包含子節點的節點如XML元素(Element)和文檔(Docuemnts)定義了一個公共的行爲,
CDATA CDATA 定義了XML CDATA 區域
CharacterData CharacterData是一個標識藉口,標識基於字符的節點。如CDATA,Comment,Text.
Comment Comment 定義了XML註釋的行爲
Document 定義了XML文檔
DocumentType DocumentType 定義XML DOCTYPE聲明
Element Element定義XML 元素
ElementHandler ElementHandler定義了 Element 對象的處理器
ElementPath 被 ElementHandler 使用,用於取得當前正在處理的路徑層次信息
Entity Entity定義 XML entity
Node Node爲所有的dom4j中XML節點定義了多態行爲
NodeFilter NodeFilter定義了在dom4j節點中產生的一個濾鏡或謂詞的行爲(predicate)
ProcessingInstruction ProcessingInstruction 定義 XML 處理指令.
Text Text 定義XML 文本節點.
Visitor Visitor 用於實現Visitor模式.
XPath XPath 在分析一個字符串後會提供一個XPath 表達式
看名字大致就知道它們的涵義如何了。要想弄懂這套接口,關鍵的是要明白接口的繼承關係:
interface java.lang.Cloneable
interface org.dom4j.Node
interface org.dom4j.Attribute
interface org.dom4j.Branch
interface org.dom4j.Document
interface org.dom4j.Element
interface org.dom4j.CharacterData
interface org.dom4j.CDATA
interface org.dom4j.Comment
interface org.dom4j.Text
interface org.dom4j.DocumentType
interface org.dom4j.Entity
interface org.dom4j.ProcessingInstruction
一目瞭然,很多事情都清楚了。大部分都是由Node繼承來的。知道這些關係,將來寫程序就不會出現ClassCastException了。
二、使用dom4j創建xml文檔
Document document = DocumentHelper.createDocument();
通過這句定義一個XML文檔對象。
Element root = document.addElement("根節點名稱");
通過這句定義一個XML元素,這裏添加的是根節點。
Element有幾個重要的方法:
addComment : 添加註釋
addAttribute : 添加屬性
addElement : 添加子元素
最後通過XMLWriter生成物理文件,默認生成的XML文件排版格式比較亂,可以通過OutputFormat類格式化輸出,默認採用createCompactFormat()顯示比較緊湊,最好使用createPrettyPrint()。
實例代碼
public static void main(String[] args) {
// 創建文檔。
Document document = DocumentHelper.createDocument();
// 設置文檔DocType,這裏爲了舉例,添加hibernate的DocType
document.addDocType("hibernate-configuration",
"-//Hibernate/Hibernate Configuration DTD 3.0//EN","http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd");
// 文檔增加節點,即根節點,一個文檔只能有一個根節點,多加出錯
Element root = document.addElement("skills");
// 添加註釋
root.addComment("第一個技能");
// 根節點下添加節點
Element first = root.addElement("skill");
// 節點添加屬性
first.addAttribute("name", "獨孤九劍");
// 節點下添加節點
Element info = first.addElement("info");
// 節點設置內容數據
info.setText("爲獨孤求敗所創,變化萬千,凌厲無比。其傳人主要有風清揚、令狐沖。");

// 同理增加其他節點,內容,屬性等
Element second = root.addElement("skill");
second.addAttribute("name", "葵花寶典");
Element info2 = second.addElement("info");
info2.setText("宦官所創,博大精深,而且兇險至極。練寶典功夫時,首先要自宮淨身。");

// 創建節點
Element third = DocumentHelper.createElement_x("skill");
// 將節點加入到根節點中
root.add(third);
// 創建屬性,第一個參數指定了擁有者,也可以爲null,指定擁有者
Attribute name = DocumentHelper.createAttribute(third, "name","北冥神功");
// 將屬性加入到節點上
third.add(name);
// 創建子節點並加入到節點中
Element info3 = DocumentHelper.createElement_x("info");
info3.setText("逍遙派的頂級內功之一,能吸人內力轉化爲自己所有,威力無窮。");
third.add(info3);

try {
// 創建格式化類
OutputFormat format = OutputFormat.createPrettyPrint();
// 設置編碼格式,默認UTF-8
format.setEncoding("UTF-8");
// 創建輸出流,此處要使用Writer,需要指定輸入編碼格式,使用OutputStream則不用
FileOutputStream fos = newFileOutputStream("d:/skills.xml");
// 創建xml輸出流
XMLWriter writer = new XMLWriter(fos, format);
// 生成xml文件
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}

生成XML文件內容
<?xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<skills>
<!--第一個技能-->
<skill name="獨孤九劍">
<info>爲獨孤求敗所創,變化萬千,凌厲無比。其傳人主要有風清揚、令狐沖。</info>
</skill>
<skill name="葵花寶典">
<info>宦官所創,博大精深,而且兇險至極。練寶典功夫時,首先要自宮淨身。</info>
</skill>
<skill name="北冥神功">
<info>逍遙派的頂級內功之一,能吸人內力轉化爲自己所有,威力無窮。</info>
</skill>
</skills>


三、使用dom4j解析xml文件
1. 構建dom4j樹
org.dom4j.io提供了兩個類:SAXReader和DOMReader,DOMReader只能一個現有的w3cDOM樹構建dom4j樹,即只能從一個org.w3c.dom.Document中構建org.dom4j.Document樹,而SAXReader則使用SAX解析器,從不同的輸入源構建dom4j樹,如可以從xml文件中讀取並構建dom4j樹。
實例代碼:使用SAXReader解析
SAXReader reader = new SAXReader();
Document document = reader.read(newFile("d:/skills.xml"));

實例代碼:使用DOMReader解析
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
File file = new File("d:/skills.xml");
org.w3c.dom.Document domDocument = db.parse(file);
DOMReader reader = new DOMReader();
org.dom4j.Document document = reader.read(domDocument);
2. 獲取節點
獲得dom4j樹之後,可以根據dom4j樹獲取節點。首先獲取根節點,然後根據根節點獲取其子節點。
實例代碼:訪問根節點
Element root = document.getRootElement();

實例代碼:訪問所有子節點
List skills = root.elements();
for (Iterator<?> it =skills.iterator(); it.hasNext();) {
Element e = (Element) it.next();
//TODO
}

實例代碼:訪問指定名稱的節點,如訪問名稱爲“skill”的全部節點
List skills = root.elements("skill");
for (Iterator<?> it =skills.iterator(); it.hasNext();) {
Element e = (Element) it.next();
//TODO
}

實例代碼:訪問指定名稱的第一個節點
Element skill = root.element("skill");

實例代碼:迭代某個元素的所有子元素,如迭代root
for(Iterator<Element> it =root.elementIterator();it.hasNext();){
Element e = it.next();
//TODO
}


3. 獲取屬性
獲取節點後,可以根據節點獲取屬性,獲得方式與獲取節點類似。
實例代碼:獲取指定名稱的元素
Element skill = root.element("skill");
Attribute attr1 = skill.attribute("name");

實例代碼:按照屬性順序獲取屬性,
Element skill = root.element("skill");
Attribute attr2 = skill.attribute(0);

實例代碼:獲取某節點下全部屬性1
Element skill = root.element("skill");
List<Attribute> list =skill.attributes();
for (Iterator<Attribute> it =list.iterator(); it.hasNext();) {
Attribute attr = it.next();
// TODO
}

實例代碼:獲取某節點下全部屬性2
Element skill = root.element("skill");
for (Iterator<Attribute> it =skill.attributeIterator(); it.hasNext();) {
Attribute attr = it.next();
// TODO
}
4. 使用XPath獲取節點和屬性
Dom4j 中集成了對XPath的支持。在選擇節點時,可以直接使用XPath表達式。這種方式更加方便,簡潔,官方文檔中推薦使用該種方式。
實例代碼:要選擇所有的<skill>元素的name屬性
List list =document.selectNodes("//skills/skill/@name");
for (Iterator it = list.iterator(); it.hasNext();) {
Attribute attr = (Attribute) it.next();
//TODO
}
注意:爲了能夠編譯執行上述使用XPath表達式的代碼,需要配置dom4j安裝包中自帶的jaxen包,你也可以從http://sourceforge.net/products/jaxen/上下載jaxen。jaxen是一個用java開發的XPath引擎,用於配合各種基於XML的對象模型,如DOM,dom4j和JDOM。在dom4-1.6.1目錄下,有一個lib子目錄,其中有個jaxen-1.1-beta-6.jar文件,需要在classpath環境變量中配置該文件的全路徑名。

四、使用dom4j修改xml文件
修改xml文件,需要先獲取dom4j樹(即Document),通常欲修改節點需要先獲得該節點或其父節點,欲修改屬性,需要先獲得該屬性所在的節點和該屬性。
增加操作:參照前文。
刪除操作:
實例代碼:刪除某節點
Element root = document.getRootElement();
Element skill = root.element("skill");
root.remove(skill);

實例代碼:刪除指定名稱的屬性
Element skill = root.element("skill");
skill.remove(skill.attribute("name"));
修改操作:
實例代碼:修改節點名稱和節點值
Element skill = root.element("skill");
skill.setName("new_skill");
skill.setText("你好");

實例代碼:修改屬性值
Attribute attr = skill.attribute("name");
attr.setText("newName");
屬性名稱無法修改,欲修改屬性名稱,可以先刪除舊屬性,再增加新屬性

五、常用方法
1.Element元素API
Method Comment
getQName() 元素的QName對象
getNamespace() 元素所屬的Namespace對象
getNamespacePrefix() 元素所屬的Namespace對象的prefix
getNamespaceURI() 元素所屬的Namespace對象的URI
getName() 元素的local name
getQualifiedName() 元素的qualified name
getText() 元素所含有的text內容,如果內容爲空則返回一個空字符串而不是null
getTextTrim() 元素所含有的text內容,其中連續的空格被轉化爲單個空格,該方法不會返回null
attributeIterator() 元素屬性的iterator,其中每個元素都是Attribute對象
attributeValue() 元素的某個指定屬性所含的值
elementIterator() 元素的子元素的iterator,其中每個元素都是Element對象
element() 元素的某個指定(qualified name或者local name)的子元素
elementText() 元素的某個指定(qualified name或者localname)的子元素中的text信息
getParent 元素的父元素
getPath() 元素的XPath表達式,其中父元素的qualified name和子元素的qualifiedname之間使用"/"分隔
isTextOnly() 是否該元素只含有text或是空元素
isRootElement() 是否該元素是XML樹的根節點
2. Attribute屬性API
Method Comment
getQName() 屬性的QName對象
getNamespace() 屬性所屬的Namespace對象
getNamespacePrefix() 屬性所屬的Namespace對象的prefix
getNamespaceURI() 屬性所屬的Namespace對象的URI
getName() 屬性的local name
getQualifiedName() 屬性的qualified name
getValue() 屬性的值
2. 字符串轉化
實例代碼:把節點,屬性,文檔等轉化成字符串,使用asXML()方法。
String docXmlText = document.asXML();
String rootXmlText = root.asXML();

實例代碼:把字符串轉換爲文檔,注意引號需要轉義
String skillString = "<skillname="xxx">神龍擺尾</skill>";
Document d = DocumentHelper.parseText(skillString);
3. 命名空間(Namespace)操作
dom4j的名稱空間信息api常用的方法有8個。
dom4j在Element和Attribute接口中定義了獲取名稱空間信息的方法,這些方法和JDOM中的方法相同。如下所示:
public java.lang.StringgetNamespacePrefix()該方法返回元素(屬性)的名稱空間前綴
public java.lang.StringgetNamespaceURI()該方法返回元素(屬性)的名稱空間
URIpublic java.lang.String getName()該方法返回元素(屬性)的本地名
public java.lang.StringgetQualifiedName()該方法返回元素(屬性)的限定名
public Namespace getNamespace()該方法返回元素本身的名稱空間
public java.util.ListadditionalNamespaces()返回某元素上附加的名稱空間聲明列表,列表中的每一個對象都是Namespace類型。
這個類的方法提供了兩個方法分別獲得名稱空間前綴和本地名。如下:
public java.lang.String getPrefix()該方法返回名稱空間前綴。
public java.lang.String getURI()該方法返回名稱空間的URI。

六、Qname介紹
Qname在使用dom4j的時候,經常見到,一般自己解析的xml很少使用這種複雜格式。
1. 來歷:qname是qualified name的簡寫
2. 構成:由名字空間(namespace)前綴(prefix)以及冒號(:),還有一個元素名稱構成
3. 舉例:
<xsl:stylesheetxmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
version="1.0">
<xsl:template match="foo">
<hr/>
</xsl:template>
</xsl:stylesheet>
xsl是名字空間前綴,template是元素名稱,xsl:template 就是一個qname。
4.總結:qname無非是有着特定格式的xml元素,其作用主要是增加了名字空間,比如有同樣的元素名稱,而名字空間不同的情況。

七、Visitor模式
dom4j對visitor的支持可以大大縮減代碼量,並且清楚易懂。這個模式很有用、很實用!
自己的類需要繼承VisitorSupport,由於VisitorSupport使用適配器模式,可以覆寫需要的方法,不需要的方法VisitorSupport提供了空實現。
實例代碼:MyVisitor,這裏將所有可以覆寫的visit方法都顯示了,可以根據需要覆寫
package piaohan.util.xml;

import org.dom4j.Attribute;
import org.dom4j.CDATA;
import org.dom4j.Comment;
import org.dom4j.Document;
import org.dom4j.DocumentType;
import org.dom4j.Element;
import org.dom4j.Entity;
import org.dom4j.Namespace;
import org.dom4j.ProcessingInstruction;
import org.dom4j.Text;
import org.dom4j.VisitorSupport;

public class MyVisitor extends VisitorSupport {

@Override
public void visit(Attribute node) {
super.visit(node);
}

@Override
public void visit(CDATA node) {
super.visit(node);
}

@Override
public void visit(Comment node) {
super.visit(node);
}

@Override
public void visit(Document document) {
super.visit(document);
}

@Override
public void visit(DocumentType documentType) {
super.visit(documentType);
}

@Override
public void visit(Element node) {
super.visit(node);
}

@Override
public void visit(Entity node) {
super.visit(node);
}

@Override
public void visit(Namespace namespace) {
super.visit(namespace);
}

@Override
public void visit(ProcessingInstruction node) {
super.visit(node);
}

@Override
public void visit(Text node) {
super.visit(node);
}
}

實例代碼:例如,這裏覆寫了處理Element的方法
@Override
public void visit(Element node) {
System.out.println(node.asXML());
}

實例代碼:程序中調用,
Element skill = root.element("skill");
MyVisitor visitor = new MyVisitor();
skill.accept(visitor);
這樣,程序會從skill節點開始,遍歷全部子節點和子屬性,註釋,CDATA等,即遍歷skill節點內部的全部元素,由於我的MyVisitor只覆寫了Element的處理方法,所以只處理所有的子節點。
程序結果:(xml內容見開篇例子)
<skill name="獨孤九劍">
<info>爲獨孤求敗所創,變化萬千,凌厲無比。其傳人主要有風清揚、令狐沖。</info>
</skill>
<info>爲獨孤求敗所創,變化萬千,凌厲無比。其傳人主要有風清揚、令狐沖。</info>



清單 1. 示例 XML 文檔(catalog.xml)

<?xml version="1.0"encoding="UTF-8"?>
<catalog>
<!--An XMLCatalog-->
<?targetinstruction?>
<journal title="XML Zone"
publisher="IBM developerWorks">
<article level="Intermediate"date="December-2001">
<title>Java configurationwith 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 XMLcatalog-->
<?targetinstruction?>
<journal title="XML Zone"
publisher="IBM developerWorks">
<article level="Introductory"date="October-2002">
<title>Create flexible andextensible XMLschemas</title>
<author>
<firstname>Ayesha</firstname>
<lastname>Malik</lastname>
</author>
</article>
</journal>
</catalog>

與 W3C DOM API 相比,使用 dom4j 所包含的解析器的好處是 dom4j 擁有本地的 XPath支持。DOM 解析器不支持使用 XPath 選擇節點。
本文包括以下幾個部分:
預先設置
創建文檔
修改文檔
預先設置
這個解析器可以從 http://dom4j.org 獲取。通過設置使 dom4j-1.4/dom4j-full.jar能夠在 classpath 中訪問,該文件中包括 dom4j 類、XPath 引擎以及 SAX 和 DOM 接口。如果已經使用了JAXP 解析器中包含的 SAX 和 DOM 接口,向 classpath 中增加 dom4j-1.4/dom4j.jar 。dom4j.jar 包括 dom4j 類和 XPath 引擎,但是不含 SAX 與 DOM 接口。
回頁首
創建文檔
本節討論使用 dom4j API 創建 XML 文檔的過程,並創建示例 XML 文檔catalog.xml。
使用 import 語句導入 dom4j API 類:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

使用 DocumentHelper 類創建一個文檔實例。 DocumentHelper 是生成 XML 文檔節點的dom4j API 工廠類。
Document document =DocumentHelper.createDocument();

使用 addElement() 方法創建根元素 catalog 。 addElement() 用於向 XML文檔中增加元素。
Element catalogElement =document.addElement("catalog");

在 catalog 元素中使用 addComment() 方法添加註釋“An XMLcatalog”。
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", "IBMdeveloperWorks");

向 article 元素中添加 journal 元素。
ElementarticleElement=journalElement.addElement("article");

爲 article 元素增加 level 和 date 屬性。
articleElement.addAttribute("level","Intermediate");
articleElement.addAttribute("date","December-2001");

向 article 元素中增加 title 元素。
ElementtitleElement=articleElement.addElement("title");

使用 setText() 方法設置 article 元素的文本。
titleElement.setText("Java configuration with XMLSchema");

在 article 元素中增加 author 元素。
ElementauthorElement=articleElement.addElement("author");

在 author 元素中增加 firstname 元素並設置該元素的文本。
ElementfirstNameElement=authorElement.addElement("firstname");
firstNameElement.setText("Marcello");

在 author 元素中增加 lastname 元素並設置該元素的文本。
ElementlastNameElement=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)文檔驗證則必須有 Doctype。
XML 聲明 <?xml version="1.0"encoding="UTF-8"?> 自動添加到 XML 文檔中。
清單 3 所示的例子程序 XmlDom4J.java 用於創建 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", "IBMdeveloperWorks");
ElementarticleElement=journalElement.addElement("article");
articleElement.addAttribute("level","Intermediate");
articleElement.addAttribute("date","December-2001");
ElementtitleElement=articleElement.addElement("title");
titleElement.setText("Java configuration with XMLSchema");
ElementauthorElement=articleElement.addElement("author");
ElementfirstNameElement=authorElement.addElement("firstname");
firstNameElement.setText("Marcello");
ElementlastNameElement=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(IOExceptione){System.out.println(e.getMessage());}
}
public static void main(String[] argv){
XmlDom4J dom4j=new XmlDom4J();
dom4j.generateDocument();
}}

這一節討論了創建 XML 文檔的過程,下一節將介紹使用 dom4j API 修改這裏創建的 XML文檔。
回頁首
修改文檔
這一節說明如何使用 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 創建的 java.io.File。使用XPath 表達式從 article 元素中獲得 level 節點列表。如果 level屬性值是“Intermediate”則改爲“Introductory”。
List list = document.selectNodes("//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("//article" );
iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iteratoriterator=element.elementIterator("title");
while(iterator.hasNext()){
Element titleElement=(Element)iterator.next();
if(titleElement.getText().equals("Java configuration withXML Schema"))
titleElement.setText("Create flexible and extensible XMLschema");
}}

通過和 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("//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("//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("//article" );
iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iteratoriterator=element.elementIterator("title");
while(iterator.hasNext()){
Element titleElement=(Element)iterator.next();
if(titleElement.getText().equals("Java configuration withXML
Schema"))
titleElement.setText("Create flexible and extensible XMLschema");
}
}
list = document.selectNodes("//article/author" );
iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iteratoriterator=element.elementIterator("firstname");
while(iterator.hasNext()){
ElementfirstNameElement=(Element)iterator.next();
if(firstNameElement.getText().equals("Marcello"))
firstNameElement.setText("Ayesha");
}
}
list = document.selectNodes("//article/author" );
iter=list.iterator();
while(iter.hasNext()){
Element element=(Element)iter.next();
Iteratoriterator=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(newFile("c:/catalog/catalog.xml"));
}
}

自已寫的:
public void parseXML(){
Document document=null;
try {
document= newSAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream("book.xml"));
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
List books=document.selectNodes("//書/小說");
for(Iterator iter = books.iterator(); iter.hasNext();){
Element element = (Element) iter.next();
System.out.println(element.getName());
System.out.println(element.getText());
System.out.println(element.attributeValue("name"));
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章