是否可以使用apache digester提取节点名称?
所以,如果xml看起来像
<furniture>
<sofa>
.....
</sofa>
<coffeeTable>
.....
</coffeeTable>
</furniture>
是否可以提取节点名称“sofa”,“coffeeTable”?
我知道可以使用xpath但是可以使用digester吗?
干杯
答案 0 :(得分:1)
(原始答案)
使用简单的Digester
为模式"furniture/*"
创建Rule
,每次调用begin方法时都会使用第二个参数,并将其添加到您选择的集合中(列表为得到所有这些,一组只获得所有唯一名称。)
(编辑)
抓一点,这有点复杂。
这有效:
public class App
{
final static Rule printRule = new Rule() {
public void begin(String namespace, String name,
Attributes attributes) throws Exception {
System.out.println(name);
}
};
public static void main( String[] args ) throws IOException, SAXException
{
InputStream instr = App.class.getResourceAsStream("/sample.xml");
Digester dig = new Digester();
dig.setRules(new RulesBase(){
public List<Rule> match(String namespaceURI, String pattern) {
return Arrays.asList(printRule);
}
});
dig.parse(instr);
}
}
此特定示例将打印所有元素名称,包括根furniture
元素。我会留给您调整match()
方法以满足您的需求。
答案 1 :(得分:0)
这是ExtendedBaseRules
提供的匹配类型。
我们说这是furniture.xml
:
<furniture>
<sofa>
<blah/>
</sofa>
<coffeeTable>
<bleh/>
</coffeeTable>
</furniture>
假设您想要获取furniture
元素的直接子元素的元素名称。这是furniture/?
中ExtendedBaseRules
匹配的内容。
import java.io.*;
import java.util.*;
import org.apache.commons.digester.*;
public class FurnitureDigest {
public static void main(String[] args) throws Exception {
File file = new File("furniture.xml");
Digester digester = new Digester();
digester.setRules(new ExtendedBaseRules());
final List<String> furnitures = new ArrayList<String>();
digester.addRule("furniture/?", new Rule() {
@Override public void end(String nspace, String name) {
furnitures.add(name);
}
});
digester.parse(file);
System.out.println(furnitures); // prints "[sofa, coffeeTable]"
}
}