Импорт XML из WS и анализ в таблице доступа в VBA

Я работаю над импортом данных из веб-службы. Мне это удалось, но данные импортируются в 3 таблицы. Я нашел различные варианты, которые, как мне кажется, будут работать, но не понимаю, какой из них будет лучшим и наиболее целесообразным.

Я нашел варианты:

Преобразование XML с помощью XSLT Несколько способов синтаксического анализа, включая XPATH

На самом деле я так много прочитал, что дошел до путаницы в том, что мне следует делать.

Вот XML

<ArrayOfVehicle xmlns = "http://schemas.datacontract.org/2004/07/Xata.Ignition.WebServiceAPI.Contracts.DataContract.Entities" xmlns:i = "http://www.w3.org/2001/XMLSchema-instance">
    <Vehicle>
        <AllowTrailerInspection>true</AllowTrailerInspection>
        <Auxiliary>None</Auxiliary>
        <CompanyName>Company</CompanyName>
        <CompanySID>1234</CompanySID>
        <Country>USA</Country>
        <EldVehicle>true</EldVehicle>
        <FuelDrawCapacity>0</FuelDrawCapacity>
        <GrossVehicleWeight>0</GrossVehicleWeight>
        <HP>0</HP>
        <HUT>false</HUT>
        <HasBerth>false</HasBerth>
        <HasElectronicEngine>true</HasElectronicEngine>
        <HosExempt>false</HosExempt>
        <IFTA>true</IFTA>
        <InstallDate>2018-10-01T13:01:00</InstallDate>
        <LicensePlate></LicensePlate>
        <ManualVIN>false</ManualVIN>
        <Manufacture></Manufacture>
        <ManufactureDate>1900-01-01T00:00:00</ManufactureDate>
        <Model></Model>
        <ModifiedBy>331</ModifiedBy>
        <ModifiedDate>2018-10-19T20:26:03.648543</ModifiedDate>
        <OBCType>ABCRelay</OBCType>
        <Odometer>0</Odometer>
        <OdometerDate>2018-10-01T04:00:00</OdometerDate>
        <OrganizationID>ABCLTL</OrganizationID>
        <OrganizationName>ABCLTL</OrganizationName>
        <OrganizationSID>32</OrganizationSID>
        <OwnerOperator>false</OwnerOperator>
        <PowerAxles>1</PowerAxles>
        <ResourceGroupIdList xmlns:a = "http://schemas.microsoft.com/2003/10/Serialization/Arrays">
            <a:string>NOR DISPATCH</a:string>
        </ResourceGroupIdList>
        <SID>34163</SID>
        <StateProvince>Texas</StateProvince>
        <Status>Active</Status>
        <StraightTruck>false</StraightTruck>
        <TGTNumber>123456</TGTNumber>
        <TransmissionMfg></TransmissionMfg>
        <TransmissionType></TransmissionType>
        <Type>Tractor</Type>
        <UserDefinedField1></UserDefinedField1>
        <UserDefinedField2></UserDefinedField2>
        <UserDefinedField3></UserDefinedField3>
        <UserDefinedField4></UserDefinedField4>
        <UserDefinedField5></UserDefinedField5>
        <VIN>1FVAHGFCXAJJR8537</VIN>
        <VehicleName>001234SCAC</VehicleName>
        <Year></Year>
    </Vehicle>
    <Vehicle>

Я только хочу импортировать

<VehicleName>
<TGTNumber> and
<a:string> inside of <ResourceGroupIDList....

Это то, что у меня есть в VBA

Public Sub UpdateTrucks(strUID As String, strPassword As String)
    'Debug.Print strDate
    Dim reader As New XMLHTTP60
    Dim strUserID As String
    Dim strRequest As String
    Dim strSQL As String
    Dim rs As DAO.Recordset



    strSQL = "tblResourceGroups1"   'defines the Table result that you want to loop
    Set rs = CurrentDb.OpenRecordset(strSQL)
    strUserID = "1234567|" & strUID
    strPassword = strPassword

    If Not rs.BOF And Not rs.EOF Then
    rs.MoveFirst
    While (Not rs.EOF)

            strRequest = "http://ws.Website.com/VehicleWebService.svc/vehicles/?ResourceGroupID = " & rs.Fields("ResourceGroupName")
            'Debug.Print strRequest
            reader.Open "GET", strRequest, rs.Fields("ResourceGroupName"), strUserID, strPassword
            reader.send

                Do Until reader.ReadyState = 4
                    DoEvents
            Loop

            If reader.status = 200 Then
            'importXML

            'current
            Set doc = reader.responseXML
            doc.Save "C:\Data\Table.xml"
            Application.ImportXML "C:\Data\Table.xml", acStructureAndData

                ElseIf reader.status = 401 Then
                   MsgBox "Unable to authenticate. The username and password do not match with the system."
                ElseIf reader.status = 500 Then
                   MsgBox "Due to an internal issue the system is unable to take the desired request. Please try again later."
            End If

        rs.MoveNext
      Wend
    Else
        MsgBox "Unable to import data."

    End If

    rs.Close
    Set rs = Nothing


End Sub

Любая помощь в том направлении, в котором я должен идти, была бы очень признательна.

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

Erik A 30.10.2018 20:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
671
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассмотрите возможность использования XSLT, языка специального назначения, предназначенного для преобразования файлов XML, например, для ваших нужд извлечения. Запустите сценарий XSLT сразу после получения веб-объекта XML и перед вызовом ImportXML.

В частности, приведенный ниже XSLT запускает преобразование идентичности (для копирования документа как есть), а затем извлекает из всех узлов Транспортное средство три необходимых дочерних элемента. Здесь XSLT сопоставляет пространство имен по умолчанию с префиксом док.

XSLT(сохранить как файл .xsl, специальный файл .xml)

<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
                              xmlns:doc = "http://schemas.datacontract.org/2004/07/Xata.Ignition.WebServiceAPI.Contracts.DataContract.Entities"
                              xmlns:a = "http://schemas.microsoft.com/2003/10/Serialization/Arrays">                            
  <xsl:output indent = "yes"/>
  <xsl:strip-space elements = "*"/>

  <!-- IDENTITY TRANSFORM -->
  <xsl:template match = "@*|node()">
    <xsl:copy>
      <xsl:apply-templates select = "@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match = "doc:Vehicle">
    <xsl:copy>
      <xsl:copy-of select = "doc:VehicleName|doc:TGTNumber|doc:ResourceGroupIdList/a:string"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

VBA

' ADD MSXML, v6.0 REFERENCE UNDER TOOLS
Dim xmlDoc As New MSXML2.DOMDocument60, xslDoc As New MSXML2.DOMDocument60, newDoc As New MSXML2.DOMDocument60

... same code ...

' WEB XML DOC
Set doc = reader.responseXML

' LOAD XML AND XSL FILES
xmlDoc.async = False
xmlDoc.LoadXML doc.XML

xslDoc.async = False
xslDoc.Load "C:\Data\XSLT_Script.xsl"

' TRANSFORM XML
xmlDoc.transformNodeToObject xslDoc, newDoc

' OUTPUT TRANSFORMED XML
newDoc.Save "C:\Data\Table.xml"

' IMPORT TRNASFORMED XML
Application.ImportXML "C:\Data\Table.xml", acStructureAndData

... same code ...

XML(преобразовано)

<?xml version = "1.0" encoding = "UTF-16"?>
<ArrayOfVehicle xmlns = "http://schemas.datacontract.org/2004/07/Xata.Ignition.WebServiceAPI.Contracts.DataContract.Entities" xmlns:i = "http://www.w3.org/2001/XMLSchema-instance">
    <Vehicle>
        <a:string xmlns:a = "http://schemas.microsoft.com/2003/10/Serialization/Arrays">NOR DISPATCH</a:string>
        <TGTNumber>123456</TGTNumber>
        <VehicleName>001234SCAC</VehicleName>
    </Vehicle>
</ArrayOfVehicle>

Таблица доступа MS

string       TGTNumber  VehicleName
NOR DISPATCH    123456   001234SCAC

Ты, мой друг, это путь, в котором все имело смысл. это работает отлично. Большое спасибо.

justin munson 30.10.2018 22:59

Приятно слышать и рад помочь. Не забывайте, как Stackoverflow говорит Благодарность!

Parfait 31.10.2018 14:57

Другие вопросы по теме