Digester:提取映射的节点名称

发布于 2024-08-31 13:42:18 字数 822 浏览 8 评论 0原文

我的问题与此接近:消化器:提取节点名称

即使有了答案,我也可以不知道。

这是我的 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);

我不知道 中的列表和标签名称isc_OID_14attribute1 可以命名为 foobar 或 id 或 attribute335...

My question is close to this one: Digester: Extracting node name

Even with the answer, I can't find out.

Here is my xml file (from smartgwt RestDataSource POST):

<data>
  <isc_OID_14>
    <attribute1>value1</attribute1>
    <attribute2>value2</attribute2>
  </isc_OID_14>
</data>

I would like to create, with Commons Digester, the following map :
{attribute1=value1, attribute2=value2}

I already have those lines:

digester = new Digester();
digester.addObjectCreate("data", HashMap.class);
// some "put" rules matching something like data/*
return digester.parse(myFile);

I do not know the list nor the name of tags in the <data><sourceId /></data>. isc_OID_14 or attribute1 can be named foobar or id or attribute335...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

肤浅与狂妄 2024-09-07 13:42:18

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

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 a HashMap
  • data/? (数据的直接子级)上, map [ID]=name (如果不需要,请将此 Rule 设置为无操作)
  • * (其他所有内容)上,map name=text

在我的机器上,打印:

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

API links

I think something like this is what you want:

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

Basically it uses ExtendedBaseRules for the wildcard matching.

There are 3 rules:

  • On data, ObjectCreate a HashMap
  • On data/? (direct child of data), map [ID]=name (make this Rule a no-op if not needed)
  • On * (everything else), map name=text

On my machine, this prints:

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

API links

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文