可以将HTML内容添加到SimpleXMLElement节点

时间:2009-12-11 07:55:37

标签: php html entity simplexml domdocument

简单的问题。是否可以在 SimpleXMLElement (或事实上, DOMDocument )节点中添加HTML块,而无需将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块?

谢谢, 米^ E

3 个答案:

答案 0 :(得分:2)

问题是您正在创建XML文档,而SimpleXMLElement会创建有效的标记。

原始HTML标记不是有效的XML,因此被过滤掉了。

要创建CDATA部分,您可以尝试DOMDocument::createCDATASection

答案 1 :(得分:1)

实际上,这种行为非常需要。您创建了一个新元素(content)并为其分配了text node。如果文本包含XML特殊字符,则它们将在最终序列化中转换。

如果您不想要此行为,则必须首先在字符串中显式创建元素节点。您可以这样做,例如loadHTML。然后使用appendChild添加元素。

答案 2 :(得分: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>

这将有助于任何面临类似问题的人滚动......

非常欢迎其他建议:)

干杯, 米^ E