【发布时间】:2017-05-14 01:55:20
【问题描述】:
我已尝试搜索此站点和 google 搜索,但似乎无法找到我的问题的答案,尽管我进行的搜索使我找到了您在下面看到的 VBA 代码。我的问题是我有一个 XML 树,我需要删除与“MyBank1”、“broccoli”等和“MyBank2”、“broccoli”等相关的 8 行。我需要编辑的文件可能有很多“foo”实例" 在需要删除“MyBank1”和“MyBank2”行(因此是循环)但保留其余银行信息的文件中(例如,保留与“Citi”关联的行)。代码运行,但生成的文件不会删除这些行。我有一种感觉,我不了解 XML 语言,VBA 与 xml 文件的交互,或者更有可能两者兼而有之。任何帮助表示赞赏!
我的 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<IPSGDatas.....xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<header>
<language_id>120</language_id>
</header>
<datas>
<foo>
<signature/>
<bar>
<banks>
<marker>
<broccoli order="1">X</broccoli>
<broccoli order="2">X</broccoli>
</marker>
<bank name="Citi">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="Keybank">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="NBT">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="NationalBank">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="MyBank1">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="MyBank2">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
</banks>
<profile_id>MyName1</profile_id>
</bar>
<action_id>New</action_id>
<index_id>1</index_id>
<agency/>
<agency_reference/>
<accreditation_id>U</accreditation_id>
</foo>
<foo>
<signature/>
<bar>
<banks>
<marker>
<broccoli order="1">X</broccoli>
<broccoli order="2">X</broccoli>
</marker>
<bank name="Citi">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="Keybank">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="NBT">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="NationalBank">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="MyBank1">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
<bank name="MyBank2">
<broccoli order="1">A</broccoli>
<broccoli order="2">B</broccoli>
</bank>
</banks>
<profile_id>MyName1</profile_id>
</bar>
<action_id>New</action_id>
<index_id>1</index_id>
<agency/>
<agency_reference/>
<accreditation_id>U</accreditation_id>
</foo>
</datas>
</IPSGDatas>
现在我的 VBA 代码:
Option Explicit
Public Sub EditDocument()
'declare objects and variables
Dim xDoc As MSXML2.DOMDocument60
Dim xNode As IXMLDOMElement
Dim foo As IXMLDOMNodeList
Dim i As Integer
'initialize object
Set xDoc = New MSXML2.DOMDocument60
xDoc.validateOnParse = False
'load document
xDoc.Load ("C:\Users\Danny\Desktop\xml\TestDoc.xml")
'initialize and select set of nodes
Set foo = xDoc.SelectNodes("/datas/foo")
'loop to select specific attribute/node and delete it
For i = 0 To foo.Length - 1
Set xNode = xDoc.SelectSingleNode("/bar/banks/bank[@name='MyBank1']")
xNode.Attributes.removeNamedItem "MyBank1"
Set xNode = xDoc.SelectSingleNode("/bar/banks/bank[@name='MyBank2']")
xNode.Attributes.removeNamedItem "MyBank2"
Next i
'save new document
xDoc.Save ("C:\Users\Danny\Desktop\xml\NewFile.xml")
'clear document from memory
Set xDoc = Nothing
End Sub
【问题讨论】:
-
<signature/>是一个没有内容的空元素,但是您的缩进使它看起来像是bank路径的一部分:它不是。 -
我会尝试删除它。谢谢!
-
调整了vba和xml文件,还是不行。 :(
-
在下面查看我的答案
-
那不是有效的 XML。
.....是什么?如果它包含全局命名空间可能很重要。