2016-11-15 86 views
0

我有一個需要修改的xml文件「sample.xml」。我在我的Excel表中列A中有大約300個字符串的列表,我需要打開XML文件並搜索這些字符串(它將是子節點的內容),如果發現我想刪除它的父節點。使用vba搜索xml文件中節點的內容和刪除父節點

這裏是我的sample.xml中,它比我下面提到巨大的文件,我已經在A柱公佈了它的一部分

<gera_it> 
<input> 
    <Servers> 
    <Server> 
     <Name>htp</Name> 
     <link>1.2.56.89</link> 
    </Server> 
    <Server> 
     <Name>wty</Name> 
     <link>1.4.67.89</link> 
    </Server> 
    <Server> 
     <Name>vnb</Name> 
     <link>1.6.11.98</link> 
    </Server> 
    <Server> 
     <Name>mnf</Name> 
     <link>1.4.89.45</link> 
    </Server> 
    <Server> 
     <Name>typ</Name> 
     <link>1.2.44.60</link> 
    </Server> 
    </Servers> 
    <config> 
    <map>yes</map> 
    </config> 
</input> 
</gera_it> 

我的excel表中有數據來自各地的300行數據。這些字符串是<Name> </Name>的內容。我提到他們的一些下面

wty 
mnf 
uyt 
ifh 

我想在sample.xml的文件中搜索這些字符串,如果該字符串被發現,我想刪除<Server> </Server>即)它的整個父節點。

這裏是我到現在爲止

Const Frow As Long = 3 
Const Lrow As Long = 206 
Const Stringcol As String = "A" 
Dim varStrings As Variant 
Dim Fpath As String 
Dim ws As Worksheet 
Dim lngIndex As Long 

Fpath = ThisWorkbook.Path & "\sample.xml" 

Set XDoc = CreateObject("MSXML2.DOMDocument") 
XDoc.async = False: XDoc.validateOnParse = False 
XDoc.Load (Fpath) 

Set ws = ActiveSheet 

With ws 
    ' Create the strings array from the given range value. 
    varStrings = .Range(.Cells(Frow, Stringcol), .Cells(Lrow, Stringcol)).Value 
    ' Transpose the strings array into a one dimentional array. 
    varStrings = Application.WorksheetFunction.Transpose(varStrings) 
End With 

Set objFileSystemObject = CreateObject("Scripting.FileSystemObject") 

For lngIndex = LBound(varStrings) To UBound(varStrings) 
    If Len(Trim$(varStrings(lngIndex))) > 0 Then 
     String = varStrings(lngIndex) 
     XPath = "//gera_it/input/Servers/Server[Name = '" & String & "']" 
     'delete child nodes that matches array strings 
     For Each Node In XDoc.SelectNodes(XPath) 
      Node.ParentNode.Removechild (Node) 
     Next 
    Else 
     'Do Nothing 
    End If 
Next 

XDoc.Save ThisWorkbook.Path & "\sample.xml" 

我得到一個空sample.xml中,如果我在上面執行,我不知道哪裏出了問題。

有人可以幫助我。

+0

如果你從未去過www.w3schools.com,我會向你推薦這個網站。他們有關於XML和XPath的優秀基礎教程。在你的xpath的開頭使用double //,你可以將它縮短到// Server [Name ='「&strName&''],它仍然可以工作。縮短版本將返回任何匹配的服務器節點,即使它存在於多個父節點下。 – j2associates

回答

2

首先,我認爲你的查詢字符串是選擇名爲Name的節點,而你可能想選擇名爲Server的父節點,因爲它是你想從父節點刪除的這個節點。在下面的代碼中,我已經給出了一些示例語法來實現此目的。

其次,我已將整個查詢解析爲一個搜索字符串。在您的樣本數據,然後,查詢看起來是這樣的:

// gera_it /輸入/服務器/服務器[名稱= 'WTY' 或 '多國部隊' 或 'UYT' 或 'IFH']

如果你喜歡去那條路線,沒有什麼可以阻止你單獨選擇每個節點名稱。您只需循環訪問codes數組,然後在每個值上調用SelectNodes(併除去)。

Dim xmlDoc As MSXML2.DOMDocument60 
Dim nodes As MSXML2.IXMLDOMNodeList 
Dim node As MSXML2.IXMLDOMNode 
Dim rng As Range 
Dim codes As Variant 
Dim queryString As String 
Dim filePath As String 
Dim fileName As String 


'Read the codes from column "A" 
With Sheet1 'change to your sheet 
    Set rng = .Range(.Cells(1, "A"), .Cells(.Rows.Count, "A").End(xlUp)) 
End With 
codes = Application.Transpose(rng.Value2) 

'Create your query string 
queryString = "//gera_it/input/Servers/Server[Name = '" & _ 
      Join(codes, "' or '") & "']" 

'Load the xml document 
filePath = "[your path]" 
fileName = "[your filename]" 
Set xmlDoc = New MSXML2.DOMDocument60 
With xmlDoc 
    .async = False 
    .validateOnParse = False 
    .Load (filePath & "\" & fileName) 
End With 

'Delete the Server nodes 
Set nodes = xmlDoc.SelectNodes(queryString) 
For Each node In nodes 
    node.ParentNode.RemoveChild node 
Next 
+0

感謝您的幫助:) – S6633d

+0

@Ambie組合查詢字符串的工作不錯,但是如果迭代字符串數組,調試會容易得多。 – j2associates

+0

@ S6633d建議您在每個模塊的頂部使用Option Explicit。這需要在使用變量之前對其進行定義,並且會在您將手指放在現有變量的某個位置時將其保存在某處。沒有Option Explicit,VBA只是悄悄地創建新的變量。 – j2associates