太气人了,我几乎说不出话来。我已经用 SimpleXML 组装了一个 RSS 提要,但它正在使用 namespace ,现在就是这样。但是,它在输出时不断尝试在根节点中声明 xmlns:xmlns=""。即使我不这样做。

它始于

$rssXML->addAttribute("version", '2.0');
$rssXML->addAttribute("xmlns:media", "http://search.yahoo.com/mrss/", '');
$rssXML->addAttribute("xmlns:dcterms", "http://purl.org/dc/terms/", '');

在这之后我做:-
header("Content-Type: application/rss+xml");

echo $syndicationXML->asXML();

然而它输出:-
<?xml version="1.0"?>
<rss xmlns:xmlns="" version="2.0" xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/"><channel>...

我不明白所有这些命名空间声明。这是怎么回事?

最佳答案

SimpleXML 的问题在于它的 addAttribute 函数添加了一个属性,而不是一个命名空间,虽然它看起来像你想要的那样,但它并不意味着你使用它的方式。

它的目的是添加一个属于特定命名空间(指定为第三个参数)的值,而不是添加命名空间本身。您最终使用 xmlns:xmlns 的原因是因为 SimpleXML 发现您在指定名称 xmlns 时使用了 xmlns:media 命名空间,因此它创建了一个空的 xmlns:xmlns

以下是您问题的 2 个解决方案:

1. 在构造函数的命名空间中指定。

$rssXML = new SimpleXMLElement('<rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:dcterms="http://purl.org/dc/terms/" />');
$rssXML->addAttribute('version', '2.0');

2. 使用 xmlns:xmlns="" 替换 preg_replace
echo preg_replace('/xmlns:xmlns=""\s?/', '', $rssXML->asXML());

关于php - SimpleXML 声明了 xmlns :xmlns ="" - no way to remove,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6627111/

10-13 01:11