【发布时间】:2010-06-24 09:35:06
【问题描述】:
我正在使用 SimpleXMLElement 读取从远程服务器返回的 xml。 然后使用 xpath 解析结果,如下所示:
$result = <<<XML
<DataImport2Result xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xxx.xxx/Services/DataImport2">
<Number />
<Blocks>
<Block>
<Code>Fbf</Code>
<Fields>
<Field>
<Code>FinnsIFbf</Code>
<Value>1</Value>
</Field>
</Fields>
</Block>
</Blocks>
</DataImport2Result>
XML;
$xml = new SimpleXMLElement($result);
$xml->registerXPathNamespace("data", array_pop($xml->getNamespaces()));
foreach($xml->xpath("//data:Code[.='Fbf']/..") as $block) {
foreach($block[0]->Fields->Field as $field) {
echo "Code: ". $field->Code ."\n"; // SHould return FinnsIFbf
}
}
$result 是一个带有 SimpleXMLElement 对象的数组。尝试使用 $block[0]->Fields(SimpleXMLElement object) 作为数组时会发生实际错误。所以结果就在那里。问题在于迭代。
这在 PHP 5.3.2 中工作得很好,但在运行 5.1.6 的服务器上失败:
致命错误:在后/前递增/递减中用作数组的对象必须通过引用返回值
在不升级服务器版本的情况下解决此问题的最简单方法是什么(服务器管理员认为更新版本“不稳定”)?
如果我可以让 xpath 在第一个 $result 中返回字段,一个解决方案可能是,这样我就不必迭代 $block[0]->Fields->Field 但我未能做出这样的 xpath 表达式。
【问题讨论】:
-
请发布一个简短的、可重现的代码 sn-p。您可能错误地访问了元素。另外,错误信息与您发布的内容无关。
-
@Josh Davis:我已经更新了代码以提供一个可以开箱即用的示例,并且给出了同样的错误。
-
谢谢,我一会儿看看。