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

时间:2014-11-18 02:46:38

标签: php xml xpath xmlnode

基于以下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-&gt; item(0) - &gt; nodeValue我同时获取这两个信息而不是单独获取:

Name of product A
Product image name A

但我希望根据客户端ID获取 - &gt; product-&gt; nodeValue和image-&gt; nodeValue。 我怎样才能做到这一点?例如,执行$ info-&gt; item(0) - &gt; product-&gt; nodeValue不起作用。

- &gt; item(0) - &gt; nodeValue提供该特定项目内的所有内容(在本例中为0)

2 个答案:

答案 0 :(得分:1)

您使用XPath来获取节点。 XPath位置路径的结果是节点列表。 - &gt; 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

答案 1 :(得分:0)

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

尝试: &#34; //客户[@id =&#39; A&#39;] / * [name()=&#39;产品&#39;或name()=&#39; image&#39;]&#34;会返回两个节点。如果要按位置使用它们,请记得检查名称。