Невозможно проанализировать XML для получения конкретной информации в VBA - PullRequest
0 голосов
/ 27 июня 2018

Я строил небольшого бота для своего бизнеса, и очень важно, чтобы сразу несколько файлов XML загружались в Excel для выполнения оставшейся части бота. Я успешно смог загрузить несколько XML, используя цикл, однако, поскольку все XML не в одном и том же формате, необходимо, чтобы в Excel загружалась только необходимая информация. Я искал разные источники, но, похоже, я делаю это неправильно. Соответствующий код VBA, который у меня есть для загрузки нескольких XML-файлов:

Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    With Sheets("Working Notes")
        lastrow = .Cells(.Rows.Count, "A").End(xlUp).row
        For i = 1 To lastrow
            strTargetFile = .Cells(i, "A")
            Set Wb = Workbooks.OpenXML(FileName:=strTargetFile, LoadOption:=xlXmlLoadImportToList)
            'wb.Sheets(1).UsedRange.Copy ThisWorkbook.Sheets("Working Notes").Cells(Rows.Count, "B").End(xlUp).Offset(1, 0)
            Wb.Sheets(1).UsedRange.Copy ThisWorkbook.Sheets("Working Notes").Range("B" & i)
            Wb.Close False
        Next i
    End With

XML-страница, на которую я смотрю, это

<?xml version="1.0" encoding="utf-8"?>
<abcd_omn_gatca:abcd_omn xmlns:abcd="urn:lu:etat:acd:abcd_omn:v2.0" xmlns:ftc="urn:lu:etat:acd:gatca:v2.0" xmlns:sfa="urn:oecd:ties:stfgatcatypes:v2" xmlns:abcd_omn_gatca="urn:lu:etat:acd:abcd_gatca:v2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="urn:lu:etat:acd:abcd_gatca:v2.0 abcd_gatca_V2.0.xsd">
    <abcd_omn_gatca:abcd_gatca>
        <abcd_omn_gatca:abcd_RefId>XXXXX</abcd_omn_gatca:abcd_RefId>
        <abcd_omn_gatca:abcd_Depositor>
            <abcd:NameDepositor>XXXXX</abcd:NameDepositor>
            <abcd:PersonalIdentificationNumberDepositor>XXXXX</abcd:PersonalIdentificationNumberDepositor>
            <abcd:AddressDepositor>
                <abcd:StreetPhysical>XXXXX</abcd:StreetPhysical>
                <abcd:NumberPhysical>XXXXX</abcd:NumberPhysical>
                <abcd:PostalCodePhysical>XXXXX</abcd:PostalCodePhysical>
                <abcd:CityPhysical>XXXXX</abcd:CityPhysical>
                <abcd:CountryPhysical>XXXXX</abcd:CountryPhysical>
            </abcd:AddressDepositor>
            <abcd:PersonDepositor>
                <abcd:Name>XXXXX</abcd:Name>
                <abcd:FirstName>XXXXX</abcd:FirstName>
                <abcd:EmailPersonal>XXXXX</abcd:EmailPersonal>
                <abcd:TelephoneDirect>XXXXX</abcd:TelephoneDirect>
            </abcd:PersonDepositor>
        </abcd_omn_gatca:abcd_Depositor>
        <abcd_omn_gatca:abcd_Declarer>
            <abcd:NameDeclarer>XXXXX</abcd:NameDeclarer>
            <abcd:PersonalIdentificationNumberDeclarer>XXXXX</abcd:PersonalIdentificationNumberDeclarer>
            <abcd:AddressDeclarer>
                <abcd:StreetPhysical>XXXXX</abcd:StreetPhysical>
                <abcd:NumberPhysical>XXXXX</abcd:NumberPhysical>
                <abcd:PostalCodePhysical>XXXXX</abcd:PostalCodePhysical>
                <abcd:CityPhysical>XXXXX</abcd:CityPhysical>
                <abcd:CountryPhysical>XXXXX</abcd:CountryPhysical>
            </abcd:AddressDeclarer>
            <abcd:PersonDeclarer>
                <abcd:Name>XXXXX</abcd:Name>
                <abcd:FirstName>XXXXX</abcd:FirstName>
                <abcd:EmailPersonal>XXXXX</abcd:EmailPersonal>
                <abcd:EmailOrganisation>XXXXX</abcd:EmailOrganisation>
                <abcd:TelephoneDirect>XXXXX</abcd:TelephoneDirect>
            </abcd:PersonDeclarer>
        </abcd_omn_gatca:abcd_Declarer>
        <abcd_omn_gatca:abcd_ReportingPerson>
            ***<abcd:NameReportingPerson>RENIN III S.A R.L.</abcd:NameReportingPerson***>
            <abcd:IdentificationNumber>XXXXX</abcd:IdentificationNumber>
            <abcd:IdentificationNumberExtension>XXXXX</abcd:IdentificationNumberExtension>
            <***abcd:AddressReportingPerson>
                <abcd:StreetPhysical>Avenue M.F. Brady</abcd:StreetPhysical>
                <abcd:NumberPhysical>45</abcd:NumberPhysical>
                <abcd:PostalCodePhysical>1234</abcd:PostalCodePhysical>
                <abcd:CityPhysical>Somethingburg</abcd:CityPhysical>
                <abcd:CountryPhysical>SB</abcd:CountryPhysical>
            </abcd:AddressReportingPerson>***
            <abcd:PersonContactReportingPerson>
                <abcd:Name>XXXXX</abcd:Name>
                <abcd:FirstName>XXXXX</abcd:FirstName>
                <abcd:EmailPersonal>XXXXX</abcd:EmailPersonal>
                <abcd:EmailOrganisation>XXXXX</abcd:EmailOrganisation>
                <abcd:TelephoneDirect>XXXXX</abcd:TelephoneDirect>
            </abcd:PersonContactReportingPerson>
        </abcd_omn_gatca:abcd_ReportingPerson>
        <abcd_omn_gatca:RFI_Identifier>XXXXX</abcd_omn_gatca:RFI_Identifier>
        <abcd_omn_gatca:ReportContent>
            <abcd_omn_gatca:ReportingPeriod>XXXXX</abcd_omn_gatca:ReportingPeriod>
            <abcd_omn_gatca:ZeroReporting>XXXXX</abcd_omn_gatca:ZeroReporting>
        </abcd_omn_gatca:ReportContent>
    </abcd_omn_gatca:abcd_gatca>
</abcd_omn_gatca:abcd_omn>

Единственная информация, которая мне требуется, - это имя сообщающего лица "RENIN III S.A R.L." и адрес лица, сообщающего информацию, на листе Excel. Прости меня за мои очень незрелые знания VBA. Я буду очень благодарен за любую помощь. Большое спасибо!

1 Ответ

0 голосов
/ 21 июля 2018

После удаления "***" я загрузил ваш XML из файла (test.xml). При условии, что вы включаете ссылку на требуемое пространство имен, вы можете получить доступ следующим образом:

Option Explicit
Public Sub testing()
    Dim xmlDoc As New MSXML2.DOMDocument60
    xmlDoc.validateOnParse = True
    xmlDoc.setProperty "SelectionNamespaces", "xmlns:abcd=""urn:lu:etat:acd:abcd_omn:v2.0"""
    If xmlDoc.Load("C:\Users\User\Desktop\test.xml") Then
        Dim node As Object
        Debug.Print xmlDoc.SelectNodes("//abcd:AddressReportingPerson").Length
        Debug.Print xmlDoc.SelectNodes("//abcd:NameReportingPerson").Length
        For Each node In xmlDoc.SelectNodes("//abcd:AddressReportingPerson")
            Debug.Print node.Text
        Next node
        For Each node In xmlDoc.SelectNodes("//abcd:NameReportingPerson")
            Debug.Print node.Text
        Next node
    Else
        Debug.Print "Houston, we have a problem!"
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...