问题:
如何创建包含先前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?
答案 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...}