未设置带有或带有块的对象变量

2023-12-14

我有一个正在尝试解析的 xml 文件:

这是xml文件内容

<MYSTUFF>
<COMPANYNAMES>
<COMPANYNAME>JUMPIN (JIMMY) LIMITED</COMPANYNAME>
<COMPANYNAME>BLADE RUNNER'S TRANSPORT</COMPANYNAME>
<COMPANYNAME>P Griffiths & Sons</COMPANYNAME>
<COMPANYNAME>SOMETIMES, NEVER</COMPANYNAME>
<COMPANYNAME>MASTER/CLASS</COMPANYNAME>
</COMPANYNAMES>
<FIRSTNAMES>
<FIRSTNAME>Richard</FIRSTNAME>
<FIRSTNAME>Jo & hn</FIRSTNAME>
<FIRSTNAME>Paul</FIRSTNAME>
<FIRSTNAME>Geo, rge</FIRSTNAME>
<FIRSTNAME>Ringo</FIRSTNAME>
</FIRSTNAMES>
<LASTNAMES>
<LASTNAME>Davies'</LASTNAME>
<LASTNAME>Lennon</LASTNAME>
<LASTNAME>McCartney(3)</LASTNAME>
<LASTNAME>Harrison</LASTNAME>
<LASTNAME>St/ar</LASTNAME>
</LASTNAMES>
</MYSTUFF>

这是代码:

Dim XDoc As Object

Set XDoc = CreateObject("MSXML2.DOMDocument")
XDoc.async = False: XDoc.validateOnParse = False
XDoc.Load (ThisWorkbook.Path & "\test.xml")

'Get Document Elements
Set lists = XDoc.DocumentElement

'Traverse all elements 2 branches deep
For Each listNode In lists.ChildNodes
    For Each fieldNode In listNode.ChildNodes
        Debug.Print "[" & fieldNode.BaseName & "] = [" & fieldNode.Text & "]"
    Next fieldNode
Next listNode

Set XDoc = Nothing

我得到的对象变量带有或带有未在此行设置的块:

For Each listNode In lists.ChildNodes

您的 XML 文件未正确加载。

a) 我想你的 XML 文件以类似的开头<?xml version="1.0" encoding="utf-8"?>,这样就可以将其识别为 XML。

b) 最好声明您的对象设置(始终使用Option Explicit在声明头)。当您使用所谓的后期绑定时,只需编写如下即可:

Dim XDoc      As Object
Dim lists     As Object
Dim listNode  As Object
Dim fieldNode As Object

Hint如果您将 XDoc 对象设置到内存中Set XDoc = CreateObject("MSXML2.DOMDocument")通常您会得到旧版本(3.0),因此在大多数情况下最好显式使用Set XDoc = CreateObject("MSXML2.DOMDocument.6.0")相反,它会自动包含 XPath。如果没有,您应该按如下方式完成代码:

Set XDoc = CreateObject("MSXML2.DOMDocument")
XDoc.async = False: XDoc.validateOnParse = False
XDoc.setProperty "SelectionLanguage", "XPath"       ' << XPath functionality

c) 您的 XML 文件未成功加载,因为它包含一个名为与号(“&”)的不可读字符P 格里菲斯父子公司 and 约翰,必须改为“&#38;"。&字符作为特殊字符的通用前缀,因此不能单独包含在文件中。可以使用以下代码测试加载,而不是简单地使用XDoc.Load (ThisWorkbook.Path & "\test.xml"):

If XDoc.Load(ThisWorkbook.Path & "\test.xml") Then
   MsgBox "Loaded successfully"
Else
  Dim xPE        As Object    ' Set xPE = CreateObject("MSXML2.IXMLDOMParseError")
  Dim strErrText As String
  Set xPE = XDoc.parseError
  With xPE
     strErrText = "Load error " & .ErrorCode & " xml file " & vbCrLf & _
     Replace(.URL, "file:///", "") & vbCrLf & vbCrLf & _
    xPE.reason & _
    "Source Text: " & .srcText & vbCrLf & vbCrLf & _
    "Line No.:    " & .Line & vbCrLf & _
    "Line Pos.: " & .linepos & vbCrLf & _
    "File Pos.:  " & .filepos & vbCrLf & vbCrLf
  End With
  MsgBox strErrText, vbExclamation
  Set xPE = Nothing
  Exit Sub
End If

d) 顺便说一句,还有其他更完整的方法来循环节点(递归调用)。当然,您会在 SO 网站上找到一些。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未设置带有或带有块的对象变量 的相关文章

随机推荐