我正在使用Excel VBA,并尝试实现以下目标:
1)发送HTTP请求并获取返回的XML 2)从返回的XML中选择一些元素,并使用appendChild方法将它们添加到另一个XML DOM中。
我收到运行时错误“混合来自不同版本的msxml的对象是一个错误”。我找到了一种解决方法,但不确定为什么会发生错误,并想知道是否有更好的方法来解决它。
抛出错误的代码:
Dim sURL as String
Dim Http As Object
Set Http = CreateObject("MSXML2.SERVERXMLHTTP")
Dim xgetCSS As New MSXML2.DOMDocument60
Dim xDoc As New MSXML2.DOMDocument60
Dim xMember As MSXML2.IXMLDOMElement
Dim nodes As MSXML2.IXMLDOMNodeList
Dim node As MSXML2.IXMLDOMElement
Http.Open "Post", sURL, False
Http.send (xgetCSS.XML)
Set nodes = Http.responseXML.SelectNodes("//return/css/members/member")
For Each xMember In nodes
node.appendChild xMember
Next解决方法:
Dim sURL as String
Dim Http As Object
Set Http = CreateObject("MSXML2.SERVERXMLHTTP")
Dim xgetCSS As New MSXML2.DOMDocument60
Dim xDoc As New MSXML2.DOMDocument60
Dim xMember As MSXML2.IXMLDOMElement
Dim nodes As MSXML2.IXMLDOMNodeList
Dim node As MSXML2.IXMLDOMElement
Http.Open "Post", sURL, False
Http.send (xgetCSS.XML)
Set nodes = Http.responseXML.SelectNodes("//return/css/members/member")
For Each xMember In nodes
xDoc.LoadXML xMember.XML
node.appendChild xDoc.DocumentElement
Next因此,基本上,我采用了返回的XML内容,创建了一个新的DOM文档,并使用这个新创建的DOM文档来解决“混合版本”问题。但是有没有更好的方法呢?谢谢!
发布于 2018-08-28 14:57:57
我真的不是很热衷于发布我无法测试的答案,但这里有。
在您的最高版本中,您直接使用响应XML,而不借助XML解析器。此link对您的错误描述如下:
导致
当您在DOM对象的方法调用中混合使用不同版本的MSXML DOM对象时,来自作为所需方法参数提供的不同解析器版本的对象将被视为外来对象。
解析
引用和使用由单个版本的MSXML分析器实现的对象。在编写MSXML DOM时,不要混合使用不同版本的DOM对象。
因此,当使用direct时,您可能正在处理由不同版本的MSXML解析器实现的对象。
我认为在探索DOM之前,您总是需要将响应解析到XML解析器客户端。这允许您在整个代码中指定/控制解析器的版本。它还允许您validateOnParse并确保xPath可用于定位DOM元素。
我不能测试,但可能会像下面这样?
Option Explicit
Public Sub HandleXML()
Dim sURL As String, Http As Object, xgetCSS As New MSXML2.DOMDocument60
Dim xDoc As New MSXML2.DOMDocument60, xMember As MSXML2.IXMLDOMElement
Dim nodes As MSXML2.IXMLDOMNodeList, node As MSXML2.IXMLDOMElement
Set Http = CreateObject("MSXML2.SERVERXMLHTTP")
With Http
.Open "Post", sURL, False
.send xgetCSS.XML
End With
With xDoc
.validateOnParse = True
.setProperty "SelectionLanguage", "XPath"
.async = False
If Not .LoadXML(Http.responseText) Then '<==Not sure if you need Http.responseXML here as can't test
Err.Raise .parseError.ErrorCode, , .parseError.reason
Exit Sub
End If
End With
Set nodes = xDoc.SelectNodes("//return/css/members/member")
For Each xMember In nodes
node.appendChild xMember
Next
End Sub一些微软的info on XML Dom。
https://stackoverflow.com/questions/52049498
复制相似问题