Возможно добавить 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>&lt;p&gt;some &lt;a&gt;stuff&lt;/a&gt;&lt;/p&gt;</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.

Другие вопросы по тегам