处理XML文件上的NULL值

时间:2017-08-22 13:23:35

标签: xml vba xpath null notepad++

我正在尝试将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值可以解决我遇到的问题。

他们看起来像这样:

XML-file example - NULL-value

我一直在尝试使用Access-databases和各种方法加载这些文件,但每次这些NULL值都变得更好。

我的问题是:

是否有任何用于删除这些NULL值的编程方法,在Notepad ++中显示? MSXML2中的参数或类似内容?

我之前创建了一个复制XML文件并删除最后一行的方法,但我想在当前的解决方案中避免这种情况。

1 个答案:

答案 0 :(得分:1)

如果您有任何机会,请修复写入这些错误文件的过程。

在XML文件中,NULL字节是非法的,在UTF-8编码的文本文件中也不会自然发生,这意味着生成这些文件的东西......

  • ...要么没有理智的UTF-8或XML概念,要么
  • 无理由地将NULL字节写入文件

这两件事都很糟糕,应该在生产者中修复,而不是在那些文件的消费者中修复。仔细检查那些为您提供详细检查文件的过程,并找出出错的地方。

如果这不是一个选项,它仍然可以使用辅助函数将文件加载为纯文本,如下所示:

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项目添加两个引用

  • 最新版本的“Microsoft ActiveX数据对象”库
  • 最新版本的“Microsoft XML”库