我已经尝试过搜索此网站和谷歌搜索,似乎无法找到我的问题的答案,虽然我做的搜索导致我看到你在下面看到的VBA代码。我的问题是我有一个XML树,我需要删除与“MyBank1”,“broccoli”等和“MyBank2”,“西兰花”等相关的8行。我需要编辑的文件可能有很多“foo”的实例“在需要删除”MyBank1“和”MyBank2“行的文件中(因此循环)但留下其余的银行信息(例如留下与”花旗“相关联的行)。代码运行但生成的文件不会删除行。我有一种感觉,我不理解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
答案 0 :(得分:3)
<signature/>
是一个没有内容的空元素,但是你的缩进使它看起来像是<bank>
路径的一部分:它不是那么让它离开xPath。
例如:
Public Sub EditDocument()
Dim xDoc As MSXML2.DOMDocument60
Set xDoc = New MSXML2.DOMDocument60
xDoc.validateOnParse = False
xDoc.Load "C:\_Stuff\test\test.xml"
DeleteNodes xDoc, "IPSGDatas/datas/foo/bar/banks/bank[@name='MyBank1']"
DeleteNodes xDoc, "IPSGDatas/datas/foo/bar/banks/bank[@name='MyBank2']"
xDoc.Save "C:\_Stuff\test\test_updt.xml" ''save new document
Set xDoc = Nothing
End Sub
Sub DeleteNodes(xDoc As MSXML2.DOMDocument60, xPath As String)
Dim foo As IXMLDOMNodeList, el As IXMLDOMElement
Set foo = xDoc.SelectNodes(xPath)
Debug.Print foo.Length & " nodes for " & xPath
For Each el In foo
el.ParentNode.RemoveChild el
Next el
End Sub
答案 1 :(得分:0)
可能是这样的,HTH。
Set xDoc = New MSXML2.DOMDocument60
xDoc.Load ("C:\Temp\StackOverflow\source.XML")
Dim myBank12 As IXMLDOMNodeList
Set myBank12 = xDoc.SelectNodes("//bank[@name='MyBank1']|//bank[@name='MyBank2']")
Dim xNode As IXMLDOMElement
For Each xNode In myBank12
xNode.ParentNode.RemoveChild xNode
Next
xDoc.Save "C:\Temp\StackOverflow\result.XML"
注意:的
//bank
选择所有bank
元素,无论它们位于document
中的哪个位置。通过在xpath表达式中使用|
运算符,您可以选择多个路径。
结果:
<?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>
</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>
</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>