3

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

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

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

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

我的 xml 文件类似于:

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

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

但是应该给 dom4j 的路径是什么,以便它可以处理(在 onStart()、onEnd() 中)厨师和食谱元素?

非常感谢!

4

2 回答 2

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();
    }
}
);
于 2012-03-28T10:29:56.723 回答
1

根据您想要的深度级别尝试 //root/child::* 或 //root/descendant::*。

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

于 2011-02-02T16:12:54.363 回答