gpt4 book ai didi

excel - 使用 VBA (Excel) 从 XML DOM 对象中删除(子)节点

转载 作者:行者123 更新时间:2023-12-04 20:51:00 24 4
gpt4 key购买 nike

我正在使用模板创建相当复杂的 XML 文件,用可以在 Excel 工作表中输入的值替换特殊的搜索字符串,然后存储 xml 文件。

 Dim strInpPath As String
Dim strOutpPath As String

Dim fso
Dim f
Dim oDomRd As Object, oNode As Object, i As Long, oAtt As Object, oGroup As Object, oDomWr As Object
Dim oTest As Object


strInpPath = ActiveWorkbook.ActiveSheet.Cells(3, 4).Value
strOutputPath = ActiveWorkbook.ActiveSheet.Cells(4, 4).Value


Set oDomRd = CreateObject("MSXML2.DOMDocument")
oDomRd.Load strInpPath
Set oDomWr = CreateObject("MSXML2.DOMDocument")

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(strOutputPath, 2, True)

Set oGroup = oDomRd.SelectNodes("/")
Set oNode = oGroup.NextNode
If Not (oNode Is Nothing) Then
strout = oNode.XML
strout = ScanTable("_S_AND_R_TABLE_1", strout)
oDomRd.LoadXML (strout)
Set oGroup = oDomRd.SelectNodes("/")
Set oNode = oGroup.NextNode

If oNode.HasChildNodes() Then
Set oLists = oNode.DocumentElement
Run RemoveOptionalEmptyTags(oLists)
End If
strout = oNode.XML
f.write (strout)
Else
strout = "001 error reading file"
End If
MsgBox strout

End Function
一些字段值不是强制性的,因此可以留空。在这种情况下,第一个过程(scantable)输入“##REMOVE##”作为值。在第二步中,我想遍历整个 DOMObject 并删除具有值“##REMOVE##”的节点
对于第二步,我创建了一个过程:
Public Function RemoveOptionalEmptyTags(ByRef oLists)

For Each listnode In oLists.ChildNodes
If listnode.HasChildNodes() Then
Run RemoveOptionalEmptyTags(listnode)
Else
lcBasename = listnode.ParentNode.BaseName
lcText = listnode.Text
If lcText = "##REMOVE##" Then
listnode.ParentNode.RemoveChild listnode
Exit For
End If
End If
Next listnode

End Function
这工作得很好,唯一的问题是节点不是 已删除 ,它只是空的():
    <Cdtr>
<Nm>Name Creditor</Nm>
<PstlAdr>
<Ctry>DE</Ctry>
<AdrLine>Street</AdrLine>
<AdrLine/>
</PstlAdr>
</Cdtr>
现在的问题:
我怎样才能完全删除节点,所以它看起来像这样(第二个消失了):
    <Cdtr>
<Nm>Name Creditor</Nm>
<PstlAdr>
<Ctry>DE</Ctry>
<AdrLine>Street</AdrLine>
</PstlAdr>
</Cdtr>

最佳答案

基本上是 RemoveChild语法正确:

{NodeToDelete}.ParentNode.RemoveChild {NodeToDelete}


但是让我们重复 xml 结构并注意每个文本节点(如果存在)被视为其父节点的子节点(即更深一层)。
<Cdtr>                                   <!-- 0 documentElement                      -->
<Nm>Name Creditor</Nm> <!-- 1 ChildNode of Nm = 'Name Creditor' -->
<PstlAdr> <!-- 1 listNode.ParentNode.ParentNode -->
<Ctry>DE</Ctry> <!-- 2 ChildNode of Ctry = 'DE' -->
<AdrLine>Street</AdrLine> <!-- 2 ChildNode of AdrLine[1] = 'Street' -->
<AdrLine> <!-- 2 listNode.ParentNode to be removed -->
<!-- NODETEXT ##REMOVE## --> <!-- 3 ChildNode of AdrLine[2] -->
</AdrLine>
</PstlAdr>
</Cdtr>
通过 xml 层次结构(假设文本值)深入到底部
    listnode.ParentNode.RemoveChild listnode
您正在删除 AdrLine[2] 的文本 ChildNode (级别 3)这是字符串 "##REMOVE##" ,
但不是容器节点 AdrLine[2] (第 2 级)。因此,您只删除虚拟文本。
遵循函数中的逻辑 RemoveOptionalEmptyTags()尽可能接近您必须编写代码:
    listNode.ParentNode.ParentNode.RemoveChild listNode.ParentNode
寻址 PstlAdr (=级别 1)执行删除其子节点 AdrLine[2] (即在第 2 级)
自动包括在级别 3 删除虚拟字符串“##REMOVE”。
相关链接 :
XML Parse via VBA
Obtain atrribute names from xml using VBA

关于excel - 使用 VBA (Excel) 从 XML DOM 对象中删除(子)节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62591586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com