2010年1月2日 星期六

Apache Common Digester

Apache Common Digester是專門解析XML文件的工具,目前已發布到2.0版。

在開始之前必須先下載LoggingBeanUtils

例如有個XML文檔如下:




<Request> 'Request'
<BbPdtCategorySelReq> 'Request/BbPdtCategorySelReq'
<ParameterList> 'Request/BbPdtCategorySelReq/ParameterList'
<Parameter> 'Request/BbPdtCategory/ParameterList/Parameter'
<Name>Oliver</Name> 'Request/BbPdtCategory/ParameterList/Parameter/Name'
<Value>Good</Value> 'Request/BbPdtCategory/ParameterList/Parameter/Value'
</Parameter>
<Parameter> 'Request/BbPdtCategory/ParameterList/Parameter'
<Name>Joyce</Name> 'Request/BbPdtCategory/ParameterList/Parameter/Name'
<Value>Gool</Value> 'Request/BbPdtCategory/ParameterList/Parameter/Value'
</Parameter>
</ParameterList>
</BbPdtCategorySelReq>
</Request>


Digester是利用路徑的概念進行解析,可以由上述的範例看出每個XML Tag所對應,相當的直覺。

首先必須建立欲解析的Bean,利用上述的範例為ParameterList及Parameter

package com;

import java.util.ArrayList;
import java.util.List;

public class ParameterList {
private List parameters = new ArrayList();

public List getParameters() {
return parameters;
}

public void addParameter(Parameter parameter) {
this.parameters.add(parameter);
}

}




package com;

public class Parameter {
private String name;
private String value;

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;
}
}


最後是XML的解析



package com;
import java.io.IOException;


import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

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

public class DigesterTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String xmlDocp = “<Request><BbPdtCategorySelReq>“+
”<ParameterList><Parameter>“+
”<Name>Oliver</Name>”+
“<Value>Good</Value>”+
“</Parameter>”+
“<Parameter>”+
“<Name>Joyce</Name>”+
“<Value>Gool</Value>”+
“</Parameter>”+
“</ParameterList>”+
“</BbPdtCategorySelReq>“
“</Request>”;

try {
// 調用解析方法

DigesterTest t = new DigesterTest();

ParameterList parameterList = t.parseByDigesterP(xmlDocp);
// 循環所有的Parameter
for (Parameter p : parameterList.getParameters())
{
p.getName(); // 取得NAME
p.getValue(); // 取得對應的VALUE
}
} catch (IOException e) {
// TODO 自動產生 catch 區塊
e.printStackTrace();
} catch (SAXException e) {
// TODO 自動產生 catch 區塊
e.printStackTrace();
}

}

public ParameterList parseByDigesterP(String xmlDoc) throws IOException,
SAXException {

System.out.println(xmlDoc);

StringReader read = new StringReader(xmlDoc);

System.out.println(read);

ParameterList parameterList = new ParameterList();
// 實例Digester物件
Digester d = new Digester();
// DTD檔進行驗證
d.setValidating(false);
// push:放入一个根节点物件,要從哪個節點放入就設哪一個
d.push(parameterList);

// 對節點Parameter創建一個Parameter的物件
d.addObjectCreate(
"Request/BbPdtCategorySelReq/ParameterList/Parameter",
Parameter.class);
// 相當于調用Parameter中的setName()
d.addBeanPropertySetter(
"Request/BbPdtCategorySelReq/ParameterList/Parameter/Name",
"name");
d.addBeanPropertySetter(
"Request/BbPdtCategorySelReq/ParameterList/Parameter/Value",
"value");
// 想當與調用ParameterList中的addParameter()
d.addSetNext(
"Request/BbPdtCategorySelReq/ParameterList/Parameter",
"addParameter");
// 得到相應的ParameterList物件
parameterList = (ParameterList) d.parse(read);

return parameterList;
}
}




範例文檔

沒有留言: