我正在修改由其他库生成的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不应该转换"
实体,就像行为正常的&
一样。这个$ temp字符串应该输出,因为它最初是在saveXML()期间与实体一起输入的。
$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 like &
$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" &.
答案 0 :(得分:1)
答案是根据spec实际上并不需要任何转义(跳过CDATA的提及):
&符号(&amp;)和左尖括号(&lt;)不得以字面形式显示(...)如果在其他地方需要它们,则必须< / strong>分别使用数字字符引用或字符串
表示" & "
和" < "
进行转义。右角括号(&gt;)可以使用字符串" > "
(...)要允许属性值包含单引号和双引号,撇号或单引号字符(')可以表示为
" ' "
,双引号字符(“)表示为" " "
您可以使用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: <, ampersand: &, closing tag: ></description>