简单的问题。是否可以在 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><p>some <a>stuff</a></p></content>
... HTML块自动转换为实体格式。
使用CDATA包装块也无济于事,因为CDATA的尖括号也会被转换。
那么,有没有办法在不执行此自动转换的情况下添加这样的HTML块?
谢谢, 米^ E
答案 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