Xml parser create ns: примеры (PHP)
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-документов.
Расширение предоставляет объектно-ориентированный интерфейс для работы с XML. Пространства имен поддерживаются через методы children() и attributes(). Удобно для чтения и изменения XML.
Реализует DOM-модель, полностью поддерживает пространства имен. Подходит для сложного манипулирования структурой документа.
Функции SAX (xml_parser_create_ns) подходят для обработки больших файлов с минимальным использованием памяти. SimpleXML и DOMDocument удобнее для произвольного доступа и модификации документов.
Аналоги в других языках
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")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>');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
$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
$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
$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