2011-05-18 167 views
2

如何使用XPath選擇節點而不檢索其所有子節點?例如,下面的XML文檔中:XPath:選擇一個節點,但不取回其子節點

<parentnode> 
    <node1 a="b" b="c"> 
    <child1/> 
    <child2/> 
    ... many many child nodes 
    <childN/> 
    </node1> 
    <node2/> 
</parentnode> 

我希望能夠以選擇「節點1」元素,以檢查其屬性,但沒有選擇的子節點,這我不需要解析並可能是成千上萬的元素,從而影響查詢的性能(其輸出用於在第三方庫中構建一種包含數組和字典的DOM樹)。

更新:只是更清晰,我提到的第三方庫實際上只是一個圍繞的libxml2解析器建立與任何XPath查詢的結果卻讓基礎類的DOM樹Objective-C的包裝。查詢本身是通過一個已經被解析過的文檔(xmlDocPtr)來執行的,這個文檔被所有的查詢重用,所以是的,儘可能多的答案說,這個文檔已經在C級DOM了,但是Objective-C包裝實現產生了性能在這種特殊情況下擊中。我可以修改這個庫來選擇性地不選取所選節點的子節點,但我認爲可能有一個簡單的方法來檢索節點的查詢屬性。

回答

1

如果你只是想的屬性,那麼就選擇屬性:/ parentnode /節點1/@ *

但(作爲另一個答案說明)和XPath處理器仍然需要分析整個文件。 你不會節省太多。

如果您只想解析文件的一部分,然後在獲取所需信息後停止,則應該使用SAX或其他一些API,以便您可以對解析進行較低級別的控制。

+0

謝謝,這正是我需要檢索的屬性。在性能問題來自何處的問題中,我進一步闡明瞭這一點。 – 2011-05-19 09:53:31

0

那麼,如果整個事情已經DOM'd了,那麼你沒有進一步通過選擇node1 XPATH的DOM。那時node1有孩子的事實與性能無關。

但是,如果我們假設整個事物不是DOM,那麼我們可能只是談論一個只讀的閱讀器。有一些只能向前閱讀的讀者可以完成您需要的XPATH。

0

使用@獲得的屬性,例如:

  • /parentnode /節點1/@一個 - 將獲取的 「b」 值
  • /parentnode /節點1/@ b - 會取「c」值
5

像/ a/b/c這樣的XPath表達式將選擇c元素:它不會選擇子元素。許多人認爲它也會選擇孩子的原因是,許多工具都會顯示XPath表達式的結果,方法是顯示以c元素爲根的整個子樹。人們可以理解他們爲什麼這麼做 - 它會直觀地向您顯示您選擇的內容 - 但XPath表達式本身只是返回指向所選元素的指針,而您從哪裏去完全取決於您。 (有些工具,而不是向你顯示以該元素爲根的子樹,顯示了具有其所有祖先的節點的路徑 - 這同樣有效。)

+0

事實上,你是非常正確的。它是第三方庫,它正在構建自己的DOM樹,該樹以選定節點爲根。我最初沒有正確解釋它,並從那以後更新了這個問題。謝謝。 – 2011-05-19 09:57:11