PHP xpath 问题->item(0)->nodeValue

Posted

技术标签:

【中文标题】PHP xpath 问题->item(0)->nodeValue【英文标题】:PHP xpath issues ->item(0)->nodeValue 【发布时间】:2014-11-18 02:46:38 【问题描述】:

基于以下XML我要检索某个节点(ID)的产品名称和图像

<?xml version="1.0" encoding="utf-8"?>
<clients>
    <client id="A">
        <product>Name of product A</product>
        <image>Product image name A</image>
    </client>
    <client id="B">
        <product>Name of product B</product>
        <image>Product image name B</image>
    </client>
</clients>

这是 php 代码:

$doc      = DOMDocument::load('clients.xml');
$xpath    = new DOMXPath($doc);
$query    = '//client[@id="A"]'; 
$info = $xpath->query($query);

如果我执行 $info->item(0)->nodeValue 我会同时获取两个信息,而不是单独获取:

Name of product A
Product image name A

但我想根据客户端 ID 获取 ->product->nodeValue 和 image->nodeValue。 我怎样才能做到这一点?例如,执行 $info->item(0)->product->nodeValue 是行不通的。

->item(0)->nodeValue 给出该特定项目内的所有内容(在本例中为 0)

【问题讨论】:

【参考方案1】:

您使用 XPath 来获取节点。 XPath 位置路径的结果是一个节点列表。 ->item(0) 返回此列表中的第一个节点。这是client 元素节点。

调用 DOMElement:$nodeValue 总是将所有后代文本节点作为字符串返回。在您的情况下,productimage 元素节点内的文本节点。

如果您需要单独的值,您可以获取子节点。

$dom = new DOMDocument();
$dom->loadXML($xml);
$xpath = new DOMXpath($dom);

foreach ($xpath->evaluate('//client[@id="A"]/*[self::product or self::image]') as $child) 
    echo $child->localName, ': ', $child->nodeValue, "\n";

输出:

product: Name of product A
image: Product image name A

【讨论】:

【参考方案2】:

您的结果返回单个节点(客户端)。该节点的 nodevalue 是它下面的所有文本。

尝试: "//client [@id='A']/*[name()='product' or name()='image']" 将返回两个节点。如果您想按位置使用它们,请记住检查名称。

【讨论】:

以上是关于PHP xpath 问题->item(0)->nodeValue的主要内容,如果未能解决你的问题,请参考以下文章

PHP 更改 DOM 用户代理

Xpath学习

lxml中的Xpath的使用

python xpath基础 01

通过 XPATH 查找没有特定父节点的节点

分页 xpath 无效