Создать собственный XML из Access VBA - PullRequest
0 голосов
/ 07 января 2019

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

Поиск по часам всегда заканчивался тупиком. Какой будет лучший подход? ДОМ ?, ПРОСТОЙ ТЕКСТ? Любите, вы получаете направление здесь.

Большое спасибо заранее

Получатель хочет это в следующем формате:

<?xml version="1.0" encoding="UTF-8"?>
<REGDriverInformationData xsi:schemaLocation="http://www.Provider.fr/REGDriverInformation     REGDriverInformation.xsd " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.Provider.fr/REGDriverInformation">
<Header>
     <SequenceNo>1</SequenceNo>
     <RsNumber>123456</RsNumber>
</Header>
<REGDriverInformation>
     <LicensePlate>DE125665</LicensePlate>
  <Driver>
    <FirstName>Driver1_FirstName</FirstName>
    <LastName>Driver1_LastName</LastName>
    <BirthDate>1988-10-12</BirthDate>
    <Address>
       <Street>Driver1_Street</Street>
       <HouseNumber>Driver1_HouseNumber</HouseNumber>
       <PostalCode>Driver1_PostalCode</PostalCode>
       <City>Driver1_City</City>  
       <CountryCode>UK</CountryCode>
     </Address>
  <DrivingLicenseNumber>Driver1_DrivingLicenseNumber</DrivingLicenseNumber>
</Driver>
<Start>2014-05-01T00:00:00</Start>
<End>2018-04-30T00:00:00</End>
</REGDriverInformation>
</REGDriverInformationData>

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Как предполагается, вы хотите использовать файл MSXML. Ваша проблема в том, что у вас (к сожалению) есть пространства имен, и 99% базовых (и чистых) примеров VBA не включают пространство имен. В простой оболочке имен пространства имен являются причиной мировой бедности, дорогого программного обеспечения и общих страданий в индустрии программного обеспечения. Вы также не указываете, должны ли вы создавать отдельный xml-файл для каждой записи или хотите, чтобы данные были в одном выходном xml-файле. Следующий код демонстрирует изящный способ работы с пространством имен. Я также предполагаю, что вы помещаете одну запись доступа в один XML-файл, а затем записываете ее. Если вам нужно добавить «много» записей в один XML-файл, то мое использование xPath «//» не будет работать, и вам придется создать новый узел и использовать «/» для ссылок на xPath.

Однако есть МНОГИЕ примеры msxml, обычно они только начинаются. И, как уже отмечалось, к сожалению, подавляющее большинство из этих примеров не затрагивает проблему пространства имен с УЖАСНЫМИ, МАССИВНЫМИ, НЕНАСТНЫМИ и БОЛЬНЫМИ. Тем не менее, код будет выглядеть примерно так:

Sub xmlExport()

  Dim xml        As New MSXML2.DOMDocument60
  Dim xmldoc     As MSXML2.IXMLDOMNode

  Dim strTemplate   As String
  Dim strOutFile    As String

  strTemplate = "c:\test2\template.xml"

  If xml.Load(strTemplate) = False Then
     MsgBox "cannot open xml template"
  End If

  xml.SetProperty "SelectionLanguage", "XPath"
  xml.SetProperty "SelectionNamespaces", "xmlns:x='" & xml.namespaces(1) & "'"

  Dim rst        As DAO.Recordset
  Set rst = CurrentDb.OpenRecordset("SELECT * from tblDelivery where City = 'Edmonton'")

  Dim i As Integer

  Do While rst.EOF = False

     i = i + 1      ' sequence number
     xml.SelectSingleNode("//x:SequenceNo").Text = i
     xml.SelectSingleNode("//x:RsNumber").Text = rst!ResNumber
     xml.SelectSingleNode("//x:LicensePlate").Text = rst!License
     xml.SelectSingleNode("//x:FirstName").Text = rst!FirstName
     ' . etc . etc.

     strOutFile = "c:\outdata\xml" & i & ".xml"

     xml.Save (strOutFile)

     rst.MoveNext

  Loop

  rst.close
End Sub

Теперь, сказав выше, если у кого-нибудь есть хорошее решение для работы с xPath и пространством имен, я скажу «большое спасибо» и повторно отредактирую этот пост, чтобы убрать скандал о бедности в мире, боли и страданиях. xPath становится, когда задействованы пространства имен.

0 голосов
/ 07 января 2019

Эта проблема имеет очень простое решение, которое вообще не подразумевает участия в xml. В основном у вас есть повторяющаяся структура данных, текст которой помечен

<REGDriverInformationData xsi:schemaLocation="http://www.Provider.fr/REGDriverInformation     REGDriverInformation.xsd " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.Provider.fr/REGDriverInformation">

data


</REGDriverInformationData>

В этой части 'data' есть элементы

"<element>value</element>" 

, которые содержат данные, которые вы должны предоставить.

Создайте фиктивную часть данных, в которой данные примера были заменены непротиворечивым фиктивным текстом, чтобы вы получили

"<element>****</element>"

Затем вы заполняете каждый блок данных драйвера, используя последовательность строк, заменяющих

, например

driver_data = replace(driver_data,"<License>****", "<License>" & DriverDataTable!License)
driver_data= replace(driver_data, "<Driver_FirstName>****", "Driver_FirstName" & DriverDataTable!FirstName)

Затем, когда каждый блок данных драйвера завершен, просто запишите его в стандартный текстовый файл.

0 голосов
/ 07 января 2019

Есть несколько подходов, которые вы можете использовать, и лучше всего обсуждать их. Тем не менее, я бы предпочел использовать библиотеку объектов MSXML, если VBA является требованием, если нет, я бы выбрал C # для создания необходимых классов и сериализации.

1) Используйте библиотеку MSXML, вот хороший пример того, как создать документ XML с ее использованием. Создание XML с MSXML

2) Создание классов и сериализация с использованием внешней библиотеки vba, доступной для загрузки Сериализация с библиотекой vba

3) Создание с использованием простого текста - это может быть грязно и трудно поддерживать.

4) Если у вас есть выбор, отличный от VBA, я бы посмотрел на C # или VB.NET и создал необходимые классы (или легко сгенерировал их из XML), а затем сериализовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...