XML解析VBA Excel(函数trip,&MSXML2.DOMDocument)

7 浏览
0 Comments

XML解析VBA Excel(函数trip,&MSXML2.DOMDocument)

我需要解析数百个具有相同结构的XML文件,如下所示:


  
    
      
        
      
      
        (cheese, bread, wine)
        (Käse, Brot, Wein)
        (fromaige, pain, vin)
      
    
  

我已经阅读了一些互联网上的文章和帖子,如下所示,但我无法找到解决方案:

到目前为止,我正在做以下工作:

Dim oXml As MSXML2.DOMDocument
Set oXml = New MSXML2.DOMDocument
oXml.LoadXML ("C:\folder\folder\name.xml")
Dim Queries As IXMLDOMNodeList
Dim Query As IXMLDOMNode
ThisWorkbook.Sheets(3).Cells(i, 1) = "before loop"
Set Queries = oXml.SelectNodes("/concepts/Queries")
MsgBox "有多少个Queries " &  Queries.Length
For Each Query In Queries
    ThisWorkbook.Sheets(3).Cells(i, 1) = "Work"
    ThisWorkbook.Sheets(3).Cells(i, 2) = Query.SelectNodes("Query").iTem(0).Text
    i = i + 1
Next

这段代码似乎被VBA理解,但它没有读取内容。循环没有被读取,这意味着(我猜)Queries根本没有被循环。这通过Msgbox "有多少个Queries"返回0来确认。但实际上有三个查询。有人能帮我一下吗?

作为第二个问题,我想问一下

 Dim oXml As MSXML2.DOMDocument

 Dim oXml As MSXML2.DOMDocument60

是否相同。由于我在工具/引用中检查了"Microsoft XML,v6.0"

我认为具有标签的查询可能会引起问题。我添加了以下几行:

Dim childs As IXMLDOMNodeList
Set childs = oXml.SelectNodes("/concepts")
MsgBox "childs " & childs.Length

这也返回0。我预期应该是3,因为concepts有三个子节点,分别是ConceptModel、Filter和Queries。所以,我更加困惑了。

0
0 Comments

这个问题的出现原因是XML文件中包含特殊字符(德语字母),需要对XML文件进行批量替换,将打开行改为:

<?xml version="1.0" encoding="iso-8859-1" ?>

而不是:

<?xml version="1.0" encoding="UTF-8"?>

解决方法是将XML文件的开头行进行替换,使用以下代码进行测试:

Option Explicit
Public Sub test()
    Dim xmlDoc As Object
    Set xmlDoc = CreateObject("MSXML2.DOMDocument") 'New MSXML2.DOMDocument60
    With xmlDoc
        .validateOnParse = True
        .setProperty "SelectionLanguage", "XPath"
        .async = False
        If Not .Load("C:\Users\User\Desktop\Test.xml") Then
            Err.Raise .parseError.ErrorCode, , .parseError.reason
        End If
    End With
    Debug.Print xmlDoc.SelectNodes("//Query").Length
End Sub

以下是使用的XML示例:

<?xml version="1.0" encoding="iso-8859-1" ?>
  <Concepts>
      <ConceptModel name="food">
    <Filters>
      <Filter type="CC"/>
    </Filters>
    <Queries>
      <Query lang="EN">(cheese, bread, wine)</Query>
      <Query lang="DE">(Käse, Brot, Wein)</Query>
      <Query lang="FR">(fromaige, pain, vin)</Query>
   </Queries>
  </ConceptModel>
</Concepts>

但这意味着如果没有 "ü"、"ä" 或其他这样的字符,它应该工作。但事实并非如此。不幸的是,我无法影响文件本身的内容,我只能读取数据。

我不太确定,但我可以向您保证,通过以上更改可以解决问题。可能还有其他方法可以实现相同的效果,比如先使用其他方法进行读取,然后再解析为XML文档。

为了让我理解,我进行了以下操作。我在文本编辑器中打开XML文件,并像您说的那样将开头改为:<?xml version="1.0" encoding="iso-8859-1" ?>,保存后再次运行我的代码。结果相同。这就是您的意思吗?

我尝试了另一种方法:我从文本编辑器中保存一个不包含任何编码头的XML文件,并将其保存为XML扩展名的文本文件(不包含德语特殊字符)。也没有奏效。

现在我明白了。您的方法有效。不仅如此,我将初始行更改为包含UFT的行,然后出现错误。

所以谢谢。我想我必须尝试其他方法,比如读取纯文本并解析。我无法更改文件,因为其他程序也会读取它们。

0
0 Comments

XML解析在VBA中使用MSXML2.DOMDocument对象进行。然而,在使用该对象时,可能会遇到一些错误或误解。以下是这些错误或误解的原因和解决方法:

1. 错误的.LoadXML语法:

.LoadXML方法期望传入的是XML文本内容,而不是文件路径。因此,不能将文件路径作为参数传递给.LoadXML方法。正确的做法是将XML文本作为参数传递给.LoadXML方法。

2. XML区分大小写:

XML对节点名称区分大小写,因此必须准确地使用节点的名称。例如,使用"query"无法识别<Query>节点,"ConceptModel"与"conceptmodel"也不相同。

3. XPath表达式的误解:

XPath表达式中的斜杠“/”始终指向根节点(在这里是<Concepts>),可以通过将.DocumentElement添加到文档对象中来代替斜杠“/”。双斜杠“//xyz”表示查找任何“xyz”节点。因此,可以使用oXml.DocumentElement.SelectNodes("//Query")来获取与oXml.SelectNodes("//Query")相同的子节点数量。

根据上述问题和解决方法,以下是使用XML解析的VBA代码示例:

Sub xmlTest()
    Dim ws As Worksheet: Set ws = ThisWorkbook.Sheets(3)
    Dim oXml As MSXML2.DOMDocument60
    Set oXml = New MSXML2.DOMDocument60
    
    With oXml
        .validateOnParse = True
        .setProperty "SelectionLanguage", "XPath"
        .async = False
        
        If Not .Load(ThisWorkbook.Path & "\xml\" & "name.xml") Then
            ' 错误处理代码
            Exit Sub
        End If
        
        Dim Queries As IXMLDOMNodeList, Query As IXMLDOMNode
        Dim Searched As String
        Dim i As Integer, ii As Integer
        i = 2
        
        Searched = "ConceptModel/Queries/Query"
        Set Queries = oXml.DocumentElement.SelectNodes(Searched)
        
        ws.Cells(i, 1) = IIf(Queries.Length = 0, "No items", Queries.Length & " items")
        ii = 1
        
        For Each Query In Queries
            ii = ii + 1
            ws.Cells(i, ii) = Query.Text
        Next
    End With
End Sub

此外,如果使用的是MSXML2版本3.0,需要通过设置SelectionLanguage属性为XPath来使用XPath表达式。

以上就是XML解析在VBA中出现问题的原因及解决方法的整理。XML解析在VBA中是一个常见的任务,通过理解这些问题和解决方法,可以更好地处理XML数据。

0