SimpleXML声明了xmlns:xmlns ="" - 无法删除

wax*_*cal 4 php xml rss simplexml xml-namespaces

如此真气,我几乎无法说话.我已经使用SimpleXML组装了一个RSS提要 - 但它正在使用名称空间,现在就是这样.但是,当输出时,它会不断尝试在根节点中声明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/", '');
Run Code Online (Sandbox Code Playgroud)

在此之后我做: -

header("Content-Type: application/rss+xml");

echo $syndicationXML->asXML();
Run Code Online (Sandbox Code Playgroud)

然而它输出: -

<?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>...
Run Code Online (Sandbox Code Playgroud)

我不明白所有这个名称空间声明.这是怎么回事?

Fra*_*nes 7

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

它意味着添加一个特定命名空间(指定为第三个参数)的值,而不是添加命名空间本身.你最终得到的原因xmlns:xmlns是因为SimpleXML发现你xmlnsxmlns:media为实例指定名称时使用了命名空间,所以它创建了一个空xmlns:xmlns.

以下是您的问题的两种解决方案:

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

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

2.替换xmlns:xmlns=""使用preg_replace

echo preg_replace('/xmlns:xmlns=""\s?/', '', $rssXML->asXML());
Run Code Online (Sandbox Code Playgroud)