5

我正在使用 PHP 和 xpath 解析来自 API 调用的 XML 结果。

 $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

4 回答 4

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');
}
于 2008-09-27T05:01:38.313 回答
3

一个 XPath 表达式将同时选择“a:Books”的文本节点及其“DeweyDecimal”属性,如下所示

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

请注意在上面的表达式中使用了 XPath 的联合运算符。

另一个注意事项:尽量避免使用“//”缩写,因为它可能导致整个 XML 文档被遍历,因此非常昂贵。当 XML 文档的结构已知时,建议始终使用更具体的 XPath 表达式(例如由一系列特定位置步骤组成)。

于 2008-11-30T02:59:32.767 回答
2

如果您只是从 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'];
}
于 2008-09-27T10:10:30.300 回答
0

你能查询连接吗?

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

XSLT 本身就是一种表达式语言,您可以从表达式中构造所需的任何特定格式的返回值。

于 2008-09-26T20:56:31.753 回答