2011-01-31 60 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(); 
    } 
} 
);