Posted on 2007-06-07 17:26
泰仔在線 閱讀(4119)
評論(7) 編輯 收藏 所屬分類:
Java 相關
1. 概述
解析XML文檔方面有不少的方法,也有不少的工具包可用,這里介紹的是來自Apache Jakarta的Digester,使用其解析XML文件非常方便而不需要過多的關心底層的具體解析過程。
Digester最早出現在Struts中,后來隨著Struts的發展以及其的公用性而被提到commens中獨自立項,其底層實現的是SAX解析。當前版本為:1.5
2. 正文
1. 安裝與配置
使用Digester需要如下幾個軟件包:
Digester ,BeanUtils, Collections, Commens-Logging,還有一個遵循SAX(Simple API for XML)2.0或JAXP(Java API for XML Parsing) 1.1規范的XML解析器,如Xerces。相關下載地址見附錄。如果需要使用log4j做為日志輸出,則亦請下載之。
將下載來的zip包解壓,并將其中的jar文件拷貝到你的工程文件的lib目錄中,并在工程classpath中包含上述jar文件的路徑。
2. XML文件
在工程目錄下新建一個XML文件,示例使用DigesterTest.xml,內容見下:
<?xml version="1.0" encoding="UTF-8" ?>
<root>
<!-- 這里是注釋 -->
<events>
<event>
<date>
<![CDATA[2007年5月10日]]>
</date>
<address>
<![CDATA[江東影城]]>
</address>
<person>
<![CDATA[person1|person2|person3]]>
</person>
<title>
<![CDATA[《阪神×巨人戦》]]>
</title>
</event>
<event>
<date>
<![CDATA[2007年5月11日]]>
</date>
<address>
<![CDATA[江南水莊]]>
</address>
<person>
<![CDATA[person1|person2|person3]]>
</person>
<title>
<![CDATA[吃魚苗]]>
</title>
</event>
</events>
<configs>
<config key="root.configs.config1" value="value1"/>
<config key="root.configs.config2" value="value2"/>
<config key="root.configs.config3" value="value3"/>
</configs>
</root>

3. 解析XML文檔
Digester的使用相當簡單,請參看如下的DigesterTest類中的注釋
package test;

import java.io.IOException;

import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;


/** *//**
* DigesterTest<br>
* 用Digester簡化XML配置文件處理<br>
* 2007-6-7 ver1.00 Yusx<br>
*
* @author Yusx
* @version 1.00
*/

public class DigesterTest
{

private String configFile;

/** *//**
* 設置XML文件路徑
* @param configFile 路徑
*/

public void setConfigFile(String configFile)
{
this.configFile = configFile;
}

/** *//**
* 解析XML文件
* @throws IOException
* @throws SAXException
*/

public void run() throws IOException, SAXException
{
// 新建Digester實例
Digester digester = new Digester();
// 將本實例放入Digester處理堆棧
digester.push(this);

/**//*
* root/events/event: XML文件中的節點路徑
* addEventInfo: 遇到到該節點時執行的方法
* addEventInfo 本類的一個方法
* 4 調用 addEventInfo 方法需要傳入4個參數
*/
digester.addCallMethod("root/events/event", "addEventInfo", 4);

/**//*
* 逐個設置 addEventInfo 方法的參數,下標從0開始
* 參數的值為對應節點 (root/events/event/date) 的值
*/
digester.addCallParam("root/events/event/date", 0);
digester.addCallParam("root/events/event/address", 1);
digester.addCallParam("root/events/event/person", 2);
digester.addCallParam("root/events/event/title", 3);
// 開始解析XML文件
digester.parse(this.configFile);
}// end run()

/** *//**
* 對XML參數進行處理
* 本方法僅將XML文件中的內容簡單輸出,實際應用中可以將獲得的信息進行進一步的處理。
* @param date 時間
* @param address 地點
* @param person 人物
* @param title 事件title
*/

public void addEventInfo(String date, String address, String person, String title)
{
System.out.println("person=" + person + ",date=" + date
+ ",address=" + address + ",title=" + title);

}// end addEventInfo()

/** *//**
* 對XML參數進行處理
* 本方法僅將XML文件中的內容簡單輸出,實際應用中可以將獲得的信息進行進一步的處理。
* @param attr Attribute 對象
*/

public void addAttributeInfo(Attribute attr)
{
// 調用 Attribute 對象的 toString() 方法
System.out.println(attr);
}// end addAttributeInfo()


/** *//**
* @param args
*/

public static void main(String[] args)
{
DigesterTest dt = new DigesterTest();
// 設置XML文件路徑
dt.setConfigFile("DigesterTest.xml");

try
{
dt.run();
dt = null;

} catch (IOException e)
{
e.printStackTrace();

} catch (SAXException e)
{
e.printStackTrace();
}
//-----------------------------------------------------------------
// 演示另一種解析方法
Digester digester = new Digester();
// 生成本類的實例
digester.addObjectCreate("root/configs/config", DigesterTest.class);
// 生成 Attribute 對象實例,對XML文件中root/configs/config節點的屬性進行封裝
digester.addObjectCreate("root/configs/config", Attribute.class);

/**//*
* 獲取節點的屬性值,并將其存入Attribute實例
* key 對應節點的屬性名
* name 對應Attribute實例的屬性名
*/
digester.addSetProperties("root/configs/config", "key", "name");
digester.addSetProperties("root/configs/config", "value", "value");
// 定義解析到對應節點(root/configs/config)時,調用本實例的 addAttributeInfo 方法
digester.addSetNext("root/configs/config", "addAttributeInfo");

try
{
// 開始解析XML文件
digester.parse("DigesterTest.xml");

} catch (IOException e)
{
e.printStackTrace();

} catch (SAXException e)
{
e.printStackTrace();
}
}// end main()

}

附Attribute.java的代碼
package test;


public class Attribute
{
private String name = null;
private String value = null;


public String getName()
{
return name;
}


public void setName(String name)
{
this.name = name;
}


public String getValue()
{
return value;
}


public void setValue(String value)
{
this.value = value;
}

public String toString()
{
return "name=" + this.name + " value=" + this.value;
}
}
Digester,BeanUtils,Collections,Commens-logging下載地址:
http://jakarta.apache.org/commons/digester/