2013-02-21 66 views
1

我想將非常大的XML文件加載到DOM樹(使用JAXP)中,執行一些修改並在生成的DOM上運行XPath查詢。DOM節點上的Java,XPath

我們使用我們自己的DOM實現,它使用延遲加載來實現(即在開始時只有DOM的前兩個級別從文件中加載,如果調用getChildNodes()/ etc,我們會返回到文件並加載更多級別)。這很慢,但是,我們能夠加載更大的文件,特別是如果我們只使用文件的一部分。

我的問題:XPath在XML(afaik)上使用了不同的視圖。我很好奇,如果默認的Oracle JDK實現現在將整個DOM文檔轉換爲一些內部XPath文檔(這將非常糟糕,因爲它會急切地加載整個文檔),或者如果XPath實現能夠直接在我們的DOM樹(即,如果XPath可以在已加載的元素中進行評估,則不會進一步加載)。

+1

你是什麼意思_very big_?如果您在運行時查看內存消耗,您的問題是否會得到解答? – jlordo 2013-02-21 00:15:54

+0

爲什麼你認爲XPath使用DOM以外的東西? FWIW,至少有一個我已經看到的錯誤表明它以常規形式使用DOM(該錯誤涉及遍歷整個DOM,並且基於樹中深層的上下文進行搜索)。 – parsifal 2013-02-21 20:05:53

+0

規範沒有提到DOM作爲底層模型,並且Apache Xalan-J實現(這是Oracle JDK中使用的afaik)似乎使用某種DTM(http://xml.apache.org/xalan-j /dtm.html)。但是,我無法確定DOM是否完全在DTM中轉換,或者只有評估XPathExpression所需的特定部分,或者DTM是否僅適用於DOM。 – 2013-02-21 20:33:05

回答

0

我們的DOM實現現已完成,因此我現在可以測試:

不幸的是,官方的JDK實施以及當前的Xalan-J實施的評估之前,整個DOM樹轉換爲內部數據結構路徑。

這應該是非常糟糕的,即使你沒有一個偷懶的DOM實現,這是在任何情況下非常糟糕......

2

這可以用幾行代碼進行測試,只需將您的DOM提供給XPath評估程序,並將少量斷點/調試打印輸入到DOM方法中即可。如果它們被調用了不應該被檢索的元素,那麼它會構建它自己的樹。示例:嘗試僅查詢文檔的第一個孩子,並查看它將實際嘗試檢索的內容。

也可能你可以檢查從根本上不同的方法,如果你的文件是如此之大?稱爲SAX

+0

我一直在說謊:我們懶惰的DOM實現尚未實現,我們目前正在研究如果甚至有可能使用懶惰的DOM樹(例如通過XPath以及其他訪問方法) 所以我很好奇是否有人知道默認的JDK XPath實現。我猜,DOM樹上的XPath將會是一個常規情況。 – 2013-02-21 17:00:25