XML解析VBA excel(函数行,&MSXML2.DOMDocument)

2023-12-21

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

<?xml version="1.0" encoding="UTF-8"?>
  <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>

我在互联网上阅读了几篇文章和帖子,如下所示,但我无法想出解决方案:

  • Excel vba 解析复杂的 XML https://stackoverflow.com/questions/43948915/excel-vba-parse-complex-xml
  • 使用 VBA 解析 XML 文件 https://stackoverflow.com/questions/11506651/parse-xml-file-with-vba

到目前为止我正在做:

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 "how many Queries " &  Queries.Length

For Each Query In Queries
    ThisWorkbook.Sheets(3).Cells(i, 1) = "Works"
    ThisWorkbook.Sheets(3).Cells(i, 2) = Query.SelectNodes("Query").iTem(0).Text
    i = i + 1
Next

这段代码似乎可以被VBA理解,但它不读取内容。循环不会被读取,这意味着(我猜)查询根本没有循环。事实证实了这一点Msgbox "how many 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,因为概念有三个孩子,即概念模型、过滤器 and Queries。所以,我更加疑惑了。


尽可能接近你的OP

我提请您注意几个错误或误解:

  • [1]无效的.LoadXML Syntax

那么 .LoadXML ("C:\folder\folder\name.xml") 和 .Load ("C:\folder\folder\name.xml") 之间有什么区别?

Load期望一个文件路径然后将文件内容加载到oXML对象中。

LoadXML不需要文件参数,但它是实际的XML 文本内容那必须是一个结构良好的字符串。

  • [2]XML 区分大小写,因此节点需要通过其确切的文字名称来寻址: 这<Query>节点不会被识别"query", 《概念模型》不等于“概念模型”.

作为第二个问题我想问一下 Dim oXml As MSXML2.DOMDocument 会是一样的 Dim oXml As MSXML2.DOMDocument60, 自从我签入工具/参考文献“Microsoft XML,v6.0”以来?

不,不是。 - 请注意,之前的声明将默认加载 3.0 版本。 然而,绝对最好使用 6.0 版本(如今任何其他版本都已过时!)

当你使用所谓的早期绑定(参考“Microsoft XML,v6.0”),我将执行相同的操作,但指的是当前版本 6.0:

Dim oXml As MSXML2.DOMDocument60        ' declare the xml doc object
Set oXml = New MSXML2.DOMDocument60     ' set an instance of it to memory
  • [3]误解一些 XPath 表达式

中的起始斜杠“/”XPath 表达式始终引用 DocumentElement (<Concepts>这里), 你可以加.DocumentElement改为您的文档对象。起始双斜杠“//xyz”将找到任何“xyz”节点(如果存在)。

例如

    oXml.SelectNodes("//Query").Length 

返回与以下相同的 childNodes 编号(此处:3)

    oXml.DocumentElement.SelectNodes("//Query").Length   ' or 
    oXml.SelectSingleNode("//Queries").ChildNodes.Length ' or even       
    oXml.SelectNodes("/*/*/*/Query").Length`.

参考 XML 版本 6.0 的代码示例

当然,您必须循环访问多个 xml 文件,该示例仅使用一个(从第 2 行开始)。

只是针对不存在的情况格式良好的 xml 文件我添加了详细的错误例程这使您能够识别假定的错误位置。Load and LoadXML两者都返回一个布尔值(如果加载正确则返回 True,否则返回 False)。

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"   ' necessary in version 3.0, possibly redundant here
    .async = False

    If Not .Load(ThisWorkbook.Path & "\xml\" & "name.xml") Then
        Dim xPE        As Object    ' Set xPE = CreateObject("MSXML2.IXMLDOMParseError")
        Dim strErrText As String
        Set xPE = .parseError
        With xPE
           strErrText = "Load error " & .ErrorCode & " xml file " & vbCrLf & _
           Replace(.URL, "file:///", "") & vbCrLf & vbCrLf & _
          xPE.reason & _
          "Source Text: " & .srcText & vbCrLf & vbCrLf & _
          "Line No.:    " & .Line & vbCrLf & _
          "Line Pos.: " & .linepos & vbCrLf & _
          "File Pos.:  " & .filepos & vbCrLf & vbCrLf
        End With
        MsgBox strErrText, vbExclamation
        Set xPE = Nothing
        Exit Sub
    End If

    ' Debug.Print "|" & oXml.XML & "|"

    Dim Queries  As IXMLDOMNodeList, Query As IXMLDOMNode
    Dim Searched As String
    Dim i&, ii&
    i = 2       ' start row
  ' start XPath  
    Searched = "ConceptModel/Queries/Query"                     ' search string
    Set Queries = oXml.DocumentElement.SelectNodes(Searched)    ' XPath
  ' 
    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

附加提示

您可能还对如何列出的示例感兴趣所有子节点通过 XMLDOM 并使用 VBA 从 XML 获取属性名称 https://stackoverflow.com/questions/51887820/obtain-attribute-names-from-xml-using-vba/51919182#51919182.

由于后来的评论,我添加了进一步的提示(感谢@barrowc)

“使用 MSXML v3.0 的另一个问题是默认选择语言是 XSLPatterns 而不是 XPath。 有关 MSXML 版本之间的一些差异的详细信息,请参见here https://blogs.msdn.microsoft.com/xmlteam/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer/并讨论了两种选择语言之间的差异here https://stackoverflow.com/q/2099880/2127508."

在当前的 MSXML2 版本 6.0 中,完全支持 XPath 1.0。所以它看起来XSL 模式微软早期已经实现了,基本上可以看作是W3C标准化XPath之前XPath表达式的简化子集。

MSXML2 版本 3.0 至少允许通过显式选择语言设置来集成 XPath 1.0:

oXML.setProperty "SelectionLanguage", "XPath"   ' oXML being the DOMDocument object as used in original post  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XML解析VBA excel(函数行,&MSXML2.DOMDocument) 的相关文章

  • excel 2010刷新BackgroundQuery中运行时错误1004

    我正在尝试用 vba 编写一个脚本 用于将多个文本文件导入 Excel 一张纸 然后将它们绘制在一张图表上 我面临一个问题刷新后台查询命令并出现 1004 运行时错误 我怎样才能解决它 谢谢 埃亚勒 这是我的代码 Sub fring1 Di
  • php simpleXMLElement 到数组:空值

    我有以下 XML
  • 获取 Wi-Fi 配置文件信息

    我使用的是 Windows 8 1 它没有工具 带有 GUI 来管理 wifi 网络配置文件 所以我正在写一篇对我有帮助的文章 我做了一些谷歌搜索并发现托管 Wifi API https managedwifi codeplex com 并
  • 在 Python 中按标题将 docx 拆分为单独的文件

    我想编写一个程序来获取我的 docx 文件 迭代它们并根据标题将每个文件拆分为多个单独的文件 每个 docx 中都有几篇文章 每篇文章都有一个 标题 1 及其下方的文本 因此 如果我的原始 file1 docx 有 4 篇文章 我希望将其分
  • VBA Shell 并等待退出代码

    我正在打包一个办公应用程序 VBA 它调用 C 控制台应用程序来执行应用程序 大型模拟程序 的一些繁重工作 我希望能够让 VBA 应用程序等待控制台应用程序完成并从控制台应用程序检索退出代码 我已经能够做到前者 但尚未能够从应用程序中检索退
  • Linq to XML - 更新/更改 XML 文档的节点

    我有 2 个问题 1 我已经开始使用 Linq to XML 我想知道是否可以通过 Linq 更改 XML 文档 我的意思是 有没有类似的东西 XDocument xmlDoc XDocument Load sample xml updat
  • 合并和颜色样式不适用于 Apache POI excel 2003 格式

    在 Apache POI 中 我为某些单元格应用了一些样式并合并了这些单元格 当我在 2010 年或 2007 年打开时 它工作正常 但在 2003 年 格式样式消失了 每次保存 2003 Excel 文件之前都会弹出兼容性检查对话框 请参
  • Office excel将CORS请求作为跨域请求

    我正在尝试从我的 Excel 插件发出跨域请求 正如这里所建议的 http dev office com docs add ins develop addressing same origin policy limitations http
  • 导出到excel时如何显示前导零?

    我正在通过更改内容类型来创建 Excel 报告 Response ContentType application vnd ms excel 我有包含前导零的值 问题是导出到 Excel 时缺少前导零 e g 000123 gt 123 我知
  • 在合并的单元格中选择、插入照片并将其居中

    我是一名研发面包师 正在为我的团队制作食谱模板 模板中有照片 但我需要轻松地允许他们单击一个按钮 打开照片的文件选择器 然后将该照片放在合并的单元格中 我其实不太擅长做这个 Sub InsertPhotoMacro Dim photoNam
  • 在以下情况下强制 EditText 失去焦点:按下某些键盘按键以及当用户单击活动中的其他内容时

    我知道这个问题之前已经以多种不同的方式提出过 但即使我已经查看了许多有关 EditText 焦点的其他相关问题 我还没有找到我的解决方案 这是我想要实现的目标 当用户完成编辑 EditText 后 我 希望它失去焦点 当用户点击 EditT
  • VBA 有没有办法了解未使用的变量?

    标准 VBA 编辑器中是否有工具 方法或设置来警告已被修改的变量Dim med 但没有被使用 MZ Tools http www mztools com index aspx将搜索您的代码并告诉您哪些内容未被使用 VBA的版本可以找到her
  • 在 C# 中遍历 ANTLR AST 的教程?

    有人知道在 C 中遍历 ANTLR 生成的 AST 的教程吗 我能找到的最接近的是this https web archive org web 20201019210638 http www manuelabadia com blog Pe
  • JasperReports 中每个工作表属性一页

    我有一个要求 我必须在 JasperReports 中设计一个报告 该报告有 4 页 第一张纸有 5 页 类似的其他纸有一页或两页 我面临的问题是 如果我使用net sf jasperreports export xls one page
  • 我可以获取VBA代码中的注释文本吗

    可以说我有以下内容 Public Sub Information TEST End Sub 有没有办法得到 TEST 结果 不知何故通过VBA 例如 在 PHP 中 有一个获取注释的好方法 这里有什么想法吗 编辑 应该有办法 因为像 MZ
  • 如何将 XML 文档嵌入到 XHTML 文档中?

    例如 我如何嵌入
  • Excel 数字缩写格式

    这是我想要完成的任务 Value Display 1 1 11 11 111 111 1111 1 11k 11111 11 11k 111111 111 11k 1111111 1 11M 11111111 11 11M 11111111
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • 我如何以更好的方式编码而不是像这样的VBA编码

    我正在 Excel 中创建一个仪表板 但是我想知道是否有比这更好的编码方式 我想对其进行模块化 而不是这样做以使其更加整洁 Private Sub Afford If af Value True Then af afr Value Shee
  • XSD 嵌套元素

随机推荐

  • Predict.gbm() 2.1.4 与 2.1.3 的预测不一致

    这个问题和我之前的帖子有关here https stackoverflow com questions 52702984 inconsistent predictions from gbm predict 我已经找到了这个问题 它似乎与我使
  • 在构建应用程序的发布版本时,我应该保留 android.support.v4.app.Fragment 及其派生类吗?

    我读了这个answer https stackoverflow com a 13822079 1065835并理解为什么我应该保留我的服务 活动和自定义视图的名称 但是我应该保留从 android support v4 app Fragme
  • 在 myBatis 中传递多列

    我想知道 我们如何在 myBatis 关联标签中传递多个列 例如 我的 mapper xml 文件中有以下 xml 片段
  • 广度优先搜索方式的一般树遍历(无限)

    我有一个树结构 其中每个节点有 5 个子节点 不允许超过此数量 我希望以广度优先搜索的方式遍历这棵树 现在我希望使用广度优先搜索方式从选定的父节点计算空节点 e g 如果给定的父节点为 1 则函数必须返回节点 4 因为它有可用位置 如果给定
  • R中基于交替字符的分割字符串

    我正在尝试找出一种有效的方法来分割字符串 例如 111110000011110000111000 变成一个向量 1 11111 00000 1111 0000 111 000 其中 0 和 1 可以是任意交替字符 Try strsplit
  • 如何协调抽屉式导航与底部导航视图

    我对 Android 开发还很陌生 我正在检查材料设计库 并实现了一个带有底部导航的导航抽屉 可以轻松地浏览片段 这两个组件都工作得很好 但我不知道如何协调这两个组件的导航 例如 当在导航抽屉上切换片段时 它会更改布局 但按钮导航所选项目不
  • 加载页面后导航栏活动选项不会保持活动状态

    我的代码中有一个导航栏 它位于 ejs 文件名 nav ejs 中
  • Powershell获取Windows中显示的区分大小写的路径

    我正在寻找一种方法来获取本地路径 其中包括名称中使用的任何驼峰式大小写 主要原因是我可以使用相同的路径在 Windows wsl 中进行调用 例如 在 Windows 中我可以将文件称为 c FoO bar txt c Foo Bar tx
  • 如何将配对列表添加到自动模式列表中?

    我有一长串文件和文件扩展名 我希望 Emacs 在 ruby 模式下自动打开它们 从使用谷歌来看 最基本的解决方案是这样的 setq auto mode alist cons rake ruby mode auto mode alist s
  • 填充 WCF 中的 PrimaryIdentity

    我使用简单的 HTTP 标头将令牌传递给 WCF 服务进行身份验证 WCF 服务需要使用 basicHTTPBinding 因此遗憾的是我无法使用固定的 ws security 实现 我想填充 PrimaryIdentity 对象 以便 W
  • 相当于字节数组的 StringBuilder

    这是一个简单的问题 我认为应该已经得到解答 我确实尝试在这里找到答案 但没有找到任何答案 所以如果我错过了什么 我深表歉意 不管怎样 除了字节数组之外 是否有 StringBuilder 的等价物 我不关心所有不同的超载Append 但我想
  • 从 eclipse 创建 JAR 时如何在清单文件中设置类路径?

    I am trying to creat JAR file through eclipse I read some of the threads from stackoverflow 以及其他论坛 但没有任何帮助 我创建了一个像这样的单独的
  • React.js 将文本渲染为 HTML

    这就是渲染代码现在的样子 我知道这样做是不安全的 render function return div p p div 问题是如何安全地渲染它 参考https facebook github io react docs dom elemen
  • 将变量名传递给 R 中的函数

    我注意到很多包允许您传递符号名称 这些名称在调用函数的上下文中甚至可能无效 我想知道它是如何工作的以及如何在我自己的代码中使用它 这是 ggplot2 的示例 a lt data frame x 1 10 y 1 10 library gg
  • 如何使用spring集成在TCP连接上实现保活连接?

    我有一个使用 spring 集成 TCP 构建的 TCP 客户端 服务器支持保持活动消息 ping pong 风格 连接是使用配置的CachingClientConnectionFactory我想利用这个服务器功能 这是我的 bean 配置
  • 如何在 scandir() php 中添加分页 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在我的 scandir php 代码中添加分页 请帮助我如何在我的 php 代码中添加分页 这是我的代码
  • 带输出的冒泡排序

    所以我对其进行了一些编辑 并且几乎得到了我想要的结果 我现在遇到的唯一问题是我得到了一行我不想要的输出 我觉得这里的修复很简单 但我的大脑现在很混乱 static void bubbleSort int myArray int n myAr
  • 使用 Mantle 将 JSON 数组中的 NSString 转换为 NSURL

    假设给我的是以下 JSON 响应 images http domain com image1 jpg http domain com image2 jpg http domain com image3 jpg 使用 Mantle 我想解析这
  • 如何将图像与boost gil结合?

    我刚刚熟悉 Boost GIL 以及一般的图像处理 并怀疑这很简单 但我还没有找到相关文档 我有一组图像视图 我想将它们与任意函数结合起来 为简单起见 假设图像已对齐 相同大小和定位器类型 我只想将像素值添加在一起 一种方法是从 zip i
  • XML解析VBA excel(函数行,&MSXML2.DOMDocument)

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