2014-11-18 14 views
5

Napisałem kod do importowania niektórych danych z pliku XML do programu Excel, działa on do momentu, aż spróbuje odczytać atrybuty, które nie istnieją; są one opcjonalne w pliku i nie mogę ich dodać, więc muszę obsługiwać je w kodzie.Jak obsługiwać opcjonalne atrybuty XML w języku VBA?

Próbowałem obsługiwać obiekty za pomocą If Is Not Nothing, ale to nie działa, ani nie ma If <> "" lub If <> Null bez powodzenia.

Jeśli ktoś może udzielić mi pomocy, byłbym niezmiernie wdzięczny.

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 

Przykładowy plik 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> 

Odpowiedz

4

Są to obiekty w VBA i sprawdzić, czy są one pusty (zostały aassigned) używając następującej składni

If Not (Object Is Nothing) Then

Więc jeśli chcesz sprawdzić, czy atrybuty e pobierane i przydzielony z XML a następnie można:

' 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 

i wierzę, że jest to wynik Twoje są po

enter image description here

+0

Dziękuję bardzo, używałem 'Jeśli nie jest źle Nothing' . Teraz działa idealnie. – sab0tage

+4

@ sab0tage Cieszę się, że mogę pomóc. W Stack Overflow mówimy "dziękuję" [akceptując odpowiedzi, które nam pomogły] (http://stackoverflow.com/help/accepted-answer). Obok odpowiedzi po lewej jest zielony znaczek, który zaznaczasz :) –

Powiązane problemy