Php get xml results

PHP SimpleXML — получение значений узлов/атрибутов

К настоящему времени вы понимаете, что такое парсер PHP и как читать XML-файлы с его помощью. Вы также узнали о парсере SimpleXML более подробно. В этом уроке мы углубим знания о SimpleXML и о том, как успешно читать файлы XML.

Древовидная структура документа состоит из узлов. Следуя метафоре дерева, вы могли бы назвать их ветвями. Элемент — это тип узла. То же самое и с атрибутом, который не считается дочерним элементом элемента, хотя и содержит информацию о нем. Эти данные заключены в кавычки, что делает их строкой.

Используя примеры кода PHP XML, мы покажем вам, как получить значения узлов и атрибутов. Для этого мы будем использовать функцию PHP simplexml_load_file() .

Как читать файлы XML

  • SimpleXML — это анализатор на основе дерева. Структура данных дерева состоит из узлов.
  • Вы можете получить доступ к значениям узла и атрибута с помощью SimpleXML.
  • Для этого вы должны понимать использование функции PHP simplexml_load_file .

Давайте посмотрим на один из наших XML-документов, который называется books.xml. В нем перечислены три категории книг. В каждой категории есть одна книга, и информация о конкретной книге состоит из ее названия, автора, цены, языка и года выпуска:

Пример

   The Silver Spoon Cielia D`Onofrio 1950 35.00  The Fellowship of the Ring J.R.R. Tolkien 1954 39.99  Think like a programmer V. Anton Spraul 2012 39.99  

Тщательно проанализируйте его, поскольку мы будем использовать этот файл, чтобы объяснить, как читать файлы XML.

Получить значение узла из определенного элемента

Допустим, мы хотим вернуть названия первых двух книг. Код, который вы видите ниже, получает значения элементов нужных нам книг из файла books.xml:

Пример

book[0]->name . "
"; echo $xml->book[1]->name; ?>

Результат выполнения кода:

Цикл для получения значений

Теперь, если мы хотим получить значение узла каждого элемента, мы можем использовать циклы. Посмотрим на код ниже. По сути, он перебирает каждый элемент в нашем XML-документе, получая значение узла для каждого элемента:

Пример

children() as $books) < echo $books->name . ", "; echo $books->by . ", "; echo $books->released . ", "; echo $books->pricing . "
"; > ?>

Результат выполнения кода:

The Silver Spoon, Cielia D`Onofrio, 1950, 35.00
The Fellowship of the Ring, J.R.R. Tolkien, 1954, 39.99
Think like a programmer, V. Anton Spraul, 2012, 39.99

Читайте также:  Javascript write to session

PHP SimpleXML: получение значений атрибутов

А теперь попробуем что-нибудь посложнее. Пример кода, который представлен ниже, получит значение атрибута category из первого найденного элемента . Затем он получит значение атрибута lang из элемента второго элемента :

Пример

book[0]['category'] . "
"; echo $xml->book[1]->name['lang']; ?>

Результат выполнения кода:

Цикл для получения значений атрибутов

В приведенном ниже примере PHP XML показан сценарий, который выполняет итерацию по каждому элементу в нашем файле books.xml и получает значения их атрибутов:

Пример

children() as $books) < echo $books->name['lang']; echo "
"; > ?>

Результат выполнения кода:

Как читать файлы XML: Резюме

  • Расширение PHP SimpleXML позволяет кодировщику читать XML-документы PHP, обращаться к ним и использовать их как структуры данных, состоящие из узлов.
  • SimpleXML также позволяет получать значения узла и атрибута. Для этого мы используем функцию PHP simplexml_load_file .

Источник

Работаем с XML как с массивом, на PHP

Всем привет. Хочу поделиться своим опытом в парсинге XML, хочу рассказать об инструменте который мне в этом помогает.

XML ещё жив и иногда его приходиться парсить. Особенно если вы работаете со СМЭВ (привет всем ребятам для которых «ФОИВ» не пустой звук 🙂 ).

Цели у такого парсинга могут быть самые разные, от банального ответа на вопрос какое пространство имён используется в xml-документе, до необходимости получить структурированное представление для документа вцелом.

Инструмент для каждой цели будет свой. Пространство имён можно найти поиском подстроки или регулярным выражением. Что бы сделать из xml-документа структурированное представление (DTO) — придётся писать парсер.

Для работы с XML в PHP есть пара встроенных классов. Это XMLReader и SimpleXMLElement.

XMLReader

С помощью XMLReader парсинг будет выглядеть примерно так :

$reader = (new XMLReader()); $reader->XML($content); while ($reader->read()) < $this->parse($reader); >

Внутри метода parse(XMLReader $xml) будут бесконечные:

$name = $xml->name; $value = $xml->expand()->textContent; $attrVal = $xml->getAttribute('attribute'); $isElem = $xml->nodeType === XMLReader::ELEMENT;

Для небольших документов или когда нам из всего документа надо только пару элементов, это приемлемо, на больших объёмах — начинает в глазах рябить от однообразного кода, плюс совесть грызёт за оверхэд от перебора всех элементов документа.

SimpleXMLElement

Провести анализ только нужных элементов помогает SimpleXMLElement. Этот класс из XML-документа делает объект, у которого все элементы и атрибуты становятся свойствами, то есть появляется возможность работать только с определёнными элементами, а не со всеми подряд, пример:

$document = new SimpleXMLElement($content); /* имя корневого элемента */ $name = $document->getName(); /* получить произвольный элемент */ $primary = $document ->Message ->ResponseContent ->content ->MessagePrimaryContent ?? null; /* получить элементы определённого пространства имён */ $attachment = $primary ->children( 'urn://x-artefacts-fns-zpvipegr/root/750-08/4.0.1' ) ->xpath('tns:Вложения/fnst:Вложение')[0]; /* получить значение элемента */ $fileName = $attachment ->xpath('//fnst:ИмяФайла')[0] ->__toString();

Удобно, да не совсем. Если имя элемента на кириллице, то обратиться к нему через свойство не получиться, придётся использовать SimpleXMLElement::xpath(). С множественными значениями так же приходиться работать через SimpleXMLElement::xpath(). Кроме того SimpleXMLElement имеет свои особенности и некоторые вещи далеко не очевидны.

Читайте также:  Left menu ext php

Converter

Есть способ проще. Достаточно XML-документ привести к массиву. В работе с массивами нет ни каких подводных камней. Массив из XML делается в пару строчек кода:

$xml= ccc  0000 XML; $fabric = (new NavigatorFabric())->setXml($xml); $converter = $fabric->makeConverter(); $arrayRepresentationOfXml = $converter->toArray();

Каждый XML-элемент будет представлен массивом, состоящим в свою очередь, из трёх других массивов.

  • массив с индексом ‘*value’ содержит значение элемента,
  • ‘*attributes’ — атрибуты элемента,
  • ‘*elements’ — вложенные элементы.
/* 'b' => array ( '*value' => '0000', '*attributes' => array ( 'attr4' => '55', ), '*elements' => array ( 'c' => array ( ), ), ), */

Если элемент множественный, то есть встречается в документе несколько раз подряд, то все его вхождения будут в массиве с индексом ‘*multiple’.

$xml= first occurrence second occurrence  XML; /* 'doc' => array ( 'qwe' => array ( '*multiple' => array ( 0 => array ( '*value' => 'first occurrence', ), 1 => array ( '*value' => 'second occurrence', ) ) ) ) */

XmlNavigator

Если от работы с XML-документов как с массивом, у вас в глазах рябит от квадратных скобочек, то XmlNavigator — это ваш вариант, создаётся так же в две строки кода.

/* документ */ $xml = 666 element value     0     XML; $fabric = (new NavigatorFabric())->setXml($xml); $navigator = $fabric->makeNavigator();

XmlNavigator делает, то же самое что и Converter, но предоставляет API, и с документом мы работаем как с объёктом.

Имя элемента, метод name()

/* Имя элемента */ echo $navigator->name(); /* doc */

Значение элемента, метод value()

/* Значение элемента */ echo $navigator->value(); /* 666 */

Список атрибутов, метод attribs()

/* get list of attributes */ echo var_export($navigator->attribs(), true); /* array ( 0 => 'attrib', 1 => 'option', ) */

Значение атрибута, метод get()

/* get attribute value */ echo $navigator->get('attrib'); /* a */

Список вложенных элементов, метод elements()

/* Список вложенных элементов */ echo var_export($navigator->elements(), true); /* array ( 0 => 'base', 1 => 'valuable', 2 => 'complex', ) */

Получить вложенный элемент, метод pull()

/* Получить вложенный элемент */ $nested = $navigator->pull('complex'); echo $nested->name(); /* complex */ echo var_export($nested->elements(), true); /* array ( 0 => 'a', 1 => 'different', 2 => 'b', 3 => 'c', ) */

Перебрать все вхождения множественного элемента, метод next()

/* Получить вложенный элемент вложенного элемента */ $multiple = $navigator->pull('complex')->pull('b'); /* Перебрать все вхождения множественного элемента */ foreach ($multiple->next() as $index => $instance) < echo " name()>[$index]" . " => get('val')>;"; > /* b[0] => x; b[1] => y; b[2] => z; */

Все методы класса XmlNavigator

Класс XmlNavigator реализует интерфейс IXmlNavigator.

Из названий методов очевидно их назначение. Не очевидные были рассмотрены выше.

Как установить?

composer require sbwerewolf/xml-navigator

Заключение

В работе приходиться использовать сначала SimpleXMLElement — с его помощью из всего документа получаем необходимый элемент, и уже с этим элементом работаем через XmlNavigator.

$document = new SimpleXMLElement($content); $primary = $document ->Message ->ResponseContent ->content ->MessagePrimaryContent; $attachment = $primary ->children( 'urn://x-artefacts-fns-zpvipegr/root/750-08/4.0.1' ) ->xpath('tns:Вложения')[0]; $fabric = (new NavigatorFabric())->setSimpleXmlElement($attachment); $navigator = $fabric->makeNavigator();

Желаю вам приятного использования.

Читайте также:  Equals for java enums

Эпилог

Конечно у вас могут быть свои альтернативы для работы с XML. Предлагаю поделиться в комментариях.

Конечно, не могу сказать, что XmlNavigator поможет с любым XML — не проверял, но с обычными документами, без хитростей в схеме документа, проблем не было.

Если вам важен порядок следования элементов, то придётся пользоваться XMLReader. Потому что SimpleXMLElement приводит документ к объекту, а у объекта нет такого понятия как порядок следования элементов.

Источник

PHP SimpleXML — Get Node/Attribute Values

SimpleXML is a PHP extension that allows us to easily manipulate and get XML data.

PHP SimpleXML — Get Node Values

Get the node values from the «note.xml» file:

Example

$xml=simplexml_load_file(«note.xml») or die(«Error: Cannot create object»);
echo $xml->to . «
«;
echo $xml->from . «
«;
echo $xml->heading . «
«;
echo $xml->body;
?>

The output of the code above will be:

Another XML File

Assume we have an XML file called «books.xml», that looks like this:

PHP SimpleXML — Get Node Values of Specific Elements

The following example gets the node value of the element in the first and second elements in the «books.xml» file:

Example

$xml=simplexml_load_file(«books.xml») or die(«Error: Cannot create object»);
echo $xml->book[0]->title . «
«;
echo $xml->book[1]->title;
?>

The output of the code above will be:

PHP SimpleXML — Get Node Values — Loop

The following example loops through all the elements in the «books.xml» file, and gets the node values of the , , , and elements:

Example

$xml=simplexml_load_file(«books.xml») or die(«Error: Cannot create object»);
foreach($xml->children() as $books) <
echo $books->title . «, «;
echo $books->author . «, «;
echo $books->year . «, «;
echo $books->price . «
«;
>
?>

The output of the code above will be:

Everyday Italian, Giada De Laurentiis, 2005, 30.00
Harry Potter, J K. Rowling, 2005, 29.99
XQuery Kick Start, James McGovern, 2003, 49.99
Learning XML, Erik T. Ray, 2003, 39.95

PHP SimpleXML — Get Attribute Values

The following example gets the attribute value of the «category» attribute of the first element and the attribute value of the «lang» attribute of the element in the second element:

Example

$xml=simplexml_load_file(«books.xml») or die(«Error: Cannot create object»);
echo $xml->book[0][‘category’] . «
«;
echo $xml->book[1]->title[‘lang’];
?>

The output of the code above will be:

PHP SimpleXML — Get Attribute Values — Loop

The following example gets the attribute values of the elements in the «books.xml» file:

Example

$xml=simplexml_load_file(«books.xml») or die(«Error: Cannot create object»);
foreach($xml->children() as $books) <
echo $books->title[‘lang’];
echo «
«;
>
?>

The output of the code above will be:

More PHP SimpleXML

For more information about the PHP SimpleXML functions, visit our PHP SimpleXML Reference.

Источник

Оцените статью