Импорт XML из WS и разбор в таблице доступа в VBA - PullRequest
0 голосов
/ 30 октября 2018

Я работаю, чтобы импортировать данные из веб-службы. Я успешно с этим, но импорт данных в 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

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

1 Ответ

0 голосов
/ 31 октября 2018

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

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

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>

1020 * 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...