【发布时间】:2020-06-26 09:12:06
【问题描述】:
我正在使用模板创建相当复杂的 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>
【问题讨论】:
-
oLists如何设置(请在OP中编辑XPath或显示更完整的代码)?应该是NodeList而不是单个节点。节点列表无法显示.ChildNodes并且递归调用使用带有 both 类型的参数oLists,这应该是典型的不匹配。所以我怀疑你的功能是否有效。 ...并删除删除代码行中... (listnode)周围的括号:listnode.ParentNode.RemoveChild listnode。 -
@T.M.谢谢你的评论。我希望我添加的代码确实使它更清晰一些。我删除了(listnode)周围的括号,不幸的是代码的行为没有改变,'removed'标签只是空的,没有被删除...... :-(
-
发布了您的问题的答案;请随意勾选绿色复选标记和/或投票来接受:-)
标签: excel xml vba removechild