我必须通过删除一些节点来修剪XML文档。为此,我具有以下VBA函数,该函数用
调用代码如下:
Function RemoveNode(lists, tagfound)
Dim nodefound As Object
Set nodefound = lists.selectSingleNode(tagfound)
If nodefound Is Nothing Then Exit Function
nodeToBeRemoved = nodefound.basename
Set x = nodefound.parentnode
For Each listnode In x.childnodes
If listnode.basename = nodeToBeRemoved Then
x.removechild (listnode)
End If
Next listnode
End Function
我尝试了其他更优雅的解决方案,例如单行代码,但是ALL导致相同的结果:如果必须删除作为其父级的最后一个子级的子级,则所有同级项也将被删除。 。我尝试将文档删除后再保存,但没有结果。 有什么提示吗? 更清楚地说,以下是我的意见。对于每个XML标签,一个布尔值告诉我是否必须保留它或将其从XML树中删除。
XMLTag ToBeCoded 标头TRUE 标头/组织TRUE 标头/组织/ BaseData TRUE 标头/组织/ BaseData /增值税TRUE 标头/组织/基本数据/增值税/国家/地区TRUE 标头/组织/ BaseData / VAT /代码TRUE 标头/组织/ BaseData / SocialSecurity FALSE 标头/组织/ BaseData / PersonalData TRUE 标头/组织/ BaseData /个人数据/组织名称TRUE 标头/组织/ BaseData / PersonalData / PersonalName为FALSE 标头/组织/ BaseData / PersonalData / FamilyName FALSE 标头/组织/ BaseData / PersonalData /标题FALSE 标头/组织/基本数据/个人数据/代码为FALSE 标头/组织/基础数据/专业分类帐FALSE 标头/组织/ BaseData / ContyOfLedger FALSE 标头/组织/基础数据/注册号为FALSE 标头/组织/ BaseData /日期为FALSE 标头/组织/ BaseData / IRSType为FALSE 标头/组织/位置TRUE 标头/组织/位置/地址TRUE 标头/组织/位置/街道编号TRUE 标头/组织/位置/邮政编码TRUE 标头/组织/位置/城市TRUE 标头/组织/位置/县TRUE 标头/组织/位置/国家/地区TRUE
..这就是我得到的:
<Header>
<Organisation>
<BaseData>
<VAT></VAT>
<PersonalData>
</PersonalData>
</BaseData>
<Location>
<Address>any street name</Address>
<StreetNumber>any street number</StreetNumber>
<ZIP>any ZIP code</ZIP>
<City>any City</City>
<County>any County</County>
<Country>any Country</Country>
</Location>
很容易看出,我没有获得PersonalData标签的任何字段,而我应该删除了除OrganisationName之外的所有子项,而OrganisationName恰好是第一个孩子。另外,不存在BaseData / VAT / Country和BaseData / VAT / Code(VAT父级在那里,但为空)。
答案 0 :(得分:0)
以下代码演示了如何删除Zip节点
Option Explicit
Sub TestRemoveNode()
Dim dom As MSXML2.DOMDocument60
Set dom = New MSXML2.DOMDocument60
dom.LoadXML "<Header><Organisation><BaseData><VAT></VAT><PersonalData></PersonalData></BaseData><Location>" & _
"<Address>any street name</Address><StreetNumber>any street number</StreetNumber><ZIP>any ZIP code</ZIP>" & _
"<City>any City</City><County>any County</County><Country>any Country</Country></Location></Organisation></Header>"
Debug.Assert dom.parseError = 0
'* find a node
Dim xmlZip As MSXML2.IXMLDOMNode
Set xmlZip = dom.SelectSingleNode("//ZIP")
xmlZip.ParentNode.RemoveChild xmlZip
Debug.Assert dom.XML = "<Header><Organisation><BaseData><VAT></VAT><PersonalData></PersonalData></BaseData><Location>" & _
"<Address>any street name</Address><StreetNumber>any street number</StreetNumber>" & _
"<City>any City</City><County>any County</County><Country>any Country</Country></Location></Organisation></Header>" & vbNewLine
End Sub