Получить содержимое узла из файла xml и преобразовать его в массив php?

Я ищу решение для извлечения некоторого узла из большого XML-файла (используя xmlstarlet http://xmlstar.sourceforge.net/), а затем разобрать этот узел на массив php.

elements.xml

<?xml version="1.0"?>
<elements>
  <element id="1" par1="val1_1" par2="val1_2" par3="val1_3">
    <title>element 1 title</title>
    <description>element 1 description</description>
  </element>
  <element id="2" par1="val2_1" par2="val2_2" par3="val2_3">
    <title>element 2 title</title>
    <description>element 2 description</description>
  </element>
</elements>

Чтобы извлечь тег элемента с id="1" с помощью xmlstarlet, я выполняю эту команду оболочки...

xmlstarlet sel -t -c "/elements/element[id=1]" elements.xml

Эта команда оболочки выводит что-то вроде этого...

<element id="1" par1="val1_1" par2="val1_2" par3="val1_3">
  <title>element 1 title</title>
  <description>element 1 description</description>
</element>

Как я могу разобрать этот вывод оболочки в массив php?

Спасибо.


Я нашел http://php.net/manual/en/function.simplexml-load-string.php довольно полезен. Эта функция SimpleXML преобразует извлеченный фрагмент XML в объект SimpleXML.


person Kirzilla    schedule 18.04.2010    source источник
comment
просто любопытно, зачем использовать xmlstar вместо чего-то вроде simplexml или xml dom?   -  person Jamie    schedule 18.04.2010
comment
Мой файл XML довольно большой (~ 100 МБ). Я не уверен, что Simplexml или XmlDom не загружают весь XML-файл в ОЗУ (это может привести к чрезмерному использованию памяти php); но я не уверен, что говорю это, потому что ничего не знаю о механизме Simplexml для разбора файлов XML.   -  person Kirzilla    schedule 18.04.2010
comment
SimpleXML и DOM делают почти то же самое, поскольку используют одну и ту же реализацию libxml. Функции для переключения между dom и simplexml делают немного больше, чем просто передают свой внутренний xmlNodePtr. Так что да, документ будет в памяти. Но есть и другие расширения парсеров, например. XMLReader.   -  person VolkerK    schedule 18.04.2010
comment
Как бы вы выполнили эту комбинацию xmlstarlet + php? Это php-скрипт, который вызывает xmlstarlet (например, через exec()?) Или вы начинаете из командной строки, например xmlstarlet params parmas params | php -f params ?   -  person VolkerK    schedule 18.04.2010
comment
@VolkerK, я просто использую shell_exec() для вызова xmlstarlet   -  person Kirzilla    schedule 18.04.2010


Ответы (1)


вы всегда можете взять новый выведенный xml и использовать simplexml, например:

$data = '<element id="1" par1="val1_1" par2="val1_2" par3="val1_3">
<title>element 1 title</title>
<description>element 1 description</description>
</element>';


$xml = simplexml_load_string($data);
echo $xml->title; //access title
echo $element_ID = $xml->attributes()->id; //access elements attributes by name

и теперь $xml - это массив, который вам нужен

person Jamie    schedule 18.04.2010