Apache Common Digester是專門解析XML文件的工具,目前已發布到2.0版。
例如有個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;
}
}
範例文檔
沒有留言:
張貼留言