2010-10-12 52 views
1

我對XML開發相當新穎。我有幾個關於使用XPATH和libxml進行XML解析的問題。libxml2 XPATH - 從XML中選擇數據的子集

我有一個XML結構爲:

<resultset> 
     <result count=1> 
      <row> 
       <name> He-Man! </name> 
       <home> Greyskull </home> 
      <row> 
     </result> 
     <result count=2> 
      <row> 
       <name> Spider-Man</name> 
       <home> Some downtown apartment </home> 
      <row> 
      <row> 
       <name> Disco-Man!</name> 
       <home> The 70's dance floor </home> 
      <row> 
     </result> 
<resultset> 

我需要從這個XML挑出來的名字,但其中數爲2,我需要它只能從第一個記錄。我遇到了一些教程,但我無法想出一個XPATH查詢來達到這個目的。

/name將選擇所有名稱元素。

/結果[@count> 1]/row [1]/name | /結果[@count = 1] /行/名稱

這是可以用XPATH完成的嗎?這是更好的通過XPATH或走XML樹?

有人能指出我通過XML的一些複雜的搜索嗎?

編輯:實際場景需要選擇XML行的子集,它有時嵌套在2個級別。這聽起來像我需要OR'|'很多路徑來選擇我需要的節點......我不知道這是否會有效,而不是走樹......上面是鍵入來複制問題:)

謝謝!

+0

Xpath IS遍歷XML樹。 – 2010-10-12 09:11:55

+0

也許我誤解了這個問題,或者你的例子被簡化了很多,但是在你的例子中'/ result/row [1]/name'不會起作用嗎? – 2010-10-12 12:21:12

回答

0

試試這個XPath -

/resultset/result[@count=2]/row/name

這會給這個XPath落入下的所有節點的列表。從這裏取第一個元素(因爲你只需要第一個記錄)。

+0

+1好答案。你寫道:*從這裏取第一個元素*。在XPath中:'(/ resultset/result [@ count = 2]/row/name)[1]'。 – 2010-10-12 15:53:23

+0

@alejandro。 Yupp,那就是你做第一個元素。還儘可能地嘗試在XPath中使用絕對路徑。這樣,你一定會得到你想要的,而不是一些虛假的節點被選中。 – 2010-10-12 16:41:03

+0

關於*一些虛假節點被選中*,這是因爲軸的優先級高於謂詞,位置謂詞遵循軸方向。這就是爲什麼我已經完成了你的答案*採取第一個*表達 – 2010-10-12 16:48:30

0

我可能會保持我的xpath更簡單,只是提取兩種情況,然後遍歷兩個節點集。

如果您確實需要沿着單個xpath路徑走下去,您應該嘗試使用可讓您實時輸入它們的某些xpath表達式,而不必重新編譯C/C++代碼。您應該可以通過將您的XML加載到Firefox並使用Firebug來實現這一點 - 例如,在Firebug控制檯中輸入$ x('// name')會給出三個節點。

但是請注意你的XML是無效的。你有一堆「<排>‘S應該是’</>行」和同爲「<結果集>」和你的計數需

<result count="1"> 

即與價值周圍的引號。

+0

謝謝,我只是打了一個我試圖解析的簡化版本:) – 2010-10-12 09:30:41