![](/img/trans.png)
[英]How to load DocBook XML files with PHP's DomDocument having named entities defined in other file?
[英]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不应转换"
与&
行为正常。 该$ 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" &.
答案是,根据规范它实际上不需要任何转义(跳过对CDATA的提及):
与符号(&)和左尖括号(<) 不能以原义形式出现(...)如果在其他地方需要,则必须使用数字字符引用或字符串
" & "
和" < "
。 可以使用字符串" > "
(...)表示直角括号(>)。为了允许属性值包含单引号和双引号,可以将单引号或单引号字符(')表示为
" ' "
,将双引号字符(“)表示为" " "
" " "
。
您可以使用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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.