Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用SimpleXmlElement创建RSS源时发生xmlns命名空间重新定义错误?_Php_Xml_Xml Namespaces - Fatal编程技术网

Php 使用SimpleXmlElement创建RSS源时发生xmlns命名空间重新定义错误?

Php 使用SimpleXmlElement创建RSS源时发生xmlns命名空间重新定义错误?,php,xml,xml-namespaces,Php,Xml,Xml Namespaces,我试图使用PHP创建一个XML文档,用于RSS提要。我已经让它大部分工作正常,但是第29列的第2行出现了一个错误:在尝试向文档添加带有名称空间的属性时,禁止重新定义xmlns前缀 我在这里尝试了公认的答案: 但这将第一行更改为addAttribute('version','2.0'); $rss->addAttribute(“xml:base”http://intranet/bapm/rss-avd','xml'); $rss->addAttribute('xmlns:dc',”http://p

我试图使用PHP创建一个XML文档,用于RSS提要。我已经让它大部分工作正常,但是第29列的第2行出现了一个
错误:在尝试向文档添加带有名称空间的属性时,禁止重新定义xmlns前缀

我在这里尝试了公认的答案: 但这将第一行更改为
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');
                    #####                                           #####
添加这样的属性是不可能的。删除那行代码,错误就会消失。创建新对象时,将名称空间声明添加到字符串中,如中所示

为了使这个chrystal更清楚:您不能使用来进行XML名称空间声明


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

有关如何在SimpleXML中添加名称空间声明的详细信息,请参阅Stackoverflow网站上的以下现有问答材料:


尽管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/");
....
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的有效性,但它允许我以一种快速有效的方式绕过警告。

请仔细检查,您提供的XML无效:-以三个字母开头的元素
XML
保留在XML中。不要使用它们。(而且你可能不想在这里创建这样一个根元素)-所以在发布问题之前,请先解决一些问题。元素名称的相同规则也适用于属性名称,顺便说一句,
$rss->addAttribute('xmlns:dc',…
永远无法工作,因为这是一个无效的属性。与根元素一样,您很可能希望在此处执行一些不同的操作,例如添加一个名称空间声明,在您看来可能像一个属性,但它不是一个属性(是的,请记住,它不是一个属性,它看起来像一个属性,但它不是一个属性)。此外,你在问题中所写的内容是错误的:你没有在那里尝试公认的答案,这与你在这里所做的不同,纠正这一差异,你应该会没事。我在那里尝试了公认的答案,并且在我发布之前进行了故障排除,但感谢你的提醒,这非常有帮助。是的,但请尝试了解原因ngs不起作用。错误消息只是一个提示,这是您需要理解的,因为链接的答案确实解决了问题。我还为您留下了一个答案(并利用更多资源对其进行了编辑),希望能为您提供足够的帮助来处理您的问题。
<?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/");
....