2014-11-18 13 views
5

Ho scritto del codice per importare alcuni dati da un file XML in Excel, funziona fino a quando non tenta di leggere attributi che non esistono; sono opzionali nel file e non posso aggiungerli, quindi devo gestirli nel codice.Come si gestiscono gli attributi XML facoltativi in ​​VBA?

Ho provato a gestire gli oggetti con If Is Not Nothing, ma questo non funziona, neanche If <> "" o If <> Null senza fortuna.

Se qualcuno può darmi qualsiasi assistenza sarei estremamente grato.

Public Sub import() 

    Dim oDoc As MSXML2.DOMDocument 
    Dim fSuccess As Boolean 
    Dim oRoot As MSXML2.IXMLDOMNode 
    Dim oSoftkey As MSXML2.IXMLDOMNode 
    Dim oAttributes As MSXML2.IXMLDOMNamedNodeMap 
    Dim oSoftkeyName As MSXML2.IXMLDOMNode 
    Dim oSoftkeyDescriptor As MSXML2.IXMLDOMNode 
    Dim oSoftkeyStyleName As MSXML2.IXMLDOMNode 

    Dim oChildren As MSXML2.IXMLDOMNodeList 
    Dim oChild As MSXML2.IXMLDOMNode 
    Dim intI As Integer 
    On Error GoTo HandleErr 

    Set oDoc = New MSXML2.DOMDocument 

    oDoc.async = False 
    oDoc.validateOnParse = False 
    fSuccess = oDoc.Load(ActiveWorkbook.Path & "\keys.xml") 

    If Not fSuccess Then 
     GoTo ExitHere 
    End If 

    intI = 2 
    ActiveSheet.Cells(1, 1).CurrentRegion.ClearContents 
    ActiveSheet.Cells(1, 1) = "Name" 
    ActiveSheet.Cells(1, 2) = "TextDescriptor" 
    ActiveSheet.Cells(1, 3) = "StyleName" 

    ' Get the root of the XML tree. 
    ' Set oRoot = oDoc.DocumentElement 
    Set oRoot = oDoc.SelectSingleNode("//IMS_Softkeys") 

    ' Each IMS_Softkey in IMS_Softkeys 
    For Each oSoftkey In oRoot.ChildNodes 

     Set oAttributes = oSoftkey.Attributes 

     Set oSoftkeyName = oAttributes.getNamedItem("Name") 
     Set oSoftkeyDescriptor = oAttributes.getNamedItem("TextDescriptor") 
     Set oSoftkeyStyleName = oAttributes.getNamedItem("StyleName") 

     ActiveSheet.Cells(intI, 1).Value = oSoftkeyName.Text 

     'Can't handle optional attribute "TextDescriptor" or "SoftkeyStyle" 
     ActiveSheet.Cells(intI, 2).Value = oSoftkeyDescriptor.Text 
     ActiveSheet.Cells(intI, 3).Value = oSoftkeyStyleName.Text 

     intI = intI + 1 
    Next oSoftkey 
ExitHere: 
    Exit Sub 
HandleErr: 
    MsgBox "Error " & Err.Number & ": " & Err.Description 
    Resume ExitHere 
    Resume 
End Sub 

Un esempio di file XML (keys.xml):

<BATCH> 
    <IMS_BATCH> 
    <IMS_Softkeys> 
     <IMS_Softkey Name="Donut" StyleName="Mer-Green-Yellow" TextDescriptor="1 Donut" /> 
     <IMS_Softkey Name="Hotdog" StyleName="Mer-White-Black" TextDescriptor="11&quot; Hotdog" /> 
     <IMS_Softkey Name="Coke_Image" TextDescriptor="Coke" /> 
     <IMS_Softkey Name="DietCoke_Image" StyleName="Style for DietCocaCola" /> 
    </IMS_Softkeys> 
    </IMS_BATCH> 
</BATCH> 

risposta

4

Sono oggetti e in VBA si controlla se sono vuote (stati aassigned) utilizzando la seguente sintassi

If Not (Object Is Nothing) Then

Quindi se si desidera verificare se gli attributi sono stati e recuperato e assegnato da XML allora si potrebbe:

' Print only if the `oSoftKeyDescriptor` is not nothing 
If Not (oSoftkeyDescriptor Is Nothing) Then 
    ActiveSheet.Cells(intI, 2).Value = oSoftkeyDescriptor.Text 
End If 

If Not (oSoftkeyStyleName Is Nothing) Then 
    ActiveSheet.Cells(intI, 3).Value = oSoftkeyStyleName.Text 
End If 

e credo che questo sia il risultato il vostro sono dopo

enter image description here

+0

ringrazio molto, stavo usando 'Se non è sbagliato Nothing' . Funziona perfettamente ora. – sab0tage

+4

@ sab0tage Sono felice di poterti aiutare. Su Stack Overflow diciamo grazie [accettando le risposte che ci hanno aiutato] (http://stackoverflow.com/help/accepted-answer). C'è un segno di spunta verde accanto alla risposta a sinistra che tu segni :) –

Problemi correlati