首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >混合来自不同版本的msxml的对象是错误的

混合来自不同版本的msxml的对象是错误的
EN

Stack Overflow用户
提问于 2018-08-28 11:06:12
回答 1查看 332关注 0票数 1

我正在使用Excel VBA,并尝试实现以下目标:

1)发送HTTP请求并获取返回的XML 2)从返回的XML中选择一些元素,并使用appendChild方法将它们添加到另一个XML DOM中。

我收到运行时错误“混合来自不同版本的msxml的对象是一个错误”。我找到了一种解决方法,但不确定为什么会发生错误,并想知道是否有更好的方法来解决它。

抛出错误的代码:

代码语言:javascript
复制
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

解决方法:

代码语言:javascript
复制
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文档来解决“混合版本”问题。但是有没有更好的方法呢?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2018-08-28 14:57:57

我真的不是很热衷于发布我无法测试的答案,但这里有。

在您的最高版本中,您直接使用响应XML,而不借助XML解析器。此link对您的错误描述如下:

导致

当您在DOM对象的方法调用中混合使用不同版本的MSXML DOM对象时,来自作为所需方法参数提供的不同解析器版本的对象将被视为外来对象。

解析

引用和使用由单个版本的MSXML分析器实现的对象。在编写MSXML DOM时,不要混合使用不同版本的DOM对象。

因此,当使用direct时,您可能正在处理由不同版本的MSXML解析器实现的对象。

我认为在探索DOM之前,您总是需要将响应解析到XML解析器客户端。这允许您在整个代码中指定/控制解析器的版本。它还允许您validateOnParse并确保xPath可用于定位DOM元素。

我不能测试,但可能会像下面这样?

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52049498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档