【问题标题】:Digester: Extracting node name for a map<tagname, value>Digester:提取地图的节点名称<tagname, value>
【发布时间】:2010-05-04 10:10:13
【问题描述】:

我的问题与这个问题很接近: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);

我不知道&lt;data&gt;&lt;sourceId /&gt;&lt;/data&gt; 中的标签列表和名称。 isc_OID_14 或 attribute1 可以命名为 foobar 或 id 或 attribute335...

【问题讨论】:

    标签: java smartgwt apache-commons-digester


    【解决方案1】:

    我认为你想要这样的东西:

    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、ObjectCreateHashMap
    • 在data/?(数据的直接子级)上,映射[ID]=name(如果不需要,请将此Rule 设为无操作)
    • 打开*(其他所有),映射name=text

    在我的机器上,打印出来的是:

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

    API 链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2012-08-07
      • 1970-01-01
      • 2012-03-06
      • 2013-11-27
      • 1970-01-01
      相关资源
      最近更新 更多