【发布时间】:2019-11-13 17:37:49
【问题描述】:
我有这个代码:
$feed = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" />', LIBXML_NOERROR | LIBXML_ERR_NONE | LIBXML_ERR_FATAL);
$channel = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><channel></channel>', LIBXML_NOERROR | LIBXML_ERR_NONE | LIBXML_ERR_FATAL);
$counter = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8" ?><yandex:analytics>test</yandex:analytics>', LIBXML_NOERROR | LIBXML_ERR_NONE | LIBXML_ERR_FATAL);
$toDom = dom_import_simplexml($channel);
$fromDom = dom_import_simplexml($counter);
$toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
$toDom = dom_import_simplexml($feed);
$fromDom = dom_import_simplexml($channel);
$toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->appendChild($dom->importNode(dom_import_simplexml($feed), true));
$dom->formatOutput = true;
var_dump($feed->saveXML());
现在,在一台服务器上的输出是:
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" version="2.0"><channel><yandex:analytics>test</yandex:analytics></channel></rss>
第二个输出是:
<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:yandex="http://news.yandex.ru" xmlns:media="http://search.yahoo.com/mrss/" xmlns:turbo="http://turbo.yandex.ru" version="2.0"><channel><analytics>test</analytics></channel></rss>
两台服务器都具有相同的 PHP 版本:7.1.30 我在两个 phpinfo() 中注意到的唯一与 xml 相关的区别是第一个具有 libxml2 2.9.9 和另一个 2.7.6。
较旧的是一个旧的CentOS 6 系统,很遗憾目前无法升级,我什至不确定这是否是libxml2 的错。
现在的问题是我有一个依赖于新行为的库。
确定与libxml2有关吗?
是否可以在不丢弃库的情况下根据第一种行为以某种方式解决它?
【问题讨论】:
-
很难测试 - 但你最后的 XML 格式不正确,它使用了一个未声明的命名空间,试试
<yandex:analytics xmlns:yandex="http://news.yandex.ru"> -
tech.yandex.com/turbo/doc/rss/example-docpage 实际上是 yandex 的规范。 ://
-
最主要的(对我来说)是它自己 -
$counterXML 无效。 -
那么在这种情况下是否可以禁用验证?这样就可以解决问题了。
-
只是为了检查 - 添加我在第一条评论中发布的命名空间声明,如果这解决了问题,至少它显示了正在发生的事情。