powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Xml: Импорт xml файлов в Excel
3 сообщений из 3, страница 1 из 1
VBA Xml: Импорт xml файлов в Excel
    #39238866
bast3n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нижеследующий код выполняет поиск всех .xml файлов в папке и импортирует в excel необходимые атрибуты. Проблема в том, что не все xml файлы имеют одинаковый тег(возможны 4 варианта). Если в папку положить xml файлы только с "правильными" тегами все работает, но если там окажется "неправильный" xml файл, то программа вылетает с ошибкой (Run time Error 91). Это случается по причине того, что функция SelectNode не может возвращать значение Nothing. Вопрос в том, можно ли каким-либо образом сделать так чтобы программа перебирала 4 варианта возможных тегов.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
For Each myfile In MySource.Files
        If Right(myfile.Name, 3) = "XML" Or Right(myfile.Name, 3) = "xml" Then
'-------------------------------------------------------------
           Set xmlDoc = CreateObject("Microsoft.XMLDOM")
           xmlDoc.setProperty "SelectionLanguage", "XPath"
           xmlDoc.Async = False
           xmlDoc.Load (mySourcePath & "\" & myfile.Name)
           Set nodeXML1 = xmlDoc.SelectNodes("//zxd/loc1/@nUser")
           Set nodeXML2 = xmlDoc.SelectNodes("//zxd/loc1/updates/u1/@date")
           Set nodeXML3 = xmlDoc.SelectNodes("//zxd/loc1/updates/u2/@date")
           Set nodeXML4 = xmlDoc.SelectNodes("//zxd/loc1/updates/u3/@date")
           Set nodeXML5 = xmlDoc.SelectNodes("//zxd/loc1/updates/u4/@date")
           Set nodeXML6 = xmlDoc.SelectNodes("//zxd/loc1/updates/u5/@date")
           Cells(row, 1) = nodeXML1(0).Text
           Cells(row, 2) = nodeXML2(0).Text
           Cells(row, 3) = nodeXML3(0).Text
           Cells(row, 4) = nodeXML4(0).Text
           Cells(row, 5) = nodeXML5(0).Text
           Cells(row, 6) = nodeXML6(0).Text
           row = row + 1
                
       End If
    Next


В xml файлах возможны только 4 варианта(loc1,loc2,loc3,loc4). Пробовал через оператор управления ошибками не получается. Буду признателен за пример.
...
Рейтинг: 0 / 0
VBA Xml: Импорт xml файлов в Excel
    #39239030
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
On Error Resume Next


да простят меня истинные обработчики ошибок
...
Рейтинг: 0 / 0
VBA Xml: Импорт xml файлов в Excel
    #39239400
hclubmk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробую предложить парсить путь, и проверять наличие имени Node или Attribute(@)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
Private Enum SearchResult
    Present
    NotPresent
    PresentComplete
End Enum

Private Function CheckNodeName(ChildList As MSXML2.IXMLDOMNodeList, names() As String, index As Long) As SearchResult
Dim Node As MSXML2.IXMLDOMNode
Dim attr As MSXML2.IXMLDOMAttribute
For Each Node In ChildList
    If Node.nodeName = names(index) Then
        If index = UBound(names) Then
            CheckNodeName = PresentComplete
            Exit Function
        Else
            If Mid(names(index + 1), 1, 1) = "@" Then
                For Each attr In Node.Attributes
                    If attr.baseName = Right(names(index + 1), Len(names(index + 1)) - 1) Then
                        If UBound(names) = index + 1 Then
                            CheckNodeName = PresentComplete
                            Exit Function
                        Else
                            CheckNodeName = Present
                        End If
                    End If
                Next
            End If
            CheckNodeName = CheckNodeName(Node.childNodes, names, index + 1)
            If CheckNodeName = PresentComplete Then
                Exit Function
            End If
        End If
    Else
        CheckNodeName = False
    End If
Next
End Function

Private Function CheckPath(doc As MSXML2.DOMDocument, path As String) As SearchResult
Dim i As Long
Dim names() As String

For i = 1 To Len(path)
    If Mid(path, i, 1) <> "\" Then
        names = Split(Right(path, Len(path) - i + 1), "\")
        Exit For
    End If
Next i

CheckPath = CheckNodeName(doc.childNodes, names, 0)

End Function


проверял на .gpx треке (другого документа под руками не оказалось):
Код: vbnet
1.
2.
3.
4.
Dim doc As New MSXML2.DOMDocument
doc.Load "c:\track.gpx"
Debug.Print CheckPath(doc, "\\gpx\trk\trkseg\trkpt\ele")
Debug.Print CheckPath(doc, "\\gpx\trk\trkseg\trkpt\@lon")
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / VBA Xml: Импорт xml файлов в Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]