平面列表中的XML父子结构

时间:2015-10-08 17:47:08

标签: vba msxml

使用MSXML和VBA我想创建一个相同XML节点的hiarachy。

我的输入数据在Excel的两列中显示为

第一栏看起来像这样

Lvl 1 
Lvl 2
Lvl 2
Lvl 1
Lvl 2
Lvl 3

以前的较低级别始终被视为下一个较高级别的父级

所以上面实际上翻译为

 Lvl 1
    Lvl2
    Lvl2
  Lvl1
   Lvl2
    Lvl3

第二列包含xml元素的标识,这是唯一的。

因此生成的xml看起来像

<section ident="item1">
    <section ident="item2"></section>
    <section ident="item3"></section>
</section>
<section ident="item4">
    <section ident="item5">
        <section ident="item6"></section>
    </section>
</section>

我让它工作的地方我循环每一行,if一个特定级别我追加到前一个。但对于每个级别,我必须重复我的if检查级别,为每个级别创建一个对象。很多物体都有很多痛苦。

我将appendChild和insertBefore作为msxml中的方法提供给我。

如何创建此结构的代码最少?并确保它的工作超过3个级别?

现有代码(为了便于阅读,删除了该部分属性的所有其他设置:

正如您所看到的那样,它不具备可扩展性,我喜欢能够维护一个公共部分,但只能设置一次属性。

For i = LBound(varLvlSections) To UBound(varLvlSections)

            If varLvlSections(i, 1) = "Lvl 1" Then

                'add level section element
                Set sectionLvl1 = dom.createElement("section")
                mainSection.appendChild sectionLvl1
                sectionLvl1.setAttribute "ident", varLvlSections(i, 2)

            End If

            If varLvlSections(i, 1) = "Lvl 2" Then

                'add level section element
                Set sectionLvl2 = dom.createElement("section")
                sectionLvl1.appendChild sectionLvl2
                sectionLvl2.setAttribute "ident", varLvlSections(i, 2)

            End If

            If varLvlSections(i, 1) = "Lvl 3" Then

                'add level section element
                Set sectionLvl3 = dom.createElement("section")
                sectionLvl2.appendChild sectionLvl3
                sectionLvl3.setAttribute "ident", varLvlSections(i, 2)

            End If

next i

1 个答案:

答案 0 :(得分:1)

这样的事可能适合你。没有对级别进行错误检查(如果有“级别4”而没有之前的“级别3”则会中断)。

Sub Tester()

    Dim d, doc, root, lvl As Long, r, el, id
    Dim parents(0 To 20)  'handle up to 20 levels...

    Set doc = New MSXML2.DOMDocument
    Set root = doc.createElement("root")
    doc.appendChild root

    Set parents(0) = root 'Parent node for all "Level 1" nodes...

    d = Range("a1").CurrentRegion.Value

    For r = LBound(d, 1) To UBound(d, 1)

        lvl = CLng(Split(d(r, 1), " ")(1)) 'get level

        Set el = doc.createElement("section")
        el.setAttribute "ident", d(r, 2)

        parents(lvl - 1).appendChild el
        Set parents(lvl) = el ' Make this the current Parent node for
                              '   any nodes directly below

    Next r

    Debug.Print PrettyPrintXML(doc.XML)

End Sub
来自Daniel的回答

PrettyPrintXML

How can I pretty-print XML source using VB6 and MSXML?