можно ли легко преобразовать node имеющий суб ноды в объект?

jkhsdgf

Новичок
Ситуация такая.

Есть node в xml документе (ответ от soap сервера).
И этот node имеете вложенную структуру. Там кроме элементов непосредственно в нем самом есть еще вложенные node (child, children).
Уровень вложенности 3 или 4 - сейчас точно не помню.
В общей сложности там получается десятка два элементов. И значения всех этих элементов нужно извлечь для дальнейшей обработки.

Вопрос не в том как извлечь эти элементы. Я пару путей нашел. Через DOM или через SimpleXML.
Но получается как-то громоздко.

Можно ли как-то быстро и просто преобразовать этот node в объект или массив?
Я не прошу детальный листинг - подскажите направление.
Может быть есть какой-то сторонний код, который такое делает?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
XML в принципе нельзя переложить на массив однозначно, т.к. у него есть еще атрибуты.
Ну и к SimpleXML и так можно обращаться в целом, почти как к массиву.
 

jkhsdgf

Новичок
что мешает преобразовать <SomeName>value</SomeName> в array('SomeName'=>value)?

да в SimpleXML можно обращаться к элементам как к массиву. Но в данном случае это более двадцати команд (по числу элементов).

а хочется чего-то типа:
$object = someFunction($SimpleXML->node);

и потом работать с этим объектом.
 

Sufir

Я не волшебник, я только учусь
что мешает преобразовать <SomeName>value</SomeName> в array('SomeName'=>value)?

да в SimpleXML можно обращаться к элементам как к массиву. Но в данном случае это более двадцати команд (по числу элементов).

а хочется чего-то типа:
$object = someFunction($SimpleXML->node);

и потом работать с этим объектом.
Ну, дак SimpleXML сам тебе и возвращает готовый объект класса SimpleXMLElement.
Если у тебя есть конкретная сущность, которая должна быть сформирована из xml - так бери из него данные, точно так же как ты берёшь их из других хранилищ, например базы. Какая, в данном случае разница откуда они поступают?
Если же тебе просто нужен объект - то он у тебя уже есть. Зачем тебе один объект (прекрасный и очень удобный) преобразовывать в другой?

да в SimpleXML можно обращаться к элементам как к массиву. Но в данном случае это более двадцати команд (по числу элементов).
А твой объект как это будет делать?

Я вообще не понимаю смысла происходящего... Покажи пример xml-файла, обращения к нужному полю через SimpleXML, и пример того, что тебе хотелось бы иметь.
 

jkhsdgf

Новичок
с сервера приходят вот такие ноды (несколько десятков в одном ответе):

<flight>
<token>A3MDE6RUNPTk</token>
<carrier><code>SU</code><name>ОАО "Аэрофлот- российские авиалинии"</name></carrier>
<eticket>true</eticket>
<latinRegistration>true</latinRegistration>
<timeLimit>2012-06-24T00:00:00+04:00</timeLimit>
<segments>
<segment><serviceClass>ECONOMY</serviceClass>
<bookingClass>Q</bookingClass>
<airline><code>SU</code><name>ОАО "Аэрофлот- российские авиалинии"</name></airline>
<board><code>738</code><name>Б737-800</name></board>
<dateBegin>2012-07-01T18:45:00</dateBegin>
<dateEnd>2012-07-01T20:55:00</dateEnd>
<flightNumber>4705</flightNumber>
<locationBegin><code>KRR</code><name>Пашковский</name></locationBegin>
<locationEnd><code>SVO</code><name>Шереметьево</name></locationEnd>
<remarksSearchContext>Y3Q+Cg==</remarksSearchContext>
<starting>true</starting>
<connected>false</connected>
<travelDuration>130</travelDuration>
</segment>
</segments>
<price>
<price><elementType>TARIFF</elementType><passengerType>ADULT</passengerType><amount>3850</amount></price>
<price><elementType>TAXES</elementType><passengerType>ADULT</passengerType><amount>1696</amount></price>
</price>
</flight>

пять уровней вложенности. 29 элементов.

и эти данные нужно:
1) отобразить в html для посетителя
2) скопировать в локальную бд

учитывая вложенность и количество элементов получатся муторное занятие.

первоначально я предполагал перенести эти данные в массив и затем уже работать с массивом (или в объект).
поэтому и спросил есть ли простой способ создать объект из xml.

но теперь вот думаю, может сразу с объектом SimpleXML работать.
 

Sufir

Я не волшебник, я только учусь
khsdgf, если атрибутов нет (как в предоставленном куске) то можно и в массив преобразовать, например так. Или, там-же по ссылке в комментах, есть другие реализации (даже и атрибуты как-то перегоняют). Но смысла я в этом не вижу, т.к. полученный массив никаких преимуществ перед SimpleXMLElement иметь не будет. Повторюсь, SimpleXML очень простой и удобный в использовании инструмент.
PHP:
// Массив
$holyArray['flight']['segments']['segment']['locationEnd']['name']; // Шереметьево
// Объект SimpleXMLElement
$damnSimpleXMLElement->segments->segment->locationEnd->name; // Шереметьево
 

jkhsdgf

Новичок
khsdgf, Но смысла я в этом не вижу, т.к. полученный массив никаких преимуществ перед SimpleXMLElement иметь не будет.
"та о тож" :)
я сейчас тоже не вижу. выигрыша в объеме писанины не получается.
при любом раскладе получается куча кода.

anyway спасибо :)
 

Rabotyahoff

Новичок
Можно ли как-то быстро и просто преобразовать этот node в объект или массив?
http://www.phpclasses.org/package/7232-PHP-Convert-between-XML-files-and-arrays-or-strings.html

Но смысла я в этом не вижу, т.к. полученный массив никаких преимуществ перед SimpleXMLElement иметь не будет.
работа с массивами в php организована куда лучше чем с xml
 
Сверху