Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP文档转换&;至&;amp-如何保持行值_Php_Xml_Special Characters_Domdocument - Fatal编程技术网

PHP文档转换&;至&;amp-如何保持行值

PHP文档转换&;至&;amp-如何保持行值,php,xml,special-characters,domdocument,Php,Xml,Special Characters,Domdocument,我正在使用PHP DOMDocument,同时我正在使用createTextNode $copyrightNode = $doc->createTextNode('©'); $copyrightContainer = $dom_output->createElement('copyright-statement'); $copyrightContainer->appendChild($copyrightNode); 在稍后生成的XML中,我得到: &

我正在使用PHP DOMDocument,同时我正在使用createTextNode

$copyrightNode = $doc->createTextNode('©');
$copyrightContainer = $dom_output->createElement('copyright-statement');

$copyrightContainer->appendChild($copyrightNode);
在稍后生成的XML中,我得到:

<copyright-statement>&amp;#x000A9;</copyright-statement> 
&#x000A9;
我的目标是

<copyright-statement>&#x000A9;</copyright-statement> 
©;
你知道怎么做吗


提前感谢。

这里正确的做法是使用createEntityReference方法(例如,
createEntityReference(“复制”);
),然后将此实体追加

例如:

<?php 
$copyrightNode = $doc->createEntityReference("copy"); 
$copyrightContainer = $dom_output->createElement('copyright-statement');
$copyrightContainer->appendChild($copyrightNode);

当PHP输出XML文档时,任何无法在指定输出编码中表示的字符都将替换为数字实体(十进制或十六进制,两者都是等效的):

编码='ASCII';
打印$dom->saveXML();//©

检查您没有调用
htmlspecialchars()
htmlspecialchars()
任何地方(例如在库中或任何地方)?@CD001,我正在调用htmlenties(),但在另一个节点上,不是在这个节点上。是的-只是测试它。。。DOMDocument似乎会自动将所有“&”字符转换为“&;”。使用
createEntityReference()
方法将起作用,但仅对某些字符授予版权,正如dave在下面指出的那样,版权符号是其中之一(如
©;
)。。。但我不认为这是一个令人满意的方式来添加任何字符。当然,您的XML文档无论如何都应该是UTF-8,这样您就可以写出
,而不是费劲地编码它。另一个选项是创建一个CDATA节
$doc->createCDATA节('©')
,它将输出
©在浏览器中查看时显示在屏幕上。。。但是将在代码中包含CDATA块
-取决于您使用的是什么。。。有趣的问题,不确定是否有可能以您想要的方式解决。。。Hmmmmm@CD001,谢谢你的评论。我知道CDATA,但我认为这对我来说不是一个好的解决方案。我读了一些东西,很明显,XML需要用&来转义&character,但我没有找到插入它的解决方案。谢谢dave,但这将创建
©我需要有
和#x000A9,这是强制性的。经过编辑,我相信这会起作用,CDATA部分不应更改符号。谢谢dave,我知道CDATA,但我的目标是真正插入&,而不是使用CDATA。有趣的回答是Alf,但您知道为了获得
©用于©标志?
和#x000A9
和#169相同-一个是十六进制,一个是十进制。使用哪一个没有区别。嗯,好吧,但是如果我真的需要
©?如何转换
©
和#x000A9
$xml=str#u replace(“©;”,“©;”,$xml)-根据a,libxml2只输出十进制实体。为什么你真的需要十六进制?这可以,但是只对复制字符有效,但是如果我有一些像这样的字符,我需要十六进制值呢?我需要它,因为我必须为要求十六进制值的组织创建XML,不知道为什么,但这是一项要求。
$copyrightNode = $doc->createCDATASection("&#x000A9;"); 
$copyrightContainer = $dom_output->createElement('copyright-statement');
$copyrightContainer->appendChild($copyrightNode);
<?php

$dom = new DOMDocument;

$node = $dom->createElement('copyright-statement', '©');
$dom->appendChild($node);

$dom->encoding = 'UTF-8';
print $dom->saveXML(); // <copyright-statement>©</copyright-statement>

$dom->encoding = 'ASCII';
print $dom->saveXML(); // <copyright-statement>&#169;</copyright-statement>