【问题标题】:Import XML data using Excel VBA使用 Excel VBA 导入 XML 数据
【发布时间】:2021-02-12 18:19:52
【问题描述】:

我正在尝试将特定数据从 XML 文件导入 Excel 工作表。

我使用的代码是这样的。

Dim oXMLFile As New DOMDocument60
Dim books As IXMLDOMNodeList
Dim results() As String
Dim i As Integer, booksUBound As Integer
Dim book As IXMLDOMNode, title As IXMLDOMNode, author As IXMLDOMNode

oXMLFile.Load "C:\example.xml"

Set books = oXMLFile.SelectNodes("/OUT_MESSAGE/LINES/OUT_MESSAGE_LINE")
booksUBound = books.Length - 1

ReDim results(booksUBound, 1)

For i = 0 To booksUBound
    Set book = books(i) 
    Set title = book.SelectSingleNode("C00")
    If Not title Is Nothing Then results(i, 0) = title.Text
Next

Dim wks As Worksheet
Set wks = ActiveSheet
wks.Range(wks.Cells(1, 1), wks.Cells(books.Length, 2)) = results

这适用于这个 XML

<?xml version="1.0" encoding="UTF-8"?>
<OUT_MESSAGE>
 <LINES>
  <OUT_MESSAGE_LINE>
   <C00>1231231</C00>
   <C01>3213213</C01>
  </OUT_MESSAGE_LINE>
  <OUT_MESSAGE_LINE>
   <C00>1231234</C00>
   <C01>3213214</C01>
  </OUT_MESSAGE_LINE>
 </LINES>
</OUT_MESSAGE>

我的问题是我的 XML 文件看起来像这样。

<?xml version="1.0" encoding="UTF-8"?>
<OUT_MESSAGE xmlns="urn:randomaddress-com:schema:test_out_message" xmlns:xsi="http://www.randomurl.com/123">
 <LINES>
  <OUT_MESSAGE_LINE>
   <C00>1231231</C00>
   <C01>3213213</C01>
  </OUT_MESSAGE_LINE>
  <OUT_MESSAGE_LINE>
   <C00>1231234</C00>
   <C01>3213214</C01>
  </OUT_MESSAGE_LINE>
 </LINES>
</OUT_MESSAGE>

我原本以为我可以通过替换来开始工作

Set books = oXMLFile.SelectNodes("/OUT_MESSAGE/LINES/OUT_MESSAGE_LINE")

Set books = oXMLFile.SelectNodes("/OUT_MESSAGE xmlns='urn:randomaddress-com:schema:test_out_message' xmlns:xsi='http://www.randomurl.com/123'/LINES/OUT_MESSAGE_LINE")

但这会给我一个运行时错误。

如果有人知道我必须对原始代码进行哪些更改,将不胜感激。

【问题讨论】:

  • 做什么工作?你想做什么?从标签中获取文本?
  • 您需要显示更多实际的 XML - 我们无法从单个开始标记告诉您任何内容。但是,看起来您正在处理“命名空间”,因此您需要让oXMLFile 知道这些 - 它不会自动发生。例如见stackoverflow.com/questions/64901392/…
  • @TimWilliams 我添加了我的 XML 与另一个的比较。其他帖子看起来可以,我正在尝试。
  • 如果您可以发布您的实际 XML 示例,这将更加有用 - 如果您不熟悉 XML,那么我们无法确信您的“书”示例反映了您的真实情况结构体。如果内容是机密的,那么只需对其进行混淆,但保留结构。此外,如果您可以发布您尝试过的代码,而不是上一篇文章中的代码,那也会有所帮助。
  • @TimWilliams,我更新了我的示例 XML 并对我所做的代码进行了更改,它基本上只是 SelectNodes 部分和要查找的标签名称

标签: excel xml vba msxml


【解决方案1】:

这对我有用:

Dim xDoc, nodes, oNode

Set xDoc = CreateObject("MSXML2.DOMDocument.6.0")

'Note: added an `x=` to the default namespace so we can reference it later
xDoc.setProperty "SelectionNamespaces", _
                 "xmlns:x='urn.randomaddress.com.schema.test_out_message'"

xDoc.LoadXML Sheet2.Range("A4").Value 'load XML from sheet

'use the "x" prefix we added above
Set nodes = xDoc.SelectNodes("/x:OUT_MESSAGE/x:LINES/x:OUT_MESSAGE_LINE")
Debug.Print nodes.Length  '  = 1

For Each oNode In nodes
    Debug.Print oNode.SelectSingleNode("x:C00").nodeTypedValue
    Debug.Print oNode.SelectSingleNode("x:OBJSTATE").nodeTypedValue
    'etc
Next oNode

使用这个 XML:

<?xml version="1.0"?>
<OUT_MESSAGE xmlns="urn.randomaddress.com.schema.test_out_message" 
xmlns:xsi="http://www.randomurl.com/123">
 <LINES>
  <OUT_MESSAGE_LINE>
   <C00>321312</C00>
   <C01>12312312</C01>
   <OBJSTATE>Posted</OBJSTATE>
   <OBJEVENTS>Accept^Reject^</OBJEVENTS>
   <STATE>Posted</STATE>
  </OUT_MESSAGE_LINE>
 </LINES>
</OUT_MESSAGE>

【讨论】:

  • 我如何从你的结果中导出结果?
  • 您将编写代码将结果放入单元格中,而不是使用 Debug.Print,或者在您发布的代码中使用数组方法。
  • 当我将原始代码中的数组方法添加到您的代码中并进行必要的更改时,它不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多