2017-10-07 87 views
1

我有我试图解析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 
+2

这是因为'XDoc.DocumentElement'没有返回任何内容,可能是因为'XDoc.Load'无法解析文件。 –

+0

从xml文件中删除' MASTER/CLASS'和' St/ar'行,然后再试一次 – jsotola

+2

您的XML文件格式不正确,'&'是[特殊的XML实体](https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Predefined_entities_in_XML),需要转义为'&' – Parfait

回答

4

您的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 

提示如果您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),因为它包含内P格里菲思&儿子非可读字符称为符号(“&”)你的XML文件没有成功加载Jo & hn,必须更改为“&#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网站找到一些。

+0

谢谢我的XML内容与我在问题中提到的完全相同。当我尝试解析它时表示解析失败 – Rohan

+0

您必须在c)中告诉您的两行中更改&符号。 xml解析错误例程向您显示行号。之后,你的代码运行良好。 –

2

你的代码对我来说运行良好。作为@FlorentB。建议,该文件可能无法解析。我怀疑他们是文件名中的错误。添加一些错误处理将有助于捕获这些错误。

Sub PrintXML() 

    Dim FilePath As String 
    Dim XDoc As Object 

    FilePath = ThisWorkbook.Path & "\test.xml" 

    If Len(Dir(FilePath)) = 0 Then 
     MsgBox "File not Found:" & vbCrLf & FilePath, vbCritical 
     Exit Sub 
    End If 

    Set XDoc = CreateObject("MSXML2.DOMDocument") 
    XDoc.async = False: XDoc.validateOnParse = False 
    XDoc.Load ("C:\Users\norkiosk\Documents\Fax\test.xml") 

    'Get Document Elements 
    Set lists = XDoc.DocumentElement 

    If lists Is Nothing Then 
     MsgBox "Failed to Parse File:" & vbCrLf & FilePath, vbCritical 
     Exit Sub 
    End If 

    '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 

End Sub 
+0

谢谢,但是当我尝试解析它。它说解析文件失败,为什么当我尝试运行它时什么都没有列出? – Rohan

+0

'lists'是Nothing,因为如果前面的加载过程失败,则不能将此对象设置为内存。请参阅下面的答案,其中包含一种查找错误的方法。 –

相关问题