PHP-DOM类编号实体和编码问题
我在使用PHP DOM类时遇到了一些困难 我正在制作一个站点地图脚本,我需要$doc->saveXML()的输出PHP-DOM类编号实体和编码问题,php,dom,encoding,utf-8,entities,Php,Dom,Encoding,Utf 8,Entities,我在使用PHP DOM类时遇到了一些困难 我正在制作一个站点地图脚本,我需要$doc->saveXML()的输出 <?xml version="1.0" encoding="UTF-8"?> <root> <url> <loc>http://www.somesite.com/serviços/redesign</loc> </url> </root> http
<?xml version="1.0" encoding="UTF-8"?>
<root>
<url>
<loc>http://www.somesite.com/serviços/redesign</loc>
</url>
</root>
http://www.somesite.com/serviç操作系统/重新设计
或
http://www.somesite.com/serviç操作系统/重新设计
但我得到了:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<url>
<loc>http://www.somesite.com/servi&#xE7;os/redesign</loc>
</url>
</root>
http://www.somesite.com/serviç;操作系统/重新设计
这是我可以得到的壁橱,使用名为to numbered entities的replace函数
我也能复制
<?xml version="1.0" ?>
<root>
<url>
<loc>http://www.somesite.com/servi&#xE7;os/redesign</loc>
</url>
</root>
http://www.somesite.com/serviç;操作系统/重新设计
但是没有指定编码
最好的解决方案(我认为编写代码的方式)是:
<?php
$myArray = array();
// do some stuff to populate the with URL strings
$doc = new DOMDocument('1.0', 'UTF-8');
// here we modify some property. Maybe is the answer I am looking for...
$urlset = doc->createElement("urlset");
$urlset = $doc->appendChild($urlset);
foreach($myArray as $address) {
$url = $doc->createElement("url");
$url = $urlset->appendChild($url);
$loc = $doc->createElement("loc");
$loc = $url->appendChild($loc);
$valueContent = $doc->createTextNode($value);
$valueContent = $loc->appendChild($address);
}
echo $doc->saveXML();
?>
注:
- 服务器响应头包含UTF-8字符集李>
- PHP脚本保存在UTF-8中李>
- 读取的URL是UTF-8字符串李>
- 上面的脚本包含DOMDocument构造函数上的编码声明,并且不使用任何转换函数,如htmlentities、urlencode、utf8_encode
提前感谢。在将实体传递给createTextNode之前对其进行解码
$valueContent = $doc->createTextNode(html_entity_decode($value, ENT_QUOTES, 'UTF-8'));
那是因为ç;不是UTF-8文档中的有效实体。因此DomDocument将&视为,并将其编码为&
resolveExternals
和substituteEntity
是解析器的特性。它们对序列化没有影响
XML信息集对以下内容没有任何区别:
<loc>http://www.somesite.com/serviços/redesign</loc>
<loc>http://www.somesite.com/serviços/redesign</loc>
<loc>http://www.somesite.com/serviços/redesign</loc>
结果:
<?xml version="1.0" encoding="US-ASCII"?>
<loc>serviços</loc>
例如,
rawurlencode('serviços')
感谢您的评论和回复。在深入阅读站点地图协议规范以及RFC之后,我找到了一个解决方案。我正在使用urlencode函数处理URL条目。我意识到的一件事是PHP的内置urlencode函数主要基于RFC1738。当前URL RFC为3986。这是我将URL正确转换为百分比实体的函数。函数myUrlEncode($string){$entities=array('%21','%2A','%27','%28','%29','%3B','%3A','%40','%26','%3D','%2B','%24','%2C','%2F','%3F','%25','%23','%5B','%5D');$replacements=array('!',''''*','''',''''',''''','''','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',“%”,“#”,“[”,“]”;返回str_replace($entities,$replacements,urlencode($string));}感谢您的输入和说明。这并不完全是我所寻求的解决方案,但它帮助我走上了正确的道路。
$s= "serviços"; // or "\xC3\xA7" if you can't input UTF-8 strings directly
$doc = new DOMDocument('1.0', 'US-ASCII');
$doc->appendChild($loc= $doc->createElement('loc'));
$loc->appendChild($doc->createTextNode($s));
echo $doc->saveXML();
<?xml version="1.0" encoding="US-ASCII"?>
<loc>serviços</loc>
http://www.somesite.com/servi%C3%A7os/redesign