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

时间:2015-02-08 21:37:25

标签: php xml dom

我正在修改由其他库生成的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错误还是我做错了什么?我希望没有必要在每个char位置使用createEntityReference。

类似的问题: PHP XML Entity Encoding issue


编辑:作为一个示例,显示saveXML不应该转换&quot;实体,就像行为正常的&amp;一样。这个$ 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" &.

1 个答案:

答案 0 :(得分:1)

答案是根据spec实际上并不需要任何转义(跳过CDATA的提及):

  

&符号(&amp;)和左尖括号(&lt;)不得以字面形式显示(...)如果在其他地方需要它们,则必须< / strong>分别使用数字字符引用或字符串" &amp; "" &lt; "进行转义。右角括号(&gt;)可以使用字符串" &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>