【问题标题】:Digester: Extracting node nameDigester:提取节点名称
【发布时间】:2010-01-29 21:07:51
【问题描述】:

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

所以,如果 xml 看起来像

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

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

我知道可以使用 xpath,但可以使用消化器吗?

干杯

【问题讨论】:

    标签: java xml apache


    【解决方案1】:

    (原答案)

    使用简单的Rule 为模式"furniture/*" 创建一个Digester,该Rule 将第二个参数传递给对begin 方法的每次调用并将其粘贴到您选择的集合中(获取所有这些的列表,a设置为仅获取所有唯一名称)。

    (编辑)

    从头开始,它有点复杂。

    这行得通:

    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() 方法以满足你的需要。

    【讨论】:

    • 很好,谢谢。因为我知道所有家具的结合,所以我使用了你提议的轻微变化。干杯。
    【解决方案2】:

    这是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 链接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 2013-11-27
      • 1970-01-01
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多