2009-12-11 3 views
1

Простой вопрос. Можно ли добавить блок HTML в SimpleXMLElement (или, по сути, DOMDocument) узел без автоматической конвертации данных HTML в формат сущности?Возможно добавить HTML-контент в узел SimpleXMLElement

Например, возьмите этот фрагмент кода (с 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-блоки, подобные этому, без выполнения этого автоматического преобразования?

Спасибо, м^е

ответ

2

Проблема в том, что вы создаете документ XML, а SimpleXMLElement создает действительную разметку.

Оригинальные HTML-теги являются недопустимыми XML и, таким образом, отфильтрованы.

Для создания раздела CDATA, вы можете попробовать DOMDocument::createCDATASection

+0

Да. Я сам выяснил, что сейчас. Спасибо за ваш вклад :) –

1

На самом деле, такое поведение вполне хотел. Вы создаете новый элемент (content) и назначаете ему text node. Если текст содержит специальные символы XML, они преобразуются в финальную сериализацию.

Если вы не хотите этого поведения, вы должны явно создать узлы элементов из своей строки в первую очередь. Это можно сделать, например, с помощью loadHTML. Затем добавьте элементы с appendChild.

+0

Спасибо за предложение. Очень признателен. –

1

Я считаю, я нашел решение, в то время как пробираться через руководство 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> 

Это поможет любому, обращенному с подобной проблемой, чтобы получить прокатки ...

Дополнительные предложения приветствуются :)

Приветствия, м^е

Смежные вопросы