Я использую 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
}
}
Результатом $ является массив с объектами SimpleXMLElement. Фактическая ошибка возникает при попытке использовать $block[0]->Fields(объект SimpleXMLElement) в качестве массива. Так что результаты есть. Проблема в итерации.
Это прекрасно работает в PHP 5.3.2, но на сервере с 5.1.6 происходит сбой с:
Неустранимая ошибка: Объекты используются как массивы в post/ предварительное увеличение/уменьшение должно возвращать значения по ссылке
Каков самый простой способ исправить это без обновления версии сервера (администратор сервера считает его «нестабильным» с более новой версией)?
Одним из решений может быть, если бы я мог заставить xpath возвращать поле в первом $result, поэтому мне не придется повторять $block[0]->Fields->Field
, но мне не удалось создать такое выражение xpath.