无法命名空间添加到一个属性与PHP的SimpleXML(Unable to add namespac

2019-08-21 07:54发布

我创建一个Atom feed,当我试图下方添加xmlns:i作为一个属性-

$node->addAttribute("xmlns:i","http://www.w3.org/2001/XMLSchema-instance"); 

我得到这个作为一个输出 -

i="http://www.w3.org/2001/XMLSchema-instance"

"xmlns:"部分被切断。 我需要逃避:字符数限制? 或者是他们其他的方式来增加这个命名空间?

Answer 1:

如果你想从命名空间/前缀添加属性i到$节点不打扰事先声明的命名空间。 只要使用的addAttribute()的第三个参数为您所使用的第一个参数的前缀命名空间URI。

$node = new SimpleXMLElement('<root></root>');
$node->addAttribute("i:somename", "somevalue", 'http://www.w3.org/2001/XMLSchema-instance'); 
echo $node->asXml();

版画

<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:somename="somevalue"/>

如果不需要该属性本身,然后你可以将其删除unset()留下命名空间声明。

unset($node->attributes('i', TRUE)['somename']);


Answer 2:

如果你不希望有一个虚拟的属性添加到您的根元素,你可以手动上增加一个声明命名空间xmlns为您的属性i的前缀:

<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

为了做到这一点,并在现有的应答暗示( 无法添加使用PHP的SimpleXML与命名空间前缀属性 ),你必须前缀的新属性xmlns:因为xmlns:命名空间prefic是不是你的文档中声明) 。 而且,由于xmlns:是该属性的名称的一部分,你需要therfore两个事件xmlns:

$uri = 'http://www.w3.org/2001/XMLSchema-instance';

$root = new SimpleXMLElement('<root/>');
$root->addAttribute( 'xmlns:xmlns:i', $uri );
                      ######

$child = $root->addChild('foo');
$child->addAttribute( 'xmlns:i:bar', 'baz');
                       ######

echo $root->asXml();

给出(手动格式化的可读性):

<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <foo i:bar="baz"/>
</root>

所以这个xmlns:前缀似乎欺骗了。 请注意,如果您设置该属性重新装载元素,可以增加孩子时要使用的命名空间URI为好,这不指定前缀:

$root = new SimpleXMLElement( $root->asXML() );

$child = $root->addChild('foo');
$child->addAttribute( 'i:bar', 'bazy', $uri );
                                       ####

echo $root->asXml();

给出(再次,手动格式化的):

<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
    <foo i:bar="baz"/>
    <foo i:bar="bazy"/>
</root>

该第二示例似乎是更接近目标(或至少期望的)一起使用。

需要注意的是正确地做到这一点的唯一方法是使用了更完整的(可惜也更复杂,更详细) 的DOMDocument类。 这在概述如何申报与DOM / PHP的XML命名空间前缀?



Answer 3:

我发现这个寻找同样的事情,没有一个答案确实为我工作。 所以,我尝试了不同的路线。 如果SimpleXML的不正确管理的命名空间,使用DOM来代替。

所以,这样的事情应该工作:

$s = new simplexmlelement('<root/>');
$d = dom_import_simplexml($s);
$d->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:i", "http://www.w3.org/2001/XMLSchema-instance");
$s->addChild("bar", "bazy", "http://www.w3.org/2001/XMLSchema-instance");
$f = $s->addChild("foo", "quux");
$f->addAttribute("i:corge", "grault", "http://www.w3.org/2001/XMLSchema-instance");

这将导致这样的:

<?xml version="1.0"?>
<root xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <i:bar>bazy</i:bar>
   <foo i:corge="grault">quux</foo>
</root>


文章来源: Unable to add namespace to an attribute with PHP's SimpleXML