void CopyXMLNode(csRef<iDocumentNode> source, csRef<iDocumentNode> target, int mode) { if (mode == 0) { target->RemoveNodes(); target->RemoveAttributes(); } // copy nodes csRef<iDocumentNodeIterator> nodeIter = source->GetNodes(); while (nodeIter->HasNext()) { csRef<iDocumentNode> child = nodeIter->Next(); csRef<iDocumentNode> targetChild = target->GetNode(child->GetValue()); if (targetChild==NULL || mode==3) // Mode 3 means don't merge tags but just insert multiples, so we create a new one here every time { targetChild = target->CreateNodeBefore(child->GetType()); if (targetChild == NULL) assert(!"failed to create XML node, you are probably using wrong XML parser (xmlread instead of xmltiny)"); targetChild->SetValue(child->GetValue()); } CopyXMLNode(child, targetChild, mode); } // copy attributes csRef <iDocumentAttributeIterator> attrIter = source->GetAttributes(); while (attrIter->HasNext()) { csRef<iDocumentAttribute> attr = attrIter->Next(); const char* attrName = attr->GetName(); if (mode==1 || !target->GetAttribute(attrName)) target->SetAttribute(attrName, attr->GetValue()); } }
csString GetNodeXML(csRef<iDocumentNode> node, bool childrenOnly) { psString xml; csRef<iDocumentNodeIterator> nodes; csRef<iDocumentAttributeIterator> attrs; if (!childrenOnly) xml.Format("<%s", node->GetValue()); attrs = node->GetAttributes(); while (attrs->HasNext()) { csRef<iDocumentAttribute> attr = attrs->Next(); csString escpxml = EscpXML(attr->GetValue()); xml.AppendFmt(" %s=\"%s\"", attr->GetName(), escpxml.GetData() ); } if (!childrenOnly) xml += ">"; nodes = node->GetNodes(); if (nodes->HasNext()) { while (nodes->HasNext()) { csRef<iDocumentNode> child = nodes->Next(); if (child->GetType() == CS_NODE_TEXT) { // add the node-content to the string..but escape special XML chars in it xml += EscpXML(child->GetContentsValue()); } else { xml += GetNodeXML(child); } } } if (!childrenOnly) { // add the node-content to the string..but escape special XML chars in it xml += EscpXML(node->GetContentsValue()); xml.AppendFmt("</%s>", node->GetValue()); } return xml; }