XML 平面列表中的父子结构
XML parent child structure from flat list
使用 MSXML 和 VBA 我想创建一个相同 XML 节点的层次结构。
我的输入数据在 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
类似的内容可能对您有用。没有对关卡进行错误检查(如果 "level 4" 之前没有 "level 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
PrettyPrintXML
来自丹尼尔的回答:
How can I pretty-print XML source using VB6 and MSXML?
使用 MSXML 和 VBA 我想创建一个相同 XML 节点的层次结构。
我的输入数据在 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
类似的内容可能对您有用。没有对关卡进行错误检查(如果 "level 4" 之前没有 "level 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
PrettyPrintXML
来自丹尼尔的回答:
How can I pretty-print XML source using VB6 and MSXML?