Digester:提取节点名称

时间:2010-01-29 21:07:51

标签: java xml apache

是否可以使用apache digester提取节点名称?

所以,如果xml看起来像

   <furniture>
     <sofa>
       .....
     </sofa>
     <coffeeTable>
       .....
     </coffeeTable>
   </furniture>

是否可以提取节点名称“sofa”,“coffeeTable”?

我知道可以使用xpath但是可以使用digester吗?

干杯

2 个答案:

答案 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]"
    }
}

API链接