Well I have no problems replacing a document root with the 2.2.0 codebase. I use the following code. The code is pure DOM so no extra fancy stuff, don't mind the wrapper classes.
cDocument* poDoc1 = GetDOMImplementation().CreateDocument("", "test", NULL); cDocument* poDoc2 = GetDOMImplementation().CreateDocument("", "test2", NULL); poDoc2->GetDocumentElement()->AppendChild(poDoc2->CreateElement("elem1") ->cast()); poDoc2->GetDocumentElement()->AppendChild(poDoc2->CreateElement("elem2") ->cast()); poDoc2->GetDocumentElement()->AppendChild(poDoc2->CreateElement("elem3") ->cast()); cNode* poClone = poDoc1->ImportNode(poDoc2->GetDocumentElement()->cast(), true); poDoc1->ReplaceChild(poClone, poDoc1->GetDocumentElement()->cast()); // HERE the document root of poDoc1 is test2 with 3 children Best regards / Erik > -----Original Message----- > From: Chris Cheung [mailto:[EMAIL PROTECTED] > Sent: den 11 november 2003 06:54 > To: [EMAIL PROTECTED]; [EMAIL PROTECTED] > Cc: Anthony Chan > Subject: Clone a DOM subtree to the root of a new DOMDocument efficiently > ? > > Dear all, > > Very often I need to clone a DOM subtree to a new DOMDocument and make > the root of the subtree be the document element of the new DOMDocument. > However, it seems that in Xerces-C++/Perl, the document element is > created when creating the DOMDocument (via > DomImplementation::createDocument) and cannot be replaced afterward. > Hence I cannot use the DOMDocument::importNode to directly deep clone the > root node of the source subtree, but rather I have to copy its > attributes and child nodes one by one (in Perl code): > > sub element2Doc > { > my ($element) = @_; > > # Create a new DOM Document > my $domImpl = > XML::Xerces::DOMImplementationRegistry::getDOMImplementation('LS') > > my $newDoc = $domImpl->createDocument($element->getNamespaceURI, > $element->getTagName, undef); > > # Need to copy every attribute and every child node, > # (Since these is no API to set document element of a DOMDocument.) > my $newRoot = $newDoc->getDocumentElement(); > my $attrs = $element->getAttributes(); > > for (my $i = 0; $i < $attrs->getLength; $i++) > { > my $attr = $attrs->item($i); > my $nsURI = $attr->getNamespaceURI; > if ($nsURI) > { > # The attribute is qualified > $newRoot->setAttributeNS($nsURI, $attr->getName, > $attr->getValue); > } > else > { > $newRoot->setAttribute($attr->getName, $attr->getValue); > } > } > > my @childNodes = $element->getChildNodes(); > foreach (@childNodes) > { > my $copiedChild = $newDoc->importNode($_, 1); > $newRoot->appendChild($copiedChild); > } > return $newDoc; > } > > > Using the Xerces-Perl wrapper over the efficient Xerces-C++ library, > the code runs slowly since a lot of Perl statements are executed each > calls short C++ methods, especially for broad but not deep source DOM > subtree. > > Is there any smarter way to do the same thing? > Thank you in advance for any help. > > -- > Best Regards, > > Chris Cheung > Center for Large-Scale Computation > > Have a nice day! > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]