我正在尝试使用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的有效性,但它允许我以一种快速而有效的方式绕过警告。