Для чего нужны XML-парсеры и чем они могут быть полезны. Парсинг XML с помощью SimpleXML Xml парсер php вывод в таблицу

  • 20.06.2020

→ Для чего нужны XML-парсеры и чем они могут быть полезны

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

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

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

Но универсальность текстового формата XML оборачивается вполне очевидным неудобством - перед извлечением данных из документа надо как следует помучиться с синтаксическим анализом текста и определением его структуры. Реализация всех необходимых процедур вручную - весьма нетривиальное занятие, и потребует немалых усилий. Одним из стандартных механизмов, позволяющих упростить жизнь разработчиков, и являются парсеры.

Что же это такое? XML-парсер - это программа, предназначенная для анализа содержимого текстового документа, который соответствует спецификации XML. Ей достается вся "чёрная" работа: получение общих сведений о документе, анализ текста, поиск в нем служебных конструкций (элементов, атрибутов, сущностей и т.п.), проверка на соблюдение синтаксических правил, а также предоставление интерфейса для доступа к документу. В результате аккуратно извлеченные данные, будут переданы пользовательскому приложению, которое может вообще ничего не знать о том, что такое XML.

Парсер может быть выполнен в виде отдельного программного модуля или ActiveX-компонента, может подключаться к приложению через специальные библиотеки классов на этапе компиляции или выполнения. Парсеры делятся на верифицирующие (validating) и неверифицирующие (non-validating). Первые могут проверять структуру документа на основе DTD или схем данных, вторые же об этом не заботятся - и потому имеют, как правило, меньший размер. Многие из современных парсеров "нагружены" многочисленными дополнительными возможностями (расширенная обработка ошибок, добавление и редактирование данных), что делает их более удобными в работе, хотя и повышает размер программ. Практически все распространенные парсеры поддерживают также ряд важных XML-стандартов (XSLT, схемы данных, Name spaces, XPath и т.д.) - или же поставляются в связке с парсерами других производных от него языков.

Если вы осознали полезность парсера для XML, то пора начинать практические опыты. Где же их взять? Особых проблем с поиском соответствующего софта возникнуть не должно: в Интернете полно свободно распространяемых парсеров, написанных на всевозможных языках программирования, работающих на всех платформах и имеющих самые разные характеристики и предназначение.

Наиболее распространенным и известным является парсер Expat, написанный Джеймсом Кларком - одним из создателей спецификации XML. Он реализован на языке программирования C++ и распространяется вместе с исходным кодом. Кстати, поддержка этого языка разметки в таких известных средах, как РНР и Perl, реализована именно на его основе. Другой распространенный парсер - Xerces, есть в Apache XML Project (реализован на языках Java и C++). Можно найти много парсеров для C++, Perl и Python. Основная их масса написана на Java, и годится для любой платформы, знакомой с Java. Не остались в стороне и лидеры рынка (Microsoft, Oracle, Sun), всегда отличающиеся масштабностью и монументальностью. Они выпустили более "тяжеловесные" и функциональные пакеты, которые содержат, помимо собственно парсеров, множество дополнительных утилит, облегчающих жизнь разработчиков.

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

Вот и лето пришло и первая неделя июля пролетела незаметно. Через две недели мне защищать свой диплом, а одна из частей его – XML parser . Но жалко, что не в пхп. Ну ниче, счас наверстаем

Я видел много xml parser`ов, но не затрагивал при этом веб-программирование. Теперь же я хочу выяснить и научиться вместе с вами, как сделать простой xml parser в php.

А зачем? Надо!

Не, ну на самом деле: xml-файлы – очень полезная штука. И любой профессионал должен… нет, не должен, а обязан знать, как с ними работать. Мы же хотим стать профессионалами? Если Вы на моем блоге, то такое желание у Вас есть.

Мы предполагаем, что знаем, что такое XML и описывать его здесь не будем. Ну, если не знаем, то легко узнаем здесь: http://ru.wikipedia.org/wiki/XML

При поиске способов парсинга XML на PHP, я обнаружил простой набор функций в PHP для работы с XML-файлами, который называется «XML Parser Functions ». Парсинг начинается с инициализации парсера вызовом функции xml_parser_create:

$xml_parser = xml_parser_create();

Потом нам нужно сказать парсеру, какие функции будут обрабатывать попадающиеся ему xml-теги и текстовую информацию в процессе парсинга. Т.е. нужно установить некие обработчики:

xml_set_element_handler($xml_parser, “startElement”, “endElement”);

Эта функция отвечает за установку обработчиков начала элемента и конца элемента. Например, если в тексте xml-файла встретится комбинация, то функция startElement сработает, когда парсер найдет элемент, а функция endElement – при нахождении.

Сами же функции startElement и endElement принимают несколько параметров согласно документации по php:



// (т.к. мы можем использовать несколько парсеров)

// $attrs - массив атрибутов обнаруженного элемента
}function endElement($parser, $name) {
// $parser - уникальный идентификатор парсера
// $name - имя обнаруженного элемента
}
?>

А как же считывать данные из файла? Мы же пока не видели ни одного параметра для этого ни в одной из функций! А об этом дальше: считывание файла возлагается на плечи программиста, т.е. мы должны использовать стандартные функции для работы с файлами:

Открыли файл. А теперь нужно построчно считывать его и скармливать считываемые строки функции xml_parse:

Здесь заметим две очень важные вещи. Первая – это то, что функции xml_parse в третьем параметре нужно передать флаг считывания последней строки (true – если строка последняя, false – если нет). Второе – это то, что как и в любом деле, мы должны следить здесь за ошибками. За это отвечают функции xml_get_error_code и xml_error_string. Первая функция получает код ошибки, а вторая – по полученному коду возвращает текстовое описание ошибки. Что в результате возникновения ошибки получится – рассмотрим позже. Не менее полезная функция xml_get_current_line_number скажет нам номер текущей обрабатываемой строки в файле.

И как всегда мы должны освободить занимаемые системой ресурсы. Для парсинга XML – это функция xml_parser_free:

xml_parser_free($xml_parser);

Вот, основные функции мы рассмотрели. Пора бы посмотреть их на деле. Для этого я придумал xml-файл с очень простой структурой:




123

71234567890

Назовем этот файл data.xml и попытаемся его распарсить с помощью следующего кода:

function startElement($parser, $name, $attrs) {
global $depth;echo str_repeat (" ", $depth * 3); // отступы
echo "Element: $name
"; // имя элемента

$depth++; // увеличиваем глубину, чтобы браузер показал отступы

xml_set_element_handler ($xml_parser, "startElement", "endElement");

if (!($fp = fopen ($file, "r"))) {
die ("could not open XML input");
}

while ($data = fgets ($fp)) {
if (!xml_parse ($xml_parser, $data, feof ($fp))) {
echo "
XML Error: ";
echo xml_error_string (xml_get_error_code ($xml_parser));
echo " at line ".xml_get_current_line_number ($xml_parser);
break;
}
}

xml_parser_free ($xml_parser);
?>

В результате разработанного нами простейшего скрипта браузер вывел в свое окно следующую информацию:

Element: ROOT Element: INFO Attribute: WHO = моя Element: ADDRESS Attribute: ULICA = моя улица!! Attribute: KVARTIRA = 12 Attribute: DOM = 15 Element: PHONE

Попробуем испортить XML-файл, заменив тег На , а закрывающий тег оставив прежним:

Element: ROOT Element: INFO Attribute: WHO = моя Element: ADDRESS Attribute: ULICA = моя улица!! Attribute: KVARTIRA = 12 Attribute: DOM = 15 Element: TELEPHONE

XML Error: Mismatched tag at line 5

Ух ты! Сообщения об ошибках работают! Причем довольно информативные.

Эх, я забыл еще одну вещь… Мы же не вывели текст, содержащийся внутри тегов address и phone. Исправляем наш недочет – добавляем текстовый обработчик с помощью функции xml_set_character_data_handler:

xml_set_character_data_handler($xml_parser, ’stringElement’);

И добавляем в код саму функцию-обработчик:

Посмотрим теперь на вывод:

Element: ROOT Element: INFO Attribute: WHO = моя Element: ADDRESS Attribute: ULICA = моя улица!! Attribute: KVARTIRA = 12 Attribute: DOM = 15 String: 123 Element: PHONE String: +71234567890

О! Теперь вывели все!

Кстати, кто-нибудь заметил, что имена тегов и атрибутов все большими буквами написаны? Странно… они же в нашем xml-файле малыми буквами обозначены. Видимо где-то какие-то настройки установлены, чтобы делать uppercase…

Ааа, нашел! Оказывается есть еще функция xml_parser_set_option:

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, 0);

Таким вызовом мы отменяем вывод имен атрибутов и имен тегов большими буквами:

Element: root Element: info Attribute: who = моя Element: address Attribute: ulica = моя улица!! Attribute: kvartira = 12 Attribute: dom = 15 String: 123 Element: phone String: +71234567890

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

nika, Вам нужно вставить вызов
xml_set_character_data_handler($xml_parser, ’stringElement’);
после
xml_set_element_handler($xml_parser, “startElement”, “endElement”);

В общем для правильного отображения нужно соблюдать следующее:
1. нужно, чтобы xml-файл был в кодировке UTF-8
2. в xml-файле первая строчка должна быть такой:
< ?xml version="1.0" encoding="UTF-8"?>
3. нужно инициализировать парсер так:
xml_parser_create(”UTF-8?);
4. нужно перед выводом содержимого xml-файла в браузер настроить последний на кодировку UTF-8:
header(“Content-Type: text/html; charset=utf-8?);

Для отображения текста на русском языке используем
iconv(”UTF-8?,”windows-1251?, $attr), где $attr, то что нужно вывести.

Есть такие два класса интересных в стандартной библеотеке PHP5 – DOMDocument() и XSLTProcesor() использовал на довольно крупных проектах – не жалуюсь =)

Вообще у PHP есть еще одна библиотечка для разбора XML по принципу SAX – называется XMLReader.

    Господа, как вывести из xml с помощью simplexml не стандартные теги, например?
    Переменная вида $text = $item->yandex:full-text не работает.

    Все ОК, только обратите внимание на наличие следующего параметра,

    function cdata($parser, $cdata)
    {
    var_dump($parser, $cdata);
    }

    xml_set_character_data_handler($this->parser, “cdata”);

    Без него не хочет парсить XML с CDATA…. размером в 1.5 метра

    2Nika, Функция header() работает только в том случае, если до нее не было ничего выведено, то бишь первым действие производили ее, т.к. мы отсылаем заголовки на эту страницу, которые говорят нам, что текст нужно переводить в кодировку UTF-8. Судя по вашей ошибке у вас есть пропуски строк, поэтому сделайте вот так:

    Значение == порядковый номер строки
    header(”Content-Type: text/html; charset=utf-8?); == 2

    Всё намного проще делается в действительности
    yurban.ru/development/php_xml_parser

28.3K

Я видел много xml parser`ов, но не затрагивал при этом веб-программирование. Теперь же я хочу выяснить и научиться вместе с вами, как сделать простой xml parser в php.

А зачем? Надо!

Не, ну на самом деле: xml-файлы — очень полезная штука. И любой профессионал должен… нет, не должен, а обязан знать, как с ними работать. Мы же хотим стать профессионалами? Если Вы на моем блоге, то такое желание у Вас есть.

Мы предполагаем, что знаем, что такое XML и описывать его здесь не будем. Ну, если не знаем, то легко узнаем здесь: http://ru.wikipedia.org/wiki/XML

При поиске способов парсинга XML на PHP, я обнаружил простой набор функций в PHP для работы с XML-файлами, который называется «XML Parser Functions». Парсинг начинается с инициализации парсера вызовом функции xml_parser_create:

$xml_parser = xml_parser_create();

Потом нам нужно сказать парсеру, какие функции будут обрабатывать попадающиеся ему xml-теги и текстовую информацию в процессе парсинга. Т.е. нужно установить некие обработчики:

xml_set_element_handler($xml_parser, “startElement”, “endElement”);

Эта функция отвечает за установку обработчиков начала элемента и конца элемента. Например, если в тексте xml-файла встретится комбинация, то функция startElement сработает, когда парсер найдет элемент, а функция endElement — при нахождении.

Сами же функции startElement и endElement принимают несколько параметров согласно документации по php:

А как же считывать данные из файла? Мы же пока не видели ни одного параметра для этого ни в одной из функций! А об этом дальше: считывание файла возлагается на плечи программиста, т.е. мы должны использовать стандартные функции для работы с файлами:

Открыли файл. А теперь нужно построчно считывать его и скармливать считываемые строки функции xml_parse:

XML Error: ".xml_error_string(xml_get_error_code($xml_parser)); echo " at line ".xml_get_current_line_number($xml_parser); break; } } ?>

Здесь заметим две очень важные вещи. Первая — это то, что функции xml_parse в третьем параметре нужно передать флаг считывания последней строки (true — если строка последняя, false — если нет). Второе — это то, что как и в любом деле, мы должны следить здесь за ошибками. За это отвечают функции xml_get_error_code и xml_error_string. Первая функция получает код ошибки, а вторая — по полученному коду возвращает текстовое описание ошибки. Что в результате возникновения ошибки получится — рассмотрим позже. Не менее полезная функция xml_get_current_line_number скажет нам номер текущей обрабатываемой строки в файле.

И как всегда мы должны освободить занимаемые системой ресурсы. Для парсинга XML — это функция xml_parser_free:

xml_parser_free($xml_parser);

Вот, основные функции мы рассмотрели. Пора бы посмотреть их на деле. Для этого я придумал xml-файл с очень простой структурой:




123

71234567890

Назовем этот файл data.xml и попытаемся его распарсить с помощью следующего кода:

Element: $name
"; // имя элемента $depth++; // увеличиваем глубину, чтобы браузер показал отступы foreach ($attrs as $attr => $value) { echo str_repeat(" ", $depth * 3); // отступы // выводим имя атрибута и его значение echo "Attribute: ".$attr." = ".$value."
"; } } function endElement($parser, $name) { global $depth; $depth--; // уменьшаем глубину } $depth = 0; $file = "data.xml"; $xml_parser = xml_parser_create(); xml_set_element_handler($xml_parser, "startElement", "endElement"); if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } while ($data = fgets($fp)) { if (!xml_parse($xml_parser, $data, feof($fp))) { echo "
XML Error: "; echo xml_error_string(xml_get_error_code($xml_parser)); echo " at line ".xml_get_current_line_number($xml_parser); break; } } xml_parser_free($xml_parser); ?>

В результате разработанного нами простейшего скрипта браузер вывел в свое окно следующую информацию:

Element: ROOT
Element: INFO
Attribute: WHO = моя
Element: ADDRESS

Attribute: KVARTIRA = 12
Attribute: DOM = 15
Element: PHONE

Попробуем испортить XML-файл, заменив тег На , а закрывающий тег оставив прежним:

Element: ROOT
Element: INFO
Attribute: WHO = моя
Element: ADDRESS
Attribute: ULICA = моя улица!!
Attribute: KVARTIRA = 12
Attribute: DOM = 15
Element: TELEPHONE

XML Error: Mismatched tag at line 5

Ух ты! Сообщения об ошибках работают! Причем довольно информативные.

Эх, я забыл еще одну вещь… Мы же не вывели текст, содержащийся внутри тегов address и phone. Исправляем наш недочет — добавляем текстовый обработчик с помощью функции xml_set_character_data_handler:

xml_set_character_data_handler($xml_parser, ’stringElement’);

И добавляем в код саму функцию-обработчик.

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

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

$dom = new domDocument("1.0", "utf-8"); // Создаём XML-документ версии 1.0 с кодировкой utf-8
$dom->load("users.xml"); // Загружаем XML-документ из файла в объект DOM
$root = $dom->documentElement; // Получаем корневой элемент
$childs = $root->childNodes; // Получаем дочерние элементы у корневого элемента
/* Перебираем полученные элементы */
for ($i = 0; $i < $childs->length; $i++) {
$user = $childs->item($i); // Получаем следующий элемент из NodeList
$lp = $user->childNodes; // Получаем дочерние элементы у узла "user"
$id = $user->getAttribute("id"); // Получаем значение атрибута "id" у узла "user"
$login = $lp->item(0)->nodeValue; // Получаем значение узла "login"
$password = $lp->item(1)->nodeValue; // Получаем значение узла "password"
/* Выводим полученные данные */
echo "ID: $id
";
echo "Логин: $login
";
echo "Пароль: $password
";
echo "-----------------------
";
}
?>

Из этого кода Вы должны не только понять, как парсить XML-документ на PHP , но и то, что сам процесс парсинга зависит от структуры документа . То есть Вы должны знать, какова структура, иначе разобрать такой документ будет проблемно. Я уже когда-то писал, что главная особенность XML - это строгость синтаксиса . Надеюсь, Вы теперь понимаете, почему это так важно. Без этой "жёсткости кода " было бы крайне затруднительно парсить документы, а вещь эта очень часто требуется. Элементарно при импорте каких-то данных из XML-файла с последующим размещением их в базе данных.