我可以使用SimpleXML和Xpath直接选择元素属性吗?

sig*_*nce 4 php xpath simplexml

即 - 我想使用类似xpath表达式"// banana/@ color"和以下示例xml返回字符串"yellow"...

<fruits>
 <kiwi color="green" texture="hairy"/>
 <banana color="yellow" texture="waxy"/>
</fruits>


$fruits = simplexml_load_string(
'<fruits>
 <kiwi color="green" texture="hairy"/>
 <banana color="yellow" texture="waxy"/>
</fruits>');

print_r($fruits->xpath('//banana/@color'));
Run Code Online (Sandbox Code Playgroud)

产生

Array
(
    [0] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [color] => yellow
                )

        )

)
Run Code Online (Sandbox Code Playgroud)

而我更喜欢......

Array
(
    [0] => SimpleXMLElement Object
        (
            [0] => yellow
        )

)
Run Code Online (Sandbox Code Playgroud)

...所以我不需要在我写的应用程序中写一个特殊的案例.

非常感谢!:)

pro*_*son 7

我只是给你的测试一个镜头,因为我很好奇,我发现它确实yellow在转换为字符串时产生字符串值.

$fruits = simplexml_load_string(
'<fruits>
 <kiwi color="green" texture="hairy"/>
 <banana color="yellow" texture="waxy"/>
</fruits>');

$found = $fruits->xpath('//banana/@color');
echo $found[0];
Run Code Online (Sandbox Code Playgroud)

看起来这只是SimpleXmlElement属性节点的表示方式.因此,您可以使用它,就(string) $found[0]好像您不直接打印/回显它一样.

当然,如果你依赖于剩余的价值,SimpleXMLElement那么我认为这可能是一个问题.但我认为只要记住在以后使用节点时转换为字符串仍然是可行的.

如果您确实需要一个支持属性作为节点的节点的详细界面,那么您可能只想切换到DOMDocument.您的代码将变得更加冗长,但实现更加清晰.