2013-05-27 277 views
0

我遇到XPath查詢時遇到問題。我正在使用//link[@rel='alternate'],但是這會返回一個空節點集。我想寫一個查詢,將選擇所有鏈接節點的href屬性的值,其中相對=備用按屬性值篩選Xpath並選擇替代屬性

我在做什麼錯?

下面是我正在使用的xml結構的簡化示例。

<feed> 
    <entry> 
     <id>1980475</id> 
     <link rel="post" href="http://..."></link> 
     <link rel="edit" href="http://..."></link> 
     <link rel="alternate" href="http://..."></link> 
    </entry> 
    <entry> 
     <id>1980476</id> 
     <link rel="post" href="http://..."></link> 
     <link rel="edit" href="http://..."></link> 
     <link rel="alternate" href="http://..."></link> 
    </entry> 
</feed> 

這裏是PHP代碼我使用,以及:

$xmlDoc = simplexml_load_file("somefile.xml"); 
$nodelist = $xmlDoc->xpath("//link[@rel='alternate']"); 
+0

你也可以上傳你正在與試圖代碼? –

+0

'// link [@ rel ='alternate']' '$ xmlDoc = simplexml_load_file(「filepath.xml」); $ nodelist = $ xmlDoc-> xpath(「// link [@ rel ='alternate']);' – ajarrel

+0

我試過了你的代碼和count($ xml-> xpath('// link [@ rel =」alternate 「]'))'返回2,這是正確的:http://3v4l.org/iG8o8 – Passerby

回答

1

由於@Jens注意,你可能處理一個Atom feed。 Atom中的XML元素位於Atom名稱空間中,其URI是http://www.w3.org/2005/Atom

您需要註冊該名稱空間並在XPath表達式中使用它。請參閱this answer關於如何做到這一點。

當您發佈的XML輸入的「簡化樣本」,你大概刪除默認的命名空間聲明,在

<feed xmlns="http://www.w3.org/2005/Atom"> 

這看似不起眼的變化意味着<feed>和所有的所有元素的後裔從它是在沒有名字空間的情況下,而在實際輸入數據中,它們位於Atom命名空間中。這可以解釋爲什麼在樣本輸入上測試XPath表達式時(如@Passerby所述),但對實際輸入無效。

如果您註冊a爲Atom名稱空間的名稱空間前綴,如在我掛到上面的答案,你的XPath表達式是:

xpath("//a:link[@rel='alternate']")