删除XML DOM节点会删除其所有同级节点



我必须通过删除一些节点来修剪XML文档。要做到这一点,我有下面的VBA函数,它是用调用的

  • lists=XMLOutput.dococumentement
  • tagfound=完整路径(//标题/元素/子元素/…(

这是代码:

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

我尝试过其他更优雅的解决方案,比如一行代码,但所有的解决方案都会导致相同的结果:如果我必须删除一个孩子,这是它的最后一个孩子的父母,它的所有兄弟姐妹也会被删除。我试图在删除后保存文档,但没有结果。有什么提示吗?为了更清楚地说明,下面是我的意见。对于每个XML标记,一个布尔值告诉我是必须保留它还是从XML树中删除它。

XML标记到BeCoded标题TRUE标题/组织正确标题/组织/基本数据为真标题/组织/基本数据/VAT TRUE标题/组织机构/基本数据/增值税/国家/地区TRUE标题/组织/基本数据/VAT/代码TRUE标题/组织/基本数据/社会安全假标题/组织/基本数据/个人数据TRUE标题/组织/基本数据/个人数据/组织名称TRUE标题/组织/基本数据/个人数据/个人姓名FALSE标题/组织/基本数据/个人数据/家族名称FALSE标题/组织/基本数据/个人数据/标题FALSE标题/组织/基本数据/个人数据/代码FALSE标题/组织/基本数据/专业分类账FALSE标题/组织结构/基本数据/分类帐续数FALSE标题/组织机构/基本数据/注册号FALSE标题/组织/基本数据/日期FALSE标题/组织/基本数据/IRSType FALSE标题/组织机构/位置为真标题/组织机构/地点/地址为真标题/组织机构/位置/街道编号TRUE标题/组织机构/地点/ZIP 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的任何字段,而我应该删除除OrganizationName之外的所有子项,OrganizationName恰好是第一个子项。此外,BaseData/VAT/国家/地区和BaseData/VATA/代码不存在(VAT父级在那里,但为空(。

下面的代码演示了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

最新更新