我们说我有一个像这样的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;
?>
那不会奏效。任何解决方案?
答案 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)
);