XML解析VBA Excel(函数trip,&MSXML2.DOMDocument)
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。所以,我更加困惑了。
这个问题的出现原因是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的行,然后出现错误。
所以谢谢。我想我必须尝试其他方法,比如读取纯文本并解析。我无法更改文件,因为其他程序也会读取它们。
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数据。