【问题标题】:Using variables as object reference for XML使用变量作为 XML 的对象引用
【发布时间】:2016-07-27 22:10:52
【问题描述】:

假设我有一个这样的 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;
?>

那是行不通的。有什么解决办法吗?

【问题讨论】:

  • 你能检查 echo $xml->{$reference};请问?
  • @MehmetSÖĞÜNMEZ 检查过,没用 :(

标签: php xml object


【解决方案1】:

这是因为您试图在一个变量中访问第三级。 PHP 无法处理变量中的-&gt;

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

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

【讨论】:

  • 它会起作用,但我想把它放在一个变量中。还是谢谢!
【解决方案2】:

您不能这样做,因为它会查找带有文字 foo-&gt;bar 的属性,而不是 foo 中的 bar


你可以这样做:

$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-&gt;something-&gt;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)
)

【讨论】:

  • 请注意,有了这个,您甚至不必在字符串中使用-&gt;,只需将值分开并在explode中使用。
  • 完美运行!我期待着“爆炸”的东西,但谢谢!
【解决方案3】:

使用 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)
);

【讨论】:

  • 也可以,但是我将第一个 sn-p 从 $xml = SimpleXMLElement($xml); 修改为 $xml = simplexml_load_file("myxml.xml"); 以便我可以从文件中获取它:)
猜你喜欢
  • 2013-10-11
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
相关资源
最近更新 更多