在PHP中,如何使用旧documentElement的新元素parent替换DOMDocument :: documentElement?

时间:2015-12-18 09:52:52

标签: php xml dom domdocument xmldom

问题:

如何创建包含先前documentElement的超根节点?

示例方案:

鉴于PHP中的以下代码段,encapsulateRootNode函数必须创建一个包含旧的完整dom结构的新根节点:

示例:

<anyContent>...</anyContent>

成为

<newRoot><anyContent>...</anyContent></newRoot>

以下代码无法更改,并且必须尽可能快,因此我放弃了任何序列化,连接和解析。我也想避免克隆完整的DOM结构。

$doc = new \DOMDocument();
if(!@$doc->loadXML($xmlContent))
{
    $myLibrary->encapsulateRootNode($doc, 'newRoot');
}

我的问题是如何创建以下功能:

public function encapsulateRootNode( $doc, $tagName )
{
    ...
}

信息搜索:

通常,replaceChild用于此类操作,但由于没有父级可以调用此函数,因此我发现自己在如何执行此操作时感到迷茫。

我随机尝试了一些可能性但没有成功:

$newXml = $doc->createElement( $tagName);
$newXml->appendChild($doc->documentElement);
// strange behaviours / warning using the resulting DOM

$newXml = $doc->createElement( $tagName);
$old = $doc->documentElement;
$doc->documentElement = $newXml;
$newXml->appendChild($old);
// documentElement is read only

甚至:

$fragment = $doc->createDocumentFragment();
$newXml = $doc->createElement( $tagName);
$fragment->appendChild($newXml);
$newXml->appendChild($doc->documentElement);
// How to convert this fragment back to the normal domDocument?

1 个答案:

答案 0 :(得分:0)

经过一番搜索,我发现了这个解决方案:

即使在root上也可以替换子目录,因为DOMDocument扩展了DomNode。

旧的根节点必须附加到新的根节点AFTER才能替换它,因为如果之前完成,则documentElement将变为null,并且无法再替换它。

 [Object { city="add",  blocked=false,  cityadmin=null,  more...}, Object { city="addme",  blocked=false,  cityadmin=null,  more...}, Object { city="addmeplease",  blocked=false,  cityadmin=null,  more...}, Object { city="fonds",  blocked=false,  cityadmin=null,  more...}, Object { city="fondsm",  blocked=false,  cityadmin=null,  more...}, Object { city="hjty",  blocked=false,  cityadmin=null,  more...}, Object { city="me",  blocked=false,  cityadmin=null,  more...}, Object { city="nb",  blocked=false,  cityadmin=null,  more...}, Object { city="q",  blocked=false,  cityadmin=null,  more...}, Object { city="quick",  blocked=false,  cityadmin=null,  more...}