删除XML DOM节点会删除其所有兄弟姐妹

时间:2018-07-20 19:39:25

标签: access-vba nodes xmldom

我必须通过删除一些节点来修剪XML文档。为此,我具有以下VBA函数,该函数用

调用
  • 列表= XMLOutput.documentelement
  • tagfound =完整路径(// Header / Element / Sub-Element /...)

代码如下:

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父级在那里,但为空)。

1 个答案:

答案 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