2017-10-07 150 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,因爲如果前面的加載過程失敗,則不能將此對象設置爲內存。請參閱下面的答案,其中包含一種查找錯誤的方法。 –

相關問題