PHP 如何使用 quot;带有 DOMdocument 的 XML 中的实体


PHP How to use quot; entities in XML with DOMdocument

我正在修改由其他库生成的XML文件的内容。 我正在使用 PHP (5.3.10( 进行一些 DOM 修改并重新插入替换节点。

正在使用的XML数据在我进行操作之前有"元素,我想在完成修改后按照 http://www.w3.org/TR/REC-xml/保留这些元素。

但是我在 PHP 更改"元素时遇到问题。 看我的例子。

$temp = 'Hello "XML".';
$doc = new DOMDocument('1.0', 'utf-8');
$newelement = $doc->createElement('description', $temp);
$doc->appendChild($newelement);
echo $doc->saveXML() . PHP_EOL; // shows " instead of element
$node = $doc->getElementsByTagName('description')->item(0);
echo $node->nodeValue . PHP_EOL; // also shows "

输出

<?xml version="1.0" encoding="utf-8"?> 
<description>Hello "XML".</description>
Hello "XML".

这是PHP错误还是我做错了什么? 我希望没有必要在每个字符位置使用 createEntityReference。

类似问题:PHP XML 实体编码问题


编辑:作为显示saveXML的示例,不应像行为正常的&amp;一样转换&quot;实体。 这个$temp字符串实际上应该输出,因为它最初是在saveXML((期间与实体一起输入的。

$temp = 'Hello &quot;XML&quot; &amp;.';
$doc = new DOMDocument('1.0', 'utf-8');
$newelement = $doc->createElement('description', $temp);
$doc->appendChild($newelement);
echo $doc->saveXML() . PHP_EOL; // shows " instead of element like &amp;
$node = $doc->getElementsByTagName('description')->item(0);
echo $node->nodeValue . PHP_EOL; // also shows " &

输出

<?xml version="1.0" encoding="utf-8"?>
<description>Hello "XML" &amp;.</description>
Hello "XML" &.

答案是,根据规范,它实际上不需要任何转义(跳过 CDATA 的提及(:

与号字符 (&( 和左尖括号 (<( 不得以其文字形式出现 (...(如果在其他地方需要它们,则必须使用数字字符引用或分别" &amp; "" &lt; "字符串对其进行转义。右尖括号 (>( 可以使用字符串 " &gt; " (...( 表示

要允许属性值同时包含单引号和双引号,撇号或单引号字符 ('( 可以表示为 " &apos; " ,双引号字符 ("( 表示为 " &quot; "

您可以通过使用 createTextNode() 执行正确的转义来轻松验证这一点:

$dom = new DOMDocument;
$e = $dom->createElement('description');
$content = 'single quote: '', double quote: ", opening tag: <, ampersand: &, closing tag: >';
$t = $dom->createTextNode($content);
$e->appendChild($t);
$dom->appendChild($e);
echo $dom->saveXML();

输出:

<?xml version="1.0"?>
<description>single quote: ', double quote: ", opening tag: &lt;, ampersand: &amp;, closing tag: &gt;</description>