2013-09-26 23 views
0

我正在尝试使用createAttribute将新名称空间分配给现有文档中间的元素。 (信不信由你,但这种做法是很有道理的我的数据集。)如何为一个元素分配一个新的名称空间?

$doc = new DOMDocument(); 
$doc->loadXML('<doc xmlns="urn:x-one"><element><child1ofmany/></element></doc>'); 
$xmlns = $doc->createAttribute('xmlns'); 
$xmlns->value = 'urn:x-two'; 
$doc->getElementsByTagName('doc')->item(0)->getElementsByTagName('element').appendChild($xmlns); 
echo $doc->saveXML(); 

/* 
    <?xml version="1.0" encoding="UTF-8"?> 
    <doc xmlns="urn:x-one"> 
     <element xmlns="urn:x-two"> 
      <child1ofmany/> 
     </element> 
    </doc> 
*/ 

然而,这只能肤浅。在文档上使用XSLTProcessor或XPath将显示element仍属于urn:x-one命名空间。

我发现的唯一工作是将字符串化$doc并再次读取字符串为XML。就像这样:

$doc->loadXML($doc->saveXML()); 

当然必须有一个更好的方式来实现这一目标?

PS:element有吨孩子因此重建它和它的孩子(谁应该继承element的新的命名空间,靠了靠)将是一个缓慢而痛苦的过程也。

回答

0

创建元素时,请致电createElementNS

+0

XML来自外部来源。他们只是缺少一个外部源不关心的命名空间变化,但我实际上必须处理。 – Aeyoun

相关问题