VBA - проверить, существует ли xml-узел - если не использовать другой - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу скопировать данные из XML-файла в книгу Excel Каждый xml имеет тег "Имя клиента", но некоторые из них также имеют тег "Имя клиента биллинга" Я хочу добиться этого с помощью своего кода Если в XML-теге «Имя клиента биллинга» существует, используйте его и игнорируйте тег «Имя клиента» если в xml нет тега «Имя клиента биллинга», используйте данные из тега «Имя клиента» Мой текущий код вставляет только данные из тега "Имя клиента"

Мой код:

Dim mainWorkBook As Workbook
Set mainWorkBook = ActiveWorkbook

mainWorkBook.Sheets("Sheet3").Activate

LR = Cells(Rows.Count, "A").End(xlUp).Row
'MsgBox LR
For x = 2 To LR

    Set xmlDoc = CreateObject("Microsoft.XMLDOM")
    xmlDoc.SetProperty "SelectionLanguage", "XPath"
    xmlDoc.Async = False
    xmlDoc.Load ("\\path\" & Range("A" & x) & ".xml")

    Set nodeXML = xmlDoc.getElementsByTagName("BILL_TO_CLIENTCODE")
    Set nodeXML2 = xmlDoc.getElementsByTagName("CLIENTCODE")

    If nodeXML Is Nothing Then

        Range("B" & x).Value = nodeXML(i).Text

    Else

        Range("B" & x).Value = nodeXML2(i).Text

    End If

Next x

Если я изменю последние строки кода на:

If nodeXML Is Nothing Then
    Range("B" & x).Value = nodeXML2(i).Text
Else
    Range("B" & x).Value = nodeXML(i).Text
End If

Я получаю значение только из тега «Имя клиента для выставления счета», но не вижу значения, если этот тег не существует

образец xml

<InvoiceData xmlns="http://tempuri.org/InvoiceData.xsd">
   <INVOICE_HEADER>
        <BILL_TO_CLIENTCODE/>
        <CLIENTCODE>61138259</CLIENTCODE>

второй имеет значение в теге Билл для кода клиента и в коде клиента, но Билл для кода клиента должен быть основным.

1 Ответ

0 голосов
/ 02 ноября 2018

xmlDoc.getElementsByTagName всегда возвращает коллекцию, но эта коллекция может быть пустой, если нет совпадений, поэтому вам нужно проверить (например)

 If nodeXML.Length > 0 Then

и не проверять, является ли nodeXML Ничем

Так что-то вроде этого должно работать (не проверено):

Sub Tester()

    Dim mainWorkBook As Workbook, xmlDoc As Object
    Dim sht As Worksheet

    Set mainWorkBook = ActiveWorkbook
    Set sht = mainWorkBook.Sheets("Sheet3")

    For x = 2 To sht.Cells(sht.Rows.Count, "A").End(xlUp).Row

        Set xmlDoc = CreateObject("Microsoft.XMLDOM")
        xmlDoc.SetProperty "SelectionLanguage", "XPath"
        xmlDoc.Async = False
        xmlDoc.Load ("\\path\" & Range("A" & x) & ".xml")

        sht.Range("B" & x).Value = PreferredValue(xmlDoc, _
                  Array("BILL_TO_CLIENTCODE", "CLIENTCODE"))

    Next x
End Sub

Function PreferredValue(doc As Object, arrTags)
    Dim t, col, rv
    For Each t In arrTags
        Set col = doc.getElementsByTagName(t)
        If col.Length > 0 Then
            rv = col(0).Text
            If Len(rv) > 0 Then Exit For '<<<< EDIT
        End If
    Next t
    PreferredValue = rv
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...