在dom4j中指定XML路径

时间:2011-01-31 17:07:53

标签: java xml-parsing dom4j

我想使用dom4j解析一个大的xml文件。我正在使用dom4j的功能,你可以为路径表达式注册事件处理程序,忽略我不关心的元素。此处说明了此功能:http://dom4j.sourceforge.net/dom4j-1.6.1/faq.html#large-doc

我引用那里: “然后将在针对特定处理程序注册的每个路径的开始和结束时调用这些处理程序。当找到路径的开始标记时,将调用注册到该路径的处理程序的onStart方法。路径如果找到,则调用注册到该路径的处理程序的onEnd方法。

onStart和onEnd方法传递一个ElementPath实例,可用于检索给定路径的当前Element。如果处理程序希望“修剪”正在构建的树以节省内存使用,它可以简单地调用处理器onEnd()方法中正在处理的当前Element的detach()方法。“

我的问题是我不知道应该给出什么路径,以便通过2种方法处理根节点的所有子节点。

我的xml文件类似于:

<root .....>
  <chef name="" ..../>
  <chef name="" ..../>
  <recipe name = .... />
  <recipe name...../>
  ....

如果我想处理厨师元素而不是路径/ root / chef。 对于配方元素,路径将是/ root / recipe。

但是应该给dom4j的路径是什么,以便它(在onStart(),onEnd()中)处理chef和recipe元素?

非常感谢!

2 个答案:

答案 0 :(得分:2)

不要调用addHandler()方法,而是调用setDefaultHandler()并像这样使用它:

SAXReader reader = new SAXReader();
reader.setDefaultHandler(
new ElementHandler() {
    public void onStart(ElementPath path) {
        // If needed, similar to onEnd, but don't detach.    
    }
    public void onEnd(ElementPath path) {
        Element parent = path.getCurrent().getParent();
        if(parent != null && "/root".equals(parent.getPath()) {
            // Do whatever
        }

        path.getCurrent().detach();
    }
}
);

答案 1 :(得分:1)

尝试// root / child :: *或// root / descendant :: *,具体取决于您想要的深度级别。

有关可用xpath轴的更多信息,请参阅w3schools