从Access VBA创建自定义XML

时间:2019-01-07 00:42:54

标签: xml vba ms-access

我是XML的新手,但是我在VBA访问方面有很好的经验。 我们需要创建一个XML文件来每天隔夜发送大约1500辆汽车的实际驾驶员信息

搜索小时数总是以死胡同结束。 最好的方法是什么? DOM ?,纯文本?爱你在这里得到一些指导。

非常感谢

接收方希望采用以下格式:

<?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 :(得分:1)

您可以采取几种方法,最好的方法是辩论。也就是说,如果需要VBA,我会选择使用MSXML对象库;如果不是,我会选择C#创建必要的类并进行序列化。

1)使用MSXML库,这是一个如何使用它创建XML文档的好例子。 Creating XML with MSXML

2)使用可下载的Serialize with vba library

外部vba库创建类并进行序列化

3)使用纯文本创建-这可能很杂乱且难以维护。

4)如果您选择的不是VBA,我将看C#或VB.NET并创建所需的类(或轻松地从XML生成它们)然后进行序列化。

答案 1 :(得分:1)

根据建议,您要使用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变为。

答案 2 :(得分:1)

这个问题有一个非常简单的解决方案,它根本不涉及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>

在“数据”部分中,您拥有元素

"<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)

然后,在每个驱动程序数据块完成后,只需将其写到标准文本文件中即可。