2008-09-26 77 views
5

我正在使用PHP和xpath解析來自API調用的XML結果。使用Xpath提取給定節點的文本和屬性

$dom = new DOMDocument(); 
$dom->loadXML($response->getBody()); 

$xpath = new DOMXPath($dom); 
$xpath->registerNamespace("a", "http://www.example.com"); 

$hrefs = $xpath->query('//a:Books/text()', $dom); 

for ($i = 0; $i < $hrefs->length; $i++) { 
     $arrBookTitle[$i] = $hrefs->item($i)->data; 
} 

$hrefs = $xpath->query('//a:Books', $dom); 

for ($i = 0; $i < $hrefs->length; $i++) { 
     $arrBookDewey[$i] = $hrefs->item($i)->getAttribute('DeweyDecimal'); 
} 

這樣的工作,但有沒有一種方法可以從一個查詢訪問文本和屬性?如果是這樣的話,一旦查詢被執行,你如何得到這些項目?

回答

4

經過一番四處尋找,我遇到了這個解決方案。這樣我可以獲取元素文本並訪問節點的任何屬性。

$hrefs = $xpath->query('//a:Books', $dom); 

for ($i = 0; $i < $hrefs->length; $i++) { 
    $arrBookTitle[$i] = $hrefs->item($i)->nodeValue; 
    $arrBookDewey[$i] = $hrefs->item($i)->getAttribute('DeweyDecimal'); 
} 
0

你可以查詢連接嗎?

$xpath->query('concat(//a:Books/text(), //a:Books/@DeweyDecimal)', $dom); 

XSLT本身就是一種表達式語言,你可以建立你的表達式中要返回值的任何特定的格式。

+0

然後,我會只使用item-> data和item-> getAttribute來提取結果嗎? – 2008-09-26 21:02:12

2

如果your're剛剛從XML文檔檢索值,SimpleXML可能是更精簡,更快,內存更友好的解決方案:

$xml=simplexml_load_string($response->getBody()); 
$xml->registerXPathNamespace('a', 'http://www.example.com'); 
$books=$xml->xpath('//a:Books'); 
foreach ($books as $i => $book) { 
    $arrBookTitle[$i]=(string)$book; 
    $arrBookDewey[$i]=$book['DeweyDecimal']; 
} 
3

一個單一的XPath表達式將選擇兩個文本節點「一:圖書」 和他們的 「DeweyDecimal」 屬性,是以下

//a:Books/text() | //a:Books/@DeweyDecimal

請注意在上述表達式中使用XPath的聯合運算符。

另一個說明:儘量避免使用「//」縮寫,因爲它可能導致整個XML文檔被遍歷,因此非常昂貴。當XML文檔的結構已知時,建議使用更具體的XPath表達式(例如由特定位置步驟鏈組成)。

相關問題