如何在VBA中处理可选的XML属性?

sab*_*age 5 xml error-handling excel vba

我已经编写了一些代码来将一些数据从XML文件导入到excel中,直到它尝试读取不存在的属性为止.它们在文件中是可选的,我无法添加它们所以我需要在代码中处理它.

我试着与处理的对象If Is Not Nothing,但是,这并不工作,同样没有If <> ""If <> Null没有运气.

如果有人能给我任何帮助,我将非常感激.

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
Run Code Online (Sandbox Code Playgroud)

示例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>
Run Code Online (Sandbox Code Playgroud)

小智 4

它们是对象,在 VBA 中,您可以使用以下语法检查它们是否为已分配)

If Not (Object Is Nothing) Then

因此,如果您想检查属性是否是从 XML 检索和分配的,那么您可以:

' 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
Run Code Online (Sandbox Code Playgroud)

我相信这就是你想要的结果

在此输入图像描述

  • @sab0tage 我很高兴能提供帮助。在 Stack Overflow 上,我们通过[接受对我们有帮助的答案](http://stackoverflow.com/help/accepted-answer) 表示感谢。在您勾选的左侧答案旁边有一个绿色的复选标记:) (4认同)