xmlns名称空间重定义错误,使用SimpleXmlElement创建RSS提要


xmlns namespace redefinition error using SimpleXmlElement to create RSS feed?

我正在尝试使用PHP创建将用于RSS提要的XML文档。我已经得到了它的大部分工作,但我得到一个error on line 2 at column 29: redefinition of the xmlns prefix is forbidden,而试图添加一个名称空间的属性到我的文档。

我已经尝试了公认的答案:添加rss xmlns命名空间定义到php simplexml文档?但这将第一行更改为<rss...而不是<xml...

下面是我正在使用的代码:

<?php
$xml = new SimpleXMLElement('<xml vesion="1.0" />');
$rss = $xml->addChild('rss');
$rss->addAttribute('version','2.0');
$rss->addAttribute("xml:base",'http://intranet/bapm/rss-avd','xml');
$rss->addAttribute('xmlns:dc',"http://purl.org/dc/elements/1.1/",'xmlns');
....

添加xml:base属性的行工作正常,但是当我添加添加xmlns:dc属性的行时,我得到错误。如果我不添加'xmlns'作为第三个参数,我没有得到任何错误,但是呈现的属性省略了名称空间?

错误信息:

禁止重新定义XMLNS前缀

是因为xmlns是在XML中定义的(所有以XML开头的名称都是保留的,不论大小写),所以不能使用"xmlns"作为前缀。但是在你的代码中你使用它作为前缀:

$rss->addAttribute('xmlns:dc', "http://purl.org/dc/elements/1.1/", 'xmlns');
                    #####                                           #####

不可能添加这样的属性。删除这行代码,错误就会消失。在创建新对象时将名称空间声明添加到字符串中,如"将rss xmlns名称空间定义添加到php simplexml文档中?"所示。

说明一下:您不能使用SimpleXMLElement::addAttribute()来声明XML命名空间。


Edit: SimpleXML最初不是为处理XML名称空间而设计的,并且并非所有功能都易于访问(或直接)。可能最干净的方法是使用姊妹库DOMDocument ("DOM")。

关于如何在SimpleXML中添加命名空间声明的更详细的回顾,请参阅Stackoverflow网站上的以下现有的Q& a材料:

  • 无法使用php的SimpleXML添加命名空间
  • 如何声明一个XML命名空间前缀与DOM/PHP?(2010年8月)
  • 无法使用PHP Simplexml添加属性与命名空间前缀(2011年10月)

虽然XML可能没有"正确"地形成,但我在从外部API解析XML时遇到了类似的问题,并且不得不使我的解析器符合格式不良的XML。

我能够添加适当的名称空间(这在我的情况下是另一个实例的'重新定义' xmlns -并得到PHP警告无法'重新定义' xmlns)。我收到了上面的警告,使用三个参数语法,就像你以前一样。

如果在xmlns命名空间前面加上另一个xmlns,则xmlns属性被添加而不会抛出异常。

所以你想做下面的事情:

<?php
$xml = new SimpleXMLElement('<xml vesion="1.0" />');
$rss = $xml->addChild('rss');
$rss->addAttribute('version','2.0');
$rss->addAttribute("xml:base",'http://intranet/bapm/rss-avd','xml');
$rss->addAttribute('xmlns:xmlns:dc',"http://purl.org/dc/elements/1.1/");
....

再次注意第一个参数中的'xmlns:xmlns:dc'。我不能说XML的有效性,但它允许我以一种快速而有效的方式绕过警告。

相关文章:
  • 没有找到相关文章