Digester:提取地图的节点名称<tagname,value =“”> </tagname,>

时间:2010-05-04 10:10:14

标签: java smartgwt apache-commons-digester

我的问题接近这一点: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_14attribute1可以命名为foobar或id或attribute335 ...

1 个答案:

答案 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条规则:

  • 点击dataObjectCreate一个HashMap
  • data/?(数据的直接子项)上,映射[ID]=name(如果不需要,请将此Rule设为无操作方式)
  • *(其他所有内容)上,映射name=text

在我的机器上打印:

{[ID]=isc_OID_14, attribute1=value1, attribute2=value2}

API链接