0

我正在尝试使用 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'作为第三个参数,我不会得到任何错误,但呈现的属性省略了命名空间?

4

2 回答 2

1
于 2013-06-11T13:54:22.740 回答
0

尽管 XML 可能没有“正确”形成 - 我在从外部 API 解析 XML 时遇到了类似的问题,并且必须使我的解析器符合格式不正确的 XML。

我能够添加适当的命名空间(在我的情况下,这是另一个“重新定义”xmlns 的实例——并且收到了关于无法“重新定义”xmlns 的 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/");
....

再次注意第一个参数中的“xmlns:xmlns:dc”。我无法谈论 XML 的有效性,但它允许我以快速且实用的方式绕过警告。

于 2014-09-18T23:34:57.467 回答