Я использую 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 / pre increment / decment, должны возвращать значения по ссылке
Каков самый простой способ исправить это, не обновляя версию сервера (администратор сервера считает его «неустойчивым» с более новой версией)?
Одним из решений может быть, если я могу заставить xpath вернуть поле в первый $ result, поэтому мне не придется перебирать поле $block[0]->Fields->Field
но я не смог создать такое выражение xpath.