Импорт данных XML в MS Access во время выполнения ошибки - PullRequest
0 голосов
/ 03 октября 2018

При импорте с помощью мастера MS Access все идет хорошо.Я указываю файлы XML и XSLT, которые создают две таблицы.Сохранение шагов импорта и попытка его выполнить не удаются.Вот пример XML и XSLT файлов соответственно.MS Access вводит ошибки в виде отдельной таблицы, используя в качестве ключа значения PWSID и VIOID.

    <?xml version="1.0"?>
    <Violations>
     <Violation>
      <ViolationDetail>
       <PWSID>TX9999999</PWSID>
       <VIOID>123456789</VIOID>
       <DATAORIGINCODE>S</DATAORIGINCODE>
       <CCODE>7500</CCODE>
       <VCODE>75</VCODE>
       <BEGINDATE>2015-04-28</BEGINDATE>
       <Errors>
          <Error>
            <ErrorDescription>
                Error description here
            </ErrorDescription>
            <ErrorCode>ERR0037</ErrorCode>
            </Error>
       </Errors>
      </ViolationDetail>
     </Violation>
     <Violation>
      <ViolationDetail>
       <PWSID>TX9999999</PWSID>
       <VIOID>234567890</VIOID>
       <DATAORIGINCODE>S</DATAORIGINCODE>
       <CCODE>7500</CCODE>
       <VCODE>71</VCODE>
       <BEGINDATE>2015-05-15</BEGINDATE>
       <Errors>
          <Error>
            <ErrorDescription>
                Error description here
            </ErrorDescription>
            <ErrorCode>ERR0048</ErrorCode>
            </Error>
       </Errors>
      </ViolationDetail>
     </Violation>
    </Violations>

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes"/>
        <xsl:strip-space elements="*"/>

        <xsl:template match="/">
            <dataroot>
                <xsl:apply-templates select="@*|node()"/>
            </dataroot>
        </xsl:template>

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

        <xsl:template match="ERRORS">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:template>

        <xsl:template match="ERROR">
            <ERROR>
                <PWSID><xsl:value-of select="../../PWSID"/></PWSID>
                <xsl:apply-templates select="@*|node()"/>
                <VIOID><xsl:value-of select="../../VIOID"/></VIOID>
                <xsl:apply-templates select="@*|node()"/>
            </ERROR>
        </xsl:template>

    </xsl:stylesheet>

Моя попытка использовать код VBA - это то, что я изменил из решения, найденного во время поиска:

Public Sub importErrorFiles()
    ' REFERENCE MS XML, v6.0
    Dim xmlDoc As New MSXML2.DOMDocument60
    Dim xslDoc As New MSXML2.DOMDocument60
    Dim newDoc As New MSXML2.DOMDocument60

    Dim strFileXML As String, strFileXSL As String
    Dim strPathXML As String, strPathXSL As String

    strPathXSL = CurrentProject.Path & "\xslSheets\"
    strPathXML = CurrentProject.Path & "\workingReports\"
    strFileXML = Dir(strPathXML & "*.xml")

    While strFileXML <> ""
        ' REINITIALIZE DOM OBJECTS
        Set xslDoc = New MSXML2.DOMDocument60
        Set xmlDoc = New MSXML2.DOMDocument60
        Set newDoc = New MSXML2.DOMDocument60

        strFileXSL = strPathXSL & Replace(strFileXML, "xml", "xslt")

        If fileExists(strFileXSL) Then

            ' LOAD XML SOURCE
            xmlDoc.Load strPathXML & strFileXML

            ' LOAD XSL FILE
            xslDoc.Load strPathXSL & strFileXSL

            ' TRANSFORM SOURCE
            xmlDoc.transformNodeToObject xslDoc, newDoc
            newDoc.Save strPathXML & "temp.xml"

            ' APPEND TO TABLES
            Application.ImportXML strPathXML & "temp.xml", acAppendData
            strFile = Dir()
        End If
    Wend

   ' RELEASE DOM OBJECTS
    Set xmlDoc = Nothing: Set xslDoc = Nothing: Set newDoc = Nothing
End Sub

Ошибка в строке transformNodeToObject:

Таблица стилей не содержит элемент документа.Кажется, что таблица стилей пуста или не является правильно сформированным XML-документом.

Oh и fileExists - логическая функция, которая работает.Спасибо за любую помощь.

...