在dom4j中指定XML路径

发布于 2024-10-15 06:49:14 字数 908 浏览 5 评论 0原文

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

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

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

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

我的 xml 文件类似于:

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

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

但是应该为 dom4j 提供什么路径,以便它能够处理(在 onStart()、onEnd() 中)厨师和菜谱元素?

多谢!

I want to parse a large xml file using dom4j. I'm using the dom4j's feature that you can register event handlers for path expressions for ignoring the elements I don't care about. The feature is explained here: http://dom4j.sourceforge.net/dom4j-1.6.1/faq.html#large-doc.

I quote from there:
"These handlers will then be called on the start and end of each path registered against a particular handler. When the start tag of a path is found, the onStart method of the handler registered to the path is called. When the end tag of a path if found, the onEnd method of the handler registered to that path is called.

The onStart and onEnd methods are passed an instance of an ElementPath, which can be used to retrieve the current Element for the given path. If the handler wishes to "prune" the tree being built in order to save memory use, it can simply call the detach() method of the current Element being processed in the handlers onEnd() method."

My problem is that I don't know what path should I give so that all the children of the root node to be handled by the 2 methods.

My xml file is something like:

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

If I would like to handle chef elements than the path would be /root/chef.
For recipe elements the path would be /root/recipe.

But what is the path that should be given to the dom4j so that it will handle (in the onStart(), onEnd()) both chef and recipe elements?

Thanks a lot!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

我喜欢麦丽素 2024-10-22 06:49:14

不要调用 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();
    }
}
);

Instead of calling the addHandler() method, call the setDefaultHandler() and use it like this:

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();
    }
}
);
当爱已成负担 2024-10-22 06:49:14

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

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

Try //root/child::* or //root/descendant::* depending on what level of depth you want.

see w3schools for more on the available xpath axes

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文