2011-01-31 63 views
3

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

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

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

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

我的XML文件是一样的东西:

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

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

但是应该给予dom4j以便它将处理onStart(),onEnd())厨师和配方元素的路径是什么?

非常感谢!

+0

的dom4j是不是非常适合大XML文件,这里是证明http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf – 2016-04-05 21:20:03

回答

1

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

看到w3schools更多可用的XPath轴

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(); 
    } 
} 
);