使用SimpleXmlElement创建RSS提要的xmlns命名空间重定义错误?

时间:2013-06-11 13:21:49

标签: php xml xml-namespaces

我正在尝试使用PHP来创建将用于RSS提要的XML文档。我在大多数情况下都使用它,但是在尝试向文档中添加带有命名空间的属性时,我得到了error on line 2 at column 29: redefinition of the xmlns prefix is forbidden

我在这里尝试了接受的答案: Add rss xmlns namespace definition to a php simplexml document?但会将第一行更改为<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'作为第三个参数,我没有错误,但渲染的属性省略了命名空间?

2 个答案:

答案 0 :(得分:1)

错误消息:

  

禁止重新定义xmlns前缀

是因为xmlns是用XML定义的(所有以字母XML开头的名称都是保留的),因此不能使用“xmlns”作为前缀。但是在您的代码中,您将其用作前缀:

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

无法添加此类属性。删除该行代码,错误就消失了。在创建新对象时,将名称空间声明添加到字符串中,如the accepted answer to "Add rss xmlns namespace definition to a php simplexml document?"

中所示

使这个chrystal清楚:您不能使用SimpleXMLElement::addAttribute()来创建XML名称空间声明。


编辑: SimpleXML最初并非设计用于处理XML命名空间,并非所有功能都可以轻松访问(或直接)。可能最干净的方法是使用姊妹库 DOMDocument (“DOM”)。

有关如何在 SimpleXML 中添加命名空间声明的更详细的评论,请参阅Stackoverflow站点上的以下现有Q&amp; A材料:

答案 1 :(得分:0)

虽然XML可能不适合&#39;形成 - 我从外部API解析XML时遇到了类似的问题,并且必须使我的解析器符合格式不良的XML。

我能够添加适当的命名空间(在我的例子中是另一个重新定义&x 39ns的实例 - 并且正在获得有关无法重新定义&x 39ns xmns的PHP警告)。我使用前面的三个参数语法接收上述警告。

如果在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/");
....

再次注意&#39; xmlns:xmlns:dc&#39;在第一个论点中。我不能说XML的有效性,但它允许我以快速和功能的方式绕过警告。