如何从XML字符串创建节点并追加至IXMLDOMNode节点
解决MSXML2中无法将XML字符串生成的节点追加至ELEMENT节点的问题
问题出在你的NodeFromXML函数返回的是DOCUMENT类型节点(整个XML文档对象),而appendChild方法仅支持向ELEMENT节点追加ELEMENT、TEXT、COMMENT等类型的节点,不能直接追加DOCUMENT节点。以下是两种针对性的解决方法:
方法1:返回XML字符串的根元素(适用于单根节点的XML)
直接修改NodeFromXML函数,返回临时文档的根元素而非文档本身:
Private Function NodeFromXML(XMLstring As String) As IXMLDOMNode Dim Obj As New MSXML2.DOMDocument60 On Error GoTo handler With Obj .async = False .loadXML XMLstring ' 替换原selectSingleNode("/"),直接获取文档的根元素节点 Set NodeFromXML = .documentElement End With handler: End Function
修改后,函数返回的是ELEMENT类型节点,直接调用xRoot.appendChild xNode即可正常执行。
方法2:导入并追加所有子节点(适用于多节点XML片段)
如果你的XML字符串是没有根节点的多节点片段(例如<item>1</item><item>2</item>),documentElement无法覆盖所有节点,此时需要先将临时文档的所有子节点导入到目标文档的上下文,再逐个追加:
Set xRoot = xDoc2.selectSingleNode("/ns:Root") ' 目标父节点 Dim tempDoc As New MSXML2.DOMDocument60 Dim importedNode As IXMLDOMNode Dim childNode As IXMLDOMNode tempDoc.async = False tempDoc.loadXML XMLstring ' 遍历临时文档的所有子节点,导入后追加到目标节点 For Each childNode In tempDoc.childNodes ' 第二个参数True表示深度导入,包含所有子节点 Set importedNode = xDoc2.importNode(childNode, True) xRoot.appendChild importedNode Next
关键说明
跨DOM文档操作节点时必须使用importNode,因为不同DOM实例的节点属于独立的上下文,直接追加会触发错误。importNode会将节点复制到目标文档的上下文环境中,确保兼容性。
内容的提问来源于stack exchange,提问作者vbaToad
相关产品推荐
相关产品推荐

