Возможно добавить HTML-контент в узел SimpleXMLElement
Простой вопрос Можно ли добавить блок HTML в узел SimpleXMLElement (или, по сути, DOMDocument) без автоматического преобразования данных HTML в формат объекта?
Например, возьмем этот фрагмент (с DOMDocument здесь, но SimpleXMLElement ведет себя точно так же):
<?php
$dom = new DOMDocument( '1.0', 'utf-8' );
$de = $dom->createElement( 'content', '<p>some <a>stuff</a></p>' );
$dom->appendChild( $de );
echo $dom->saveXML();
?>
Выход:
<p>some <a>stuff</a></p>
Если вы посмотрите на источник, вы увидите:
<?xml version="1.0" encoding="utf-8"?>
<content><p>some <a>stuff</a></p></content>
... HTML-блок автоматически конвертируется в формат объекта.
Даже обертывание блока с помощью CDATA не помогает, так как угловые скобки CDATA тоже конвертируются.
Итак, есть ли способ добавить блоки HTML, как это без выполнения этого автоматического преобразования?
Спасибо, м ^ е
3 ответа
Проблема в том, что вы создаете документ XML, а SimpleXMLElement создает допустимую разметку.
Исходные теги HTML не являются допустимыми XML и поэтому отфильтровываются.
Чтобы создать раздел CDATA, вы можете попробовать DOMDocument::createCDATASection
Я полагаю, что нашел решение во время изучения руководства по php.
DOMDocument имеет метод-член CreateCDATASection, который поможет вам достичь этого, хотя и хитро.
Вот версия кода, размещенная выше с использованием этого нового метода:
<?php
$dom = new DOMDocument( '1.0', 'utf-8' );
$de = $dom->createElement( 'content' );
$dd = $dom->createCDataSection( '<p>some <a>stuff</a></p>' );
$de->appendChild( $dd );
$dom->appendChild( $de );
echo $dom->saveXML();
?>
Выход желаемый...
<?xml version="1.0" encoding="utf-8"?>
<content><![CDATA[<p>some <a>stuff</a></p>]]></content>
Это поможет любому, кто сталкивается с подобной проблемой, начать работать...
Дополнительные предложения приветствуются:)
Ура, м ^ е
На самом деле, это поведение довольно желательно. Вы создаете новый элемент (content
) и назначьте ему текстовый узел. Если текст содержит специальные символы XML, они преобразуются в окончательной сериализации.
Если вы не хотите такого поведения, вы должны явно создать узлы элементов из вашей строки. Это вы можете сделать, например, с помощью loadHTML. Затем добавьте элементы с помощью appendChild.