admin / 18.03.2018

Php работа с xml

Работа с XML-документом в PHP

В сегодняшней статье я разберу работу с XML-документами в PHP. Не секрет, что XML, как таковой, вообще не нужен. А нужен он исключительно, как инструмент для хранения данных, которые должны быть использованы в других языках программирования, в частности, в PHP. XML — это примерно та же база данных, которая без использования, так же смысла не имеет. И вот как работать через PHP с XML-документом, я объясню в этой статье.

Сегодня мы разберём только, как считать XML.

Вначале мы создаём объект класса DomDocument(), далее мы загружаем в этот объект информацию из файла «data.xml«. После с помощью метода saveXML() мы считываем эту записанную информацию и выводим, пропуская через функцию htmlspecialchars(), чтобы увидеть весь код прямо в окне браузера (без htmlspecialchars() полный код можно будет увидеть только в исходниках страницы).

Таким образом, мы получили ту самую переменную $data, которая содержит весь XML-код. Теоритически, этого уже достаточно для абсолютно любых манипуляций с XML-документом, однако, в PHP (а точнее в DOM-стандарте) существует множество возможностей, как облегчить работу с XML-документом. И вот об этом мы будем говорить в следующих статьях.

  • Создано 09.09.2011 14:29:54

  • Михаил Русаков

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так:

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

сделать
заказ

версия
для печати

Конвертер новых XML-файлов Росреестра в форматы 2016 г.

Вы получили в Росреестре новый XML-файл из ЕГРН с 01.01.2017 г., либо ранее, но его не получается импортировать в программы.

Что делать?

Есть простое решение проблемы: конвертируйте XML-файл из нового формата 2017 (либо 2016) года в старый формат 2015 года (действовал до 23.06.2016 г.) с помощью данного веб-сервиса.

Работа с XML средствами PHP

После этого полученный здесь файл можно будет импортировать в любые кадастровые программы, распечатать по прежним шаблонам печати.

Для чего предназначен этот веб-сервис?

Сервис предназначен для конвертирования следующих типов файлов, выдаваемых Росреестром с 01.01.2017 г., а также файлов более раннего формата, выдаваемых с 23.06.2016 года:

  • Кадастровый план территории
  • Кадастровая выписка о земельном участке
  • Кадастровый паспорт земельного участка
  • Кадастровая выписка об объекте капитального строительства
  • Кадастровый паспорт объекта капитального строительства
  • Уведомление об отсутствии сведений
  • Выписка об основных характеристиках земельного участка из ЕГРН
  • Выписка (полная) о характеристиках земельного участка из ЕГРН
  • Выписка об основных характеристиках объекта капитального строительства из ЕГРН
  • Выписка (полная) о характеристиках объекта капитального строительства из ЕГРН

Инструкция:

С помощью кнопки Выберите файл (Обзор) выберите исходный XML-файл, который необходимо конвертировать, либо ZIP-архив, нажмите на кнопку Конвертировать. После этого страница обновится, и на экране появится ссылка для скачивания полученного файла. Чтобы сохранить файл, нажмите правой кнопкой на ссылке и выберите Сохранить по ссылке (как).

Предупреждение: загружая XML-файл, Вы автоматически выражаете свое согласие с правилами сервиса Архив КПТ. Импорт из XML-файлов работает в программе: Полигон Про.

Внимание: передача файла на сервер и процесс конвертации может занять некоторое время (даже несколько минут в зависимости от размера файла). После нажатия на кнопку Конвертировать не закрывайте окно браузера и не переходите по ссылкам.

Сервис работает бесплатно. Количество конвертируемых файлов не ограничено.


Сервис работает бесплатно, но Вы можете нас отблагодарить:

  • Поделитесь ссылкой в социальных сетях
  • Напишите на форумах об этом сервисе
  • Расскажите коллегам о существовании этого сервиса
  • Напишите отзыв на нашем сайте

Примеры

Ниже представлен пример, демонстрирующий внутреннее устройство массивов, генерируемых функцией.

Часть 1. Работа с XML в PHP за 15 минут

XML строка содержит простой тэг note вложенный в тэг para. Программа в примере разбирает эту строку и выводит построенные массивы:

Пример #1 Пример использования xml_parse_into_struct()

После обработки программа выведет следующее:

Index array Array ( [PARA] => Array ( [0] => 0 [1] => 2 ) [NOTE] => Array ( [0] => 1 ) ) Массив Vals Array ( [0] => Array ( [tag] => PARA [type] => open [level] => 1 ) [1] => Array ( [tag] => NOTE [type] => complete [level] => 2 [value] => simple note ) [2] => Array ( [tag] => PARA [type] => close [level] => 1 ) )

Управляемый событиями разбор (основанный на expat библиотеке) может дать труднообрабатываемый результат в случае, если разбирается составной XML документ.

Эта функция не создает DOM объектов, но создаваемые ею массивы можно преобразовать в древовидную структуру впоследствии. Таким образом можно довольно просто создавать объекты, представляющие содержимое XML файла. Предположим, что следующий XML файл представляет небольшую базу данных с информацией об аминокислотах:

Пример #2 moldb.xml — небольшая база данных с информацией о молекулах

<?xml version="1.0"?> <moldb> <molecule> <name>Alanine</name> <symbol>ala</symbol> <code>A</code> <type>hydrophobic</type> </molecule> <molecule> <name>Lysine</name> <symbol>lys</symbol> <code>K</code> <type>charged</type> </molecule> </moldb>

Код, разбирающий документ и создающий подходящие объекты:

Пример #3 parsemoldb.php — разбирает moldb.xml и помещает данные в массив молекул

После выполнения переменная содержит массив объектов AminoAcid, а вывод соответственно следующий:

** База данных аминокислот: Array ( [0] => aminoacid Object ( [name] => Alanine [symbol] => ala [code] => A [type] => hydrophobic ) [1] => aminoacid Object ( [name] => Lysine [symbol] => lys [code] => K [type] => charged ) )

PHP — очень интересный язык программирования, предоставляющий массу возможностей, что называется, прямо из коробки. В последних версиях PHP (начиная с 5.1) в стандартную поставку вошел класс , предназначенный для чтения файлов XML. В принципе, объект-то достаточно понятный, однако я столкнулся с одной неприятной особенностью, что и побудило меня написать данную статью. Но обо всем по порядку.

Итак, создаем объект класса :

$reader = new XMLReader();

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

Однако довольно часто второй метод используется и для открытия файлов. Воспользуемся, например, :

if (!$reader->open(‘http://example.com/example.xml’) { die(‘Не удалось открыть файл’); }

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

Теперь, собственно, переходим к разбору.

PHP: работа с XML

Во-первых, если есть схема документа, то можно сразу же проверить его на соответствие схеме. Первый вариант — это когда в соответствии с полным стандартом XML схема указана в заголовке XML-файла. Тогда валидацию можно произвести так:

$reader->setParserProperty(XMLReader::VALIDATE, true); if (!$reader->isValid()) { die(‘Неправильный XML’); }

Подобный код нужно вызывать после открытия документа (методом Open или XML), но до первого считывания (методом Read).

Другой вариант — это воспользоваться форматом описания схем RELAX NG, особенно если XML-документ достаточно простой. Тем более что такую схему можно описать в виде строки прямо в php-скрипте — необязательно иметь ее в виде файла. К сожалению, более-менее внятной спецификации Relax NG на русском языке я с ходу не нашел, пожалуй, можно обратиться к широко рекламируемым в последнее время пособиям от IBM, в частности к статье Валидация XML-документов. В этом случае для установки схемы Relax NG используются методы , если схема сохранена в виде файла, и , если схема передается в виде строки.

Теперь самое время приступить к чтению. В общем-то, в самом общем виде это цикл . Если же быть чуть более конкретным, то у нас будет серия вложенных циклов, в которых мы будем смотреть на текущий так называемый тип узла (node) и его имя, и, в зависимости от этого, предпринимать какие-либо действия, например, открывать вложенный цикл. И так далее. Также мне представляется удобным сформировать из содержимого XML-файла ассоциативный массив, с которым потом и работать после считывания. Это, по идее, уменьшает вероятность ошибок и увеличивает гарантию того, что XML мы считали правильно.

Что же касается типов узлов, то их довольно много, наиболее важные из них:

  • — начало элемента ()
  • — атрибут элемента ()
  • — конец элемента ()
  • — содержимое элемента (в общем-то, это существенная часть между и , хотя в этой области также обитают, например — незначащие пробелы — и т.п.)

Итак, набросок кода цикла по XML файлу:

$xmlarr = array(); $idx = 0; while ($reader->read()) { if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element1’)) { // считываем атрибуты $xmlarr[$idx][‘Attr1’] = $reader->getAttribute(‘Attr1’); while ($reader->read()) { // разбираем вложенные элементы if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element11’)) { while ($reader->read()) { if ($reader->nodeType == XMLReader::TEXT) { // получаем значение из свойства $reader->value; $xmlarr[$idx][$reader->name] = $reader->value; } elseif (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element111’)) { // еще один вложенный элемент while ($reader->read()) { if ($reader->nodeType == XMLReader::TEXT) /* и т.д.

*/ { $xmlarr[$idx][‘Element11’][$reader->name] = $reader->value; } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == ‘Element111’)) { break; } } } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == ‘Element11’)) { break; } } } elseif (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element12’)) { while ($reader->read()) { if ($reader->nodeType == XMLReader::TEXT) { // … = $reader->value; } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == ‘Element12’)) { break; } } } elseif (($reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == ‘Element1’)) { $idx += 1; break; } } } }

Итак, мы пользовались такими свойствами, как (тип узла), (наименование узла) и (значение), а также методом getAttribute для получения значения атрибута по заранее известному имени. Если же атрибуты заранее неизвестны, то тогда по аналогии открывается вложенный цикл с проверкой . В общем-то, здесь самое сложное не запутаться во вложенных циклах

А теперь, та самая неприятная особенность, с которой я столкнулся и из-за которой, в немалой степени, я и засел за написание данной статьи. Дело в том, что при использовании самозакрывающихся элементов (например, ), в отличие, например, от парсера, который использует 1С: Предприятие 8 (видимо, какую-то Windows-библиотеку), не распознает /> как . Так что мой совет — избегать подобного рода самозакрывающиеся элементы. Хотя я и не отрицаю возможности, что у меня были устаревшие библиотеки PHP (в частности libxml), поэтому в последних версиях, возможно, эта ошибка (я склонен все-таки считать эту особенность именно ошибкой) исправлена.

Ну что ж, надеюсь, данной статьей я, так сказать, ввел вас в курс дела, ну а для более серьезного изучения вопроса я, пожалуй, снова сошлюсь на IBM-овское пособие — Синтаксический анализ XML в PHP, однако нужно иметь в виду, что та статья довольно-таки обширная, и там рассматривается данный вопрос с точки зрения организации AJAX.

P.S. Не забудьте закрыть XML-файл

$reader->close();

Замечания и предложения

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

Mrb: решение для этой проблемы следующее:

if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == ‘Element11’) && !$reader->isEmptyElement) { //код… }

В этом случае скрипт будет проверять не является ли элемент пустым, то бишь самозакрывающимся.

Виталий

reader->open(‘http://example.com/example.xml’, NULL, LIBXML_NOEMPTYTAG);

Вот и всё решение проблемы.
(integer) — разворачивать пустые тэги (например <br/> в <br></br>).

Категория: Программирование, 1С | Опубликовано 03.05.2009 | Редакция от 15.01.2017

Похожие материалы:


Работа с XML

Добрый день, уважаемые читатели. Сегодня мы познакомимся с процессом создания XML-файла средствами PHP.

XML-файл создается с помощью специального класса DomDocument.

Инициализация класса происходит следующим образом:

$xml = new DomDocument(‘1.0′,’utf-8’);

Создадим файл со следующей конструкцией:

<?xml version="1.0" encoding="utf-8"?> <products> <product> <name>Товар 1</name> <category>Категория 1</category> <price>999.00</price> </product> </products>

Начнем с того, что создадим родительский тэг:

$products = $xml->appendChild($xml->createElement(‘products’));

Далее создаем дочерний элемент <product>

$product = $products->appendChild($xml->createElement(‘product’));

Обратите внимание, что в функция appendChild вызывается с помощью объекта $products, а не $xml как в первом случае. Так мы создаем дочерний элемент к <products>.

Далее мы создаем остальные дочерние элементы к тегу <product> и присваиваем им значения:

$name = $product->appendChild($xml->createElement(‘name’)); $xml->appendChild($xml->createTextNode(‘Товар 1’)); $category = $product->appendChild($xml->createElement(‘category’)); $xml->appendChild($xml->createTextNode(‘Категория 1’)); $price = $product->appendChild($xml->createElement(‘price’)); $xml->appendChild($xml->createTextNode(‘999.00’));

Чтобы сохранить XML в файл пишем:

$xml->formatOutput = true; <pre></pre> $xml->save(‘myxml.xml’);

Чтобы вывести XML-файл:

$xml->formatOutput = true; echo $xml->saveXML();

Вот и все!

Как видите ничего сложного нет. Если есть какие-то вопросы — задавайте в комментариях

Tags: DomDocument, php, xml, создание xml

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*