将XML文档中的数据解析为Excel工作表 [英] Parse Data in XML Document to Excel Worksheet

查看:144
本文介绍了将XML文档中的数据解析为Excel工作表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

<?xml version="1.0" encoding="UTF-8"?>
<xa:MeContext id="ABCe0552553">
  <xa:Data id="ABCe05525531" />
  <xa:Data id="1" />
  <CustID>Cust1234</CustID>
  <Name>Smith</Name>
  <City>New York</City>
  <Orders>
    <order Orderid="101">
      <Product>MP3 Player</Product>
    </order>
    <order Orderid="102">
      <Product>Radio</Product>
    </order>
  </Orders>
</xa:MeContext>

这个格式良好的XML文档使用MS VBA代码提供给Excel 2007。我使用 DOMDocument IXMLDOMElement 导入名称,城市和产品成功
。 >
但是, xa:MeContext id vsData1 id VsData2 id CustID order Orderid 号不会导出到Excel工作表。

This well formed XML document feeds to Excel 2007 using MS VBA code. I was successful with using DOMDocument and IXMLDOMElement to import the Name, City, and Product.
However, the xa:MeContext id, vsData1 id, VsData2 id, CustID, and order Orderid number won't export to Excel sheet.

每个Excel行都有以下标题,数据从XML文档填充:

Each Excel row has the following headers with data filled from XML document:

MeContextID--vsData1--VsData2--CustID--Name--City--OrderID--Product--OrderID--Product


推荐答案

以下是输出所需字段的两种方法。请注意,您发布的XML不包含命名空间xa:的标题定义,因此不是完全形成的XML。我在示例中删除了它们,所以MSXML2.DOMDocument不会抛出一个解析错误。

Below are two methods to output the fields you need. Note, that the XML you have posted does not contain the header definitions for namespace "xa:" so is not fully formed XML. I've removed them in the example so MSXML2.DOMDocument doesn't throw a parse error.

Option Explicit
Sub XMLMethod()
Dim XMLString As String
Dim XMLDoc As Object
Dim boolValue As Boolean
Dim xmlDocEl As Object
Dim xMeContext As Object
Dim xChild As Object
Dim xorder As Object


    XMLString = Sheet1.Range("A1").Value

    'Remove xa: in this example
    'reason : "Reference to undeclared namespace prefix: 'xa'."
    'Shouldn't need to do this if full XML is well formed containing correct namespace
    XMLString = Replace(XMLString, "xa:", vbNullString)

    Set XMLDoc = CreateObject("MSXML2.DOMDocument")
    'XMLDoc.setProperty "SelectionNamespaces", "xa:"

        'XMLDoc.Load = "C:\Users\ooo\Desktop\test.xml" 'load from file
    boolValue = XMLDoc.LoadXML(XMLString)  'load from string

    Set xmlDocEl = XMLDoc.DocumentElement
    Set xMeContext = xmlDocEl.SelectSingleNode("//MeContext")
        Debug.Print Split(xMeContext.XML, """")(1)
    For Each xChild In xmlDocEl.ChildNodes

        If xChild.NodeName = "Orders" Then
            For Each xorder In xChild.ChildNodes
                Debug.Print Split(xorder.XML, """")(1)
                Debug.Print xorder.Text
            Next xorder

        ElseIf xChild.Text = "" Then
            Debug.Print Split(xChild.XML, """")(1)
        Else
            Debug.Print xChild.Text
        End If


    Next xChild

    'Output:
    'ABCe0552553
    'ABCe05525531
    '1
    'Cust1234
    'Smith
    'New York
    '101
    'MP3 Player
    '102
    'Radio


End Sub

以下使用正则表达式,这真的只有在XML每次修复完整的示例时才有用。除非你想要超过可靠性,否则一般不建议解析XML。

And the following uses regex, which is really only useful if the XML is fixed to exactly your example each time. It's not really recommended for parsing XML in general unless you want speed over reliability.

Option Explicit

Sub RegexMethod()
Dim XMLString As String
Dim oRegex As Object
Dim regexArr As Object
Dim rItem As Object

    'Assumes Sheet1.Range("A1").Value holds example XMLString
    XMLString = Sheet1.Range("A1").Value

    Set oRegex = CreateObject("vbscript.regexp")
    With oRegex
        .Global = True
        .Pattern = "(id=""|>)(.+?)(""|</)"
        Set regexArr = .Execute(XMLString)

        'No lookbehind so replace unwanted chars
        .Pattern = "(id=""|>|""|</)"
        For Each rItem In regexArr
            'Change Debug.Print to fill an array to write to Excel
            Debug.Print .Replace(rItem, vbNullString)
        Next rItem
    End With

    'Output:
    'ABCe0552553
    'ABCe05525531
    '1
    'Cust1234
    'Smith
    'New York
    '101
    'MP3 Player
    '102
    'Radio


End Sub

编辑:稍微更新输出到数组写入范围

Slight update to output to array for writing to range

Option Explicit

Sub RegexMethod()
Dim XMLString As String
Dim oRegex As Object
Dim regexArr As Object
Dim rItem As Object
Dim writeArray(1 To 1, 1 To 10) As Variant
Dim col As Long

    'Assumes Sheet1.Range("A1").Value holds example XMLString
    XMLString = Sheet1.Range("A1").Value

    Set oRegex = CreateObject("vbscript.regexp")
    With oRegex
        .Global = True
        .Pattern = "(id=""|>)(.+?)(""|</)"
        Set regexArr = .Execute(XMLString)

        'No lookbehind so replace unwanted chars
        .Pattern = "(id=""|>|""|</)"
        For Each rItem In regexArr
            'Change Debug.Print to fill an array to write to Excel
            Debug.Print .Replace(rItem, vbNullString)

            col = col + 1
            writeArray(1, col) = .Replace(rItem, vbNullString)
        Next rItem
    End With

    Sheet1.Range("A5:J5").Value = writeArray


End Sub


Sub XMLMethod()
Dim XMLString As String
Dim XMLDoc As Object
Dim boolValue As Boolean
Dim xmlDocEl As Object
Dim xMeContext As Object
Dim xChild As Object
Dim xorder As Object
Dim writeArray(1 To 1, 1 To 10) As Variant
Dim col As Long


    XMLString = Sheet1.Range("A1").Value

    'Remove xa: in this example
    'reason : "Reference to undeclared namespace prefix: 'xa'."
    'Shouldn't need to do this if full XML is well formed
    XMLString = Replace(XMLString, "xa:", vbNullString)

    Set XMLDoc = CreateObject("MSXML2.DOMDocument")
    'XMLDoc.setProperty "SelectionNamespaces", "xa:"

        'XMLDoc.Load = "C:\Users\ooo\Desktop\test.xml" 'load from file
    boolValue = XMLDoc.LoadXML(XMLString)  'load from string

    Set xmlDocEl = XMLDoc.DocumentElement
    Set xMeContext = xmlDocEl.SelectSingleNode("//MeContext")
        'Debug.Print Split(xMeContext.XML, """")(1)
        col = col + 1
        writeArray(1, col) = Split(xMeContext.XML, """")(1)
    For Each xChild In xmlDocEl.ChildNodes

        If xChild.NodeName = "Orders" Then
            For Each xorder In xChild.ChildNodes
                col = col + 1
                'Debug.Print Split(xorder.XML, """")(1)
                writeArray(1, col) = Split(xorder.XML, """")(1)
                col = col + 1
                'Debug.Print xorder.Text
                writeArray(1, col) = xorder.Text
            Next xorder
        ElseIf xChild.Text = "" Then
            col = col + 1
            'Debug.Print Split(xChild.XML, """")(1)
            writeArray(1, col) = Split(xChild.XML, """")(1)
        Else
            col = col + 1
            'debug.Print xChild.Text
            writeArray(1, col) = xChild.Text
        End If


    Next xChild

    Sheet1.Range("A5:J5").Value = writeArray


End Sub

这篇关于将XML文档中的数据解析为Excel工作表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆