前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VBA编写Ribbon Custom UI编辑器05——转换结构体XML

VBA编写Ribbon Custom UI编辑器05——转换结构体XML

作者头像
xyj
发布2020-08-18 11:32:10
8450
发布2020-08-18 11:32:10
举报
文章被收录于专栏:VBA 学习VBA 学习VBA 学习
类CXML解析xml文本获取XML结构体之后,需要进一步转换为一个二维数组输出到Excel单元格。

同时还需要一个相反的函数,Excel单元格数据转换为XML结构体。

01

XML结构体转换为二维数组

Public Function XML2Array(tXML As XML) As String()
    Dim arr() As String
    Dim pcol As Long
    '记录属性所在的列
    Dim h As CHash
    '注意:这里应该先遍历一次,获取所有不重复属性名称的个数的
    Set h = NewCHash(200)
    h.Add "XMLName", 0
    h.Add "HasChild", 1
    
    Dim i As Long, j As Long
    '计算列的数量
    '第0个是不存在的根节点
    For i = 0 + 1 To tXML.nNode - 1
        For j = 0 To tXML.Nodes(i).AttriNum - 1
            If Not h.Exists(tXML.Nodes(i).Attris(j).Key) Then
                h.Add tXML.Nodes(i).Attris(j).Key, h.Count
            End If
        Next
    Next
    ReDim arr(tXML.nNode, h.Count - 1) As String
    arr(0, 0) = "xmlItem"
    arr(0, 1) = "HasChild"
    
    '开始转换
    For i = 0 + 1 To tXML.nNode - 1
        arr(i, 0) = tXML.Nodes(i).XMLItem
        arr(i, 1) = VBA.CStr(tXML.Nodes(i).HasChild)
        
        For j = 0 To tXML.Nodes(i).AttriNum - 1
            pcol = VBA.CLng(h.GetItem(tXML.Nodes(i).Attris(j).Key))
            arr(0, pcol) = tXML.Nodes(i).Attris(j).Key
            arr(i, pcol) = tXML.Nodes(i).Attris(j).value
        Next
    Next
    XML2Array = arr
    
    Set h = Nothing
End Function

02

二维数组转换为XML结构体

'Arr        从Excel单元格读取的数组
Public Function Array2XMLString(arr()) As String
    Dim rows As Long
    Dim cols As Long
    Dim result() As String
    Dim value As String
    Dim tmp() As String
    
    rows = UBound(arr, 1)
    cols = UBound(arr, 2)
    
    ReDim result(rows - 1 - 1) As String '第一行是标题
    ReDim tmp(cols - 1) As String '记录属性的值,HasChild在B列,是不需要的,多出的一个最后放“>”
    
    Dim i As Long
    Dim j As Long
    Dim iLevel As Long
    Dim bHasChild As Boolean
    
    For i = 2 To rows
        tmp(0) = "<" & VBA.CStr(arr(i, 1)) 'xmlItem
        '/*这种表示的是一个具有子元素的元素的结束
        If VBA.Left$(VBA.CStr(arr(i, 1)), 1) = "/" Then iLevel = iLevel - 1
        
        'HasChild
        bHasChild = VBA.CBool(arr(i, 2))
        If bHasChild Then
            tmp(cols - 1) = ">"
        Else
            If VBA.Left$(VBA.CStr(arr(i, 1)), 1) = "/" Then
                tmp(cols - 1) = ">" & vbNewLine
            Else
                tmp(cols - 1) = "/>"
            End If
        End If
        
        For j = 3 To cols
            value = VBA.CStr(arr(i, j))
            '不为空的时候设置属性值
            If VBA.Len(value) Then
                tmp(j - 2) = " " & VBA.CStr(arr(1, j)) & "=""" & value & """"
            Else
                tmp(j - 2) = ""
            End If
        Next
        
        result(i - 2) = VBA.Space$(iLevel) & VBA.Join(tmp, "")
        
        If bHasChild Then iLevel = iLevel + 1
    Next
    
    Array2XMLString = VBA.Join(result, vbNewLine)
End Function
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档