我是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>
答案 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)
然后,在每个驱动程序数据块完成后,只需将其写到标准文本文件中即可。