2012-07-03 84 views
0

我有這個twitter feed。我正試圖解析原始推文的鏈接。它的第一個entryfeed。我想要取href內部的link元素的http://twitter.com/shiplu/statuses/220057421899505664獲取鏈接從Atom條目

我已經使用這個XPath /feed/entry[0]/link[@rel = "alternate" and @type = "text/html"]

但它返回空字符串。

代碼看起來像這樣,

$link = $xml->xpath('/feed/entry[0]/link[@rel = "alternate" and @type = "text/html"]'); 

我覺得我幾乎沒有。任何人都可以糾正我在這裏做錯了什麼。

回答

1

編輯 - 固定基於以下

XPath的節點號Vaman評論答案從1開始,而且飼料使用,有一個命名空間中的Atom格式 - 你應該做這樣的事情:

/atom:feed/atom:entry[1]/atom:link[@rel = "alternate" and @type = "text/html"] 

其中​​前綴與http://www.w3.org/2005/Atom使用相關聯:

$xml->registerXPathNamespace('atom', 'http://www.w3.org/2005/Atom'); 
+1

我不認爲這會工作作爲''節點包含的命名空間。命名空間應該在形成xpath時考慮 –

+0

你是對的 - 我沒有看到源的來源,我假設沒有命名空間 – MiMo

+0

偉大的信息。我只需要添加'$ xml-> registerXPathNamespace('atom','http://www.w3.org/2005/Atom');'和你的xpath工作。 –

0

這一個應該爲你工作:/feed/entry[1]/link[@rel = "alternate"]

1

你指出的飼料包含名稱空間。 Xpath表達式也應該考慮命名空間。下面是一個功能完備的表達式,儘管冗長,它匹配所需的href。

((/*[namespace-uri()='http://www.w3.org/2005/Atom' and contains(name(),'feed')]/*[namespace-uri()='http://www.w3.org/2005/Atom' and contains(name(),'entry')])[1]/*[namespace-uri()='http://www.w3.org/2005/Atom' and contains(name(),'link') and @rel='alternate' and @type='text/html'])[1]/@href

+0

命名空間在這裏不重要。因爲我訪問的元素不是以名稱空間格式('') –

+0

@ shiplu.mokadd.im:No。命名空間很重要。你有一個默認的命名空間,用uri'http:// www.w3.org/2005/Atom'定義。因此,所有不以名稱空間格式的元素都屬於此默認名稱空間。你可以在http://www.w3schools.com/xml/xml_namespaces.asp獲得關於默認命名空間的更多信息。你試過這個表達式嗎? –

+0

我沒有嘗試過。這個表達式包含了我真的不想要的函數調用。看看@ MiMo的回答。 –