PHP XPath-使用“评估”难以读取节点属性

时间:2018-12-18 13:44:08

标签: php xpath

我需要读取“ id”属性,但是我会得到空字符串或包含“ one”的字符串,具体取决于所使用的XPath表达式。

我故意使用“查询”方法来获取带有节点的DOMNodeList,然后我想使用它们。请检查以下代码:

<?php
$xml = '
    <ROOT>
        <MEMBER id="one" />
        <MEMBER id="two" />
    </ROOT>
';


$dom = new \DOMDocument('1.0', 'utf-8');
$dom->loadXML($xml);
$xpath = new DOMXpath($dom);

$members = $xpath->query('/ROOT/MEMBER');  // object of class DOMNodeList

foreach ($members as $member) {
    echo($dom->saveXML($member));  // displays <MEMBER id="one"/> and <MEMBER id="two"/> as expected
    $id = $xpath->evaluate('string(/MEMBER/@id)', $member);   // let's read the id attribute
    var_dump($id);  // returns string(0) "" in both cases  - how come?
    $id = $xpath->evaluate('string(//MEMBER/@id)', $member);   // should make no difference
    var_dump($id);  // string(3) "one" in both cases
}

1 个答案:

答案 0 :(得分:0)

在foreach中,您已经在MEMBER上下文中,因此不要使用/MEMBER/@id而不是@id,希望您将获得期望的输出。

实际上,在foreach ($members as $member)中有两个<MEMBER id="one" /><MEMBER id="two" />是上下文,因此您已经在MEMBER元素上,只需要从当前上下文中选择@id

如果您将打印$member,那么您将知道在此上下文中存储的内容,那么图片将是清晰的。

如果对您有用,请接受答案。

相关问题