使用变量作为XML的对象引用

时间:2016-07-27 22:10:52

标签: php xml object

我们说我有一个像这样的XML文件:

<?xml version="1.0" encoding="utf-8"?>

<test>
    <foo>
        <bar>Hello, World!</bar>
    </foo>
</test>

所以,如果我使用这样的东西,我可以回复Hello, World!

<?php
$xml = simplexml_load_file("myxml.xml");
echo $xml->foo->bar;
?>

但是,如果我想用变量引用bar怎么办?

<?php
$xml = simplexml_load_file("myxml.xml");
$reference = "foo->bar";
echo $xml->$reference;
?>

那不会奏效。任何解决方案?

3 个答案:

答案 0 :(得分:2)

这是因为你试图在一个变量中访问第3级。 PHP无法处理变量中的->

$level1 = 'foo';
$level2 = 'bar';

echo $xml->$level1->$level2;

答案 1 :(得分:1)

您无法这样做,因为它会在foo->bar内找到包含文字bar而不是foo的媒体资源。

你可以这样做:

$xml = simplexml_load_file("myxml.xml");

$reference = "foo->bar";
$tmp = $xml;
foreach(explode('->', $reference) as $v){
    $tmp = $tmp->$v;
}
echo $tmp;

输出:

  

你好,世界!

即使你不想直到最后一个元素,这也会有效。看一下下面的例子。

使用此 XML:

进行测试
<?xml version="1.0" encoding="utf-8"?>

<test>
    <foo>
        <bar>Hello, World!</bar>
        <something>
            <values>
                <v1>Some value here (1)</v1>
                <v2>Some value here (2)</v2>
                <v3>Some value here (3)</v3>
                <v4>Some value here (4)</v4>
            </values>
        </something>
    </foo>
</test>

现在,更改为$reference = "foo->something->values";,并从echo $tmp;更改为print_r($tmp);。这将是输出:

SimpleXMLElement Object
(
    [v1] => Some value here (1)
    [v2] => Some value here (2)
    [v3] => Some value here (3)
    [v4] => Some value here (4)
)

答案 2 :(得分:1)

使用Xpath。它允许您使用表达式来获取XML的一部分。

$xml = <<<'XML'
<?xml version="1.0" encoding="utf-8"?>
<test>
    <foo>
        <bar>Hello, World!</bar>
    </foo>
</test>
XML;

$xml = new SimpleXMLElement($xml);
$expression = 'foo/bar';

var_dump(
  (string)$xml->xpath($expression)[0]
);

Xpath是一个非常强大的工具。但是,要充分发挥潜力,您必须使用DOMXpath::evaluate()SimpleXMLElement::xpath()只能将节点列表作为SimpleXMLElement对象的数组返回。 DOMXpath:evaluate()可以返回节点列表或标量值。

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);
$expression = 'string(foo/bar)';

var_dump(
  $xpath->evaluate($expression)
);