Как стать автором
Обновить

Загрузка в XML строки содержащей entity references (& nbsp; и т.д.)

Время на прочтение2 мин
Количество просмотров4.6K
Задача
В системе с использованием XSLT шаблонов предоставить контентерам возможность просто использовать привычные для них имена сущностей наподобие & nbsp; & mdash; и т.д. без необходимости использования цифровых определений типа & #160;, & #x00A0; или помещения спецсимволов в CDATA

Проблема
При загрузке в XML из базы данных множества блоков у меня возникла следующая проблема: Парсер ругался на неописанные сущности примерно следующим образом: «Entity: line 1: parser error: Entity 'yen' not defined».

Решение
Для того, чтобы при загрузке строки с описанием сущностей не возникало такой проблемы, нужно сделать то, что он от нас ожидает, т.е. описать эти сущности.

Загружаемая строка должна выглядеть примерно так:
<!DOCTYPE root [
<!ENTITY nbsp "&# 160;">
<!ENTITY yen "&# 165;">
]>
<text>Злой& nbsp; текст со злыми сущностями & yen;</text>


Для того, чтобы десять раз не упражняться можно подцепить один раз файл со списком всех необходимых имен
$entities = file_get_contents(PATH_SYS. 'templates/symbols.ent');


Работает это примерно следующим образом:

Подготовим строку для загрузки
$block_content = '<!DOCTYPE root [ '. $entities. ' ]><text>'.$block_content.'</text>';


С использованием метода DOMDocument::loadXML:
$dom_child_doc = DOMDocument::loadXML($block_content,LIBXML_NOENT);
$block_content_node = $blockDoc->importNode($dom_child_doc->lastChild,true);
$block = $blockDoc->blocks->appendChild($block_content_node);


С использованием функции simplexml_load_string:
$xml = simplexml_load_string($block_content,'SimpleXMLElement',LIBXML_NOENT);
$dom_sxe = dom_import_simplexml($xml);
$block_content_node = $blockDoc->importNode($dom_sxe, true);
$block = $blockDoc->blocks->appendChild($block_content_node);

$blockDoc — это некий объект DOMDocument в который мы добавляем блоки.
$blockDoc->blocks — нода этого документа, непосредственно в которую мы помещаем все блоки
Нужно не забывать устанавливать опцию «LIBXML_NOENT — преобразовывать сущности» для загрузчика строки, если есть необходимость чтобы все имена сущностей были преобразованы непосредственно в те символы, которые нам нужны.
Теги:
Хабы:
Всего голосов 9: ↑2 и ↓7-5
Комментарии16

Публикации

Истории

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область