我创建一个Atom feed,当我试图下方添加xmlns:i
作为一个属性-
$node->addAttribute("xmlns:i","http://www.w3.org/2001/XMLSchema-instance");
我得到这个作为一个输出 -
i="http://www.w3.org/2001/XMLSchema-instance"
"xmlns:"
部分被切断。 我需要逃避:
字符数限制? 或者是他们其他的方式来增加这个命名空间?
我创建一个Atom feed,当我试图下方添加xmlns:i
作为一个属性-
$node->addAttribute("xmlns:i","http://www.w3.org/2001/XMLSchema-instance");
我得到这个作为一个输出 -
i="http://www.w3.org/2001/XMLSchema-instance"
"xmlns:"
部分被切断。 我需要逃避:
字符数限制? 或者是他们其他的方式来增加这个命名空间?
如果你想从命名空间/前缀添加属性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']);
如果你不希望有一个虚拟的属性添加到您的根元素,你可以手动上增加一个声明命名空间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命名空间前缀? 。
我发现这个寻找同样的事情,没有一个答案确实为我工作。 所以,我尝试了不同的路线。 如果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>