我的问题接近这一点:Digester: Extracting node name
即使有了答案,我也找不到。
这是我的xml文件(来自smartgwt RestDataSource POST):
<data>
<isc_OID_14>
<attribute1>value1</attribute1>
<attribute2>value2</attribute2>
</isc_OID_14>
</data>
我想用Commons Digester创建以下地图: {attribute1 = value1,attribute2 = value2}
我已经有了这些话:
digester = new Digester();
digester.addObjectCreate("data", HashMap.class);
// some "put" rules matching something like data/*
return digester.parse(myFile);
我不知道<data><sourceId /></data>
中的列表和标签名称。 isc_OID_14
或attribute1
可以命名为foobar或id或attribute335 ...
答案 0 :(得分:3)
我觉得这样的事情就是你想要的:
import java.io.*;
import java.util.*;
import org.apache.commons.digester.*;
public class DigestToMap {
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
File file = new File("digestme.xml");
Digester digester = new Digester();
digester.setRules(new ExtendedBaseRules());
digester.addObjectCreate("data", HashMap.class);
digester.addRule("data/?", new Rule() {
@Override public void end(String nspace, String name) {
((HashMap<String,String>)getDigester().peek()).put("[ID]", name);
}
});
digester.addRule("*", new Rule() {
@Override public void body(String nspace, String name, String text) {
((HashMap<String,String>)getDigester().peek()).put(name, text);
}
});
Map<String,String> map = (Map<String,String>) digester.parse(file);
System.out.println(map);
}
}
基本上它使用ExtendedBaseRules
进行通配符匹配。
有3条规则:
data
,ObjectCreate
一个HashMap
data/?
(数据的直接子项)上,映射[ID]=name
(如果不需要,请将此Rule
设为无操作方式)*
(其他所有内容)上,映射name=text
在我的机器上打印:
{[ID]=isc_OID_14, attribute1=value1, attribute2=value2}