Я думаю, что-то вроде этого - то, что вы хотите:
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 ссылки