【问题标题】:Specify XML path in dom4j在 dom4j 中指定 XML 路径
【发布时间】:2011-01-31 17:07:52
【问题描述】:

我想使用 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() 中)厨师和食谱元素?

非常感谢!

【问题讨论】:

标签: java xml-parsing dom4j


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 2019-05-03
      • 2019-10-09
      相关资源
      最近更新 更多