我正在尝试将XML文件加载到带有VBA中的MSXML2.DOMDocument对象的Excel电子表格中。
我有以下方法:
Sub NEWTestXML()
Dim xmlDoc As Object
Dim xmlNodeList As Object
Dim getFirstChild As Object
Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.async = False: xmlDoc.validateOnParse = False
xmlDoc.Load ("H:\Anders\BankStatements\LoadXML\CAMT\20170818_070648_DANSKEBANK_DECS_20170818070531_3.xml")
If xmlDoc.parseError.ErrorCode <> 0 Then
MsgBox "Error was " + xmlDoc.parseError.reason
End If
'Get Document Elements
Set xmlNodeList = xmlDoc.DocumentElement
'Get first child ( same as ChildNodes(0) )
Set getFirstChild = xmlNodeList.FirstChild
'Print first child XML
Debug.Print getFirstChild.XML
'Print first child Text
Debug.Print getFirstChild.Text
Set getFirstChild = Nothing
Set xmlNodeList = Nothing
Set xmlDoc = Nothing
End Sub
摘自Google发现的一个例子。
我从银行收到的文件包含一个NULL字符,这使我无法使用上述方法加载文件。
删除NULL值可以解决我遇到的问题。
他们看起来像这样:
我一直在尝试使用Access-databases和各种方法加载这些文件,但每次这些NULL值都变得更好。
我的问题是:
是否有任何用于删除这些NULL值的编程方法,在Notepad ++中显示? MSXML2中的参数或类似内容?
我之前创建了一个复制XML文件并删除最后一行的方法,但我想在当前的解决方案中避免这种情况。
答案 0 :(得分:1)
如果您有任何机会,请修复写入这些错误文件的过程。
在XML文件中,NULL字节是非法的,在UTF-8编码的文本文件中也不会自然发生,这意味着生成这些文件的东西......
这两件事都很糟糕,应该在生产者中修复,而不是在那些文件的消费者中修复。仔细检查那些为您提供详细检查文件的过程,并找出出错的地方。
如果这不是一个选项,它仍然可以使用辅助函数将文件加载为纯文本,如下所示:
Function LoadFile(path As String, charset As String) As String
Dim inputStream As New ADODB.Stream
inputStream.Type = adTypeText
inputStream.charset = charset
inputStream.Open
inputStream.LoadFromFile path
LoadFile = inputStream.ReadText
End Function
这利用了ReadText()
- 至少对于UTF-8 - 在它找到的第一个NULL字节处停止的事实,所以在你的情况下它会读取整个文件,不包括最后一个字节。
然后使用LoadXML()将该字符串解析为XML文档:
Sub NEWTestXML()
Dim xmlDoc As New MSXML2.DOMDocument
Dim xmlNodeList As MSXML2.IXMLDOMNodeList
Dim docElem As MSXML2.IXMLDOMElement
Dim filePath As String
xmlDoc.async = False
xmlDoc.validateOnParse = False
filePath = "H:\Anders\BankStatements\LoadXML\CAMT\20170818_070648_DANSKEBANK_DECS_20170818070531_3.xml"
xmlDoc.LoadXML LoadFile(filePath, "UTF-8")
If xmlDoc.parseError.ErrorCode <> 0 Then
Debug.Print "Error: " + xmlDoc.parseError.reason
Exit Sub
End If
Set docElem = xmlDoc.DocumentElement
Debug.Print docElem.FirstChild.XML
Debug.Print docElem.FirstChild.Text
End Sub
此方法存在一个缺点:为了正确读取字符串,您需要预先知道文件编码,这正是XML旨在避免的问题。
换句话说,如果某个XML文件不是UTF-8编码的,而是使用其他完全合法的编码,那么上述方法就会失败,因为它会对文件编码做出盲目的假设。当然,这不是你想要长期使用的东西。
以上要求您向VBA项目添加两个引用