Digester: Извлечение имени узла для карты <tagname, value> - PullRequest
1 голос
/ 04 мая 2010

Мой вопрос близок к этому: Дайджест: извлечение имени узла

Даже с ответом я не могу найти.

Вот мой 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 или атрибут335 ...

1 Ответ

3 голосов
/ 19 мая 2010

Я думаю, что-то вроде этого - то, что вы хотите:

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/? (прямой дочерний элемент данных), карта [ID]=name (сделать этот Rule запретом, если не нужно)
  • Вкл. * (все остальное), карта name=text

На моей машине это печатает:

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

API ссылки

...