我正在尝试使用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'
作为第三个参数,我没有错误,但渲染的属性省略了命名空间?
答案 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的有效性,但它允许我以快速和功能的方式绕过警告。