2008-09-26 78 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表达式(例如由特定位置步骤链组成)。

相关问题