1

简单的问题。是否可以在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 块?

谢谢,m^e

4

3 回答 3

2

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

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

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

于 2009-12-11T08:09:53.260 回答
1

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

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

于 2009-12-11T08:08:06.337 回答
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>

这将帮助任何面临类似问题的人开始滚动......

欢迎提供其他建议:)

干杯,m^e

于 2009-12-11T08:10:34.803 回答