Xml parser create ns: примеры (PHP)

Работа с xml_parser_create_ns: разбор XML в PHP
Раздел: XML
xml_parser_create_ns(string encoding [, string separator]): resource

Функция xml_parser_create_ns

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

Аргументы функции

Функция принимает два необязательных аргумента:

  • encoding (string, необязательный) — кодировка входных данных. Если не указана, анализатор пытается определить кодировку автоматически. Поддерживаемые значения: 'UTF-8', 'ISO-8859-1', 'US-ASCII'.
  • separator (string, необязательный) — разделитель, который будет вставляться между пространством имен и именем тега или атрибута в обработчиках. По умолчанию используется двоеточие ':'.

Примеры использования

Простой разбор с пространствами имен
<?php
$xml = '<root xmlns:book="http://example.org/book"><book:title>PHP Guide</book:title></root>';
$parser = xml_parser_create_ns();
xml_set_element_handler($parser, function($parser, $name, $attrs) {
    echo "Тег: $name\n";
});
xml_parse($parser, $xml);
xml_parser_free($parser);
?>
Тег: root
Тег: http://example.org/book:title
Использование разделителя
<?php
$xml = '<root xmlns:book="http://example.org/book"><book:title>Guide</book:title></root>';
$parser = xml_parser_create_ns('UTF-8', '|');
xml_set_element_handler($parser, function($parser, $name, $attrs) {
    echo "Тег: $name\n";
});
xml_parse($parser, $xml);
?>
Тег: root
Тег: http://example.org/book|title

Похожие функции в PHP

Создает анализатор без поддержки пространств имен. Применяется для более простых XML-документов.

SimpleXML

Расширение предоставляет объектно-ориентированный интерфейс для работы с XML. Пространства имен поддерживаются через методы children() и attributes(). Удобно для чтения и изменения XML.

DOMDocument

Реализует DOM-модель, полностью поддерживает пространства имен. Подходит для сложного манипулирования структурой документа.

Критерии выбора

Функции SAX (xml_parser_create_ns) подходят для обработки больших файлов с минимальным использованием памяти. SimpleXML и DOMDocument удобнее для произвольного доступа и модификации документов.

Аналоги в других языках

Python: xml.sax
import xml.sax

class Handler(xml.sax.ContentHandler):
    def startElementNS(self, name, qname, attrs):
        print(f"Тег: {name}")

parser = xml.sax.make_parser()
parser.setContentHandler(Handler())
parser.parse("data.xml")
JavaScript: SAX-парсеры
const sax = require('sax');
const parser = sax.parser(true);
parser.onopennamespace = function(ns) {
    console.log(`Пространство: ${ns.name}`);
};
parser.write('<root xmlns:book="http://example.org"></root>');
Java: SAXParser
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();

Отличие PHP-функции — использование разделителя для пространств имен, что упрощает обработку.

Типичные ошибки

Некорректная кодировка
<?php
$xml = '<root>Тест</root>';
$parser = xml_parser_create_ns('ISO-8859-1');
// Если XML в UTF-8, символы могут исказиться
?>
Отсутствие обработчиков
<?php
$parser = xml_parser_create_ns();
$xml = '<root>data</root>';
xml_parse($parser, $xml); // Не будет ошибки, но разбор не произойдет
?>
Неправильный разделитель
<?php
$parser = xml_parser_create_ns(null, ''); // Пустой разделитель
// Может привести к неоднозначности в именах
?>

Изменения в версиях PHP

В PHP 8.0 функция не претерпела значительных изменений. Однако, в PHP 7.3 была улучшена обработка ошибок при неверной кодировке. В ранних версиях PHP 5 функция стала стабильной частью ядра. Рекомендуется использовать последние версии PHP для лучшей производительности.

Расширенные примеры

Разбор атрибутов с пространствами имен
Пример php
<?php
$xml = '<root xmlns:x="http://example.org/ns" x:id="123"></root>';
$parser = xml_parser_create_ns();
xml_set_element_handler($parser, 
    function($parser, $name, $attrs) {
        foreach ($attrs as $key => $value) {
            echo "Атрибут: $key = $value\n";
        }
    }, null);
xml_parse($parser, $xml);
?>
Атрибут: http://example.org/ns:id = 123
Обработка больших файлов
Пример php
<?php
$parser = xml_parser_create_ns();
xml_set_element_handler($parser, 
    function($parser, $name, $attrs) {
        // Обработка каждого элемента по мере чтения
    }, null);
$fp = fopen('large.xml', 'r');
while ($data = fread($fp, 4096)) {
    xml_parse($parser, $data, feof($fp));
}
fclose($fp);
?>
Кастомный разделитель для обработки
Пример php
<?php
$xml = '<book:title xmlns:book="http://example.org">Name</book:title>';
$parser = xml_parser_create_ns('UTF-8', '__');
xml_set_element_handler($parser, function($parser, $name) {
    $parts = explode('__', $name);
    echo "Пространство: {$parts[0]}, Локальное имя: {$parts[1]}\n";
}, null);
xml_parse($parser, $xml);
?>
Пространство: http://example.org, Локальное имя: title

PHP xml_parser_create_ns function comments

En
Xml parser create ns Create an XML parser with namespace support