【问题标题】:xmlns namespace redefinition error using SimpleXmlElement to create RSS feed?xmlns 命名空间重定义错误使用 SimpleXmlElement 创建 RSS 提要?
【发布时间】:2023-04-03 02:47:01
【问题描述】:

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

【问题讨论】:

  • 请仔细检查,您提供的 XML 无效eval.in/33360 - 以三个字母 XML 开头的元素在 XML 中保留。不要使用它们。 (并且您可能不想在这里创建这样的根元素) - 所以请在发布问题之前先进行一些故障排除。
  • 元素名称的相同规则适用于属性名称顺便说一句,$rss-&gt;addAttribute('xmlns:dc', ... 永远无法工作因为那是一个无效的属性。与根元素一样,您很可能想在这里做一些不同的事情,例如添加一个 Namespace Declaration 可能在您的眼中看起来像一个属性 - 但它不是一个(是的请记住,它不是一个属性,它看起来像一个,但它不是一个属性)。
  • 此外,您在问题中写的内容是错误的:您没有尝试那里接受的答案,它与您在这里所做的不同,修复该差异,您应该没问题。
  • 我确实在那里尝试了接受的答案,并且在我在这里发布之前我确实解决了问题,但是感谢你的蛇,它帮助很大。
  • 是的,但请尝试理解为什么事情不起作用。错误消息只是一个提示,您需要了解,因为链接的答案确实解决了问题。我还给您留下了答案(并立即使用更多资源对其进行了编辑),希望能为您提供足够的帮助来处理您的问题。

标签: php xml xml-namespaces


【解决方案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?"所示。

为了明确这一点:您不能使用SimpleXMLElement::addAttribute() 来进行 XML 命名空间声明。


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

有关如何在 SimpleXML 中添加 命名空间声明 的更详细评论,请在 Stackoverflow 网站上查看以下现有问答材料:

【讨论】:

    【解决方案2】:

    虽然 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 的有效性,但它可以让我以快速且实用的方式绕过警告。

    【讨论】:

      猜你喜欢
      • 2017-01-07
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多