2014-09-12 30 views
0

我試圖刪除以下XML節點 - 數據下只是acutal數據的代表性:MSXML刪除節點行爲不按預期

<StaffMembers> 
    <Staff Name="Test1" Date="Date1"/> 
    <Staff Name="Test2" Date="Date2"/> 
</StaffMembers> 

我的代碼如下:

Sub DeleteRecord(strName as string, strDate as string) 

'Load Document 

    Set xList = xDoc.SelectNodes("//StaffMembers/") 
    for each xNode in xList 
      If xNode.Attributes.Length > 0 And xNode.Attributes.getNamedItem("Date").NodeValue = strDate Then 
       xnode.parentnode.removechild xnode 
       exit for 
      End if 
    next xNode 

'Save Document 

End Sub 

生成的XML - 你可以看到,它是不完整的:

<StaffMembers> 
    <Staff Name="Test1" Date="Date1"/> 
    <Staff Name="Tes 

正確的節點被選中,b它只是部分刪除。如果我在記事本中打開生成的XML,則該節點的一些文本仍然存在。任何人都可以解釋嗎?

編輯:

我試圖刪除元素之前單獨刪除每個屬性。這遭受同樣的問題。

感謝

+0

你可以發佈不正確的輸出給定的XML片斷您張貼編輯輸入 – har07 2014-09-12 13:31:47

+0

問題的相關部分。謝謝 – 2014-09-12 13:40:53

回答

0

感謝您的回覆。我已經設法將問題縮小到網絡連接速度緩慢。保存到本地文件夾時不會發生損壞。

感謝

0

這裏是一個XPath選擇,將選擇那些被命名爲Test2Test3節點:

xDoc.SelectNodes("//Staff[@Name = ""Test2"" || @Name = ""Test3""]") 

對於測試VBScript程序下面我得到以下輸出刪除這些後節點:

<StaffMembers> 
    <Staff Name="Test1" Date="Date1"/> 
    <Staff Name="Test4" Date="Date4"/> 
</StaffMembers> 

測試程序:

Option Explicit 

DeleteRecord "Test2", "Test3" 

Sub DeleteRecord(name1, name2) 
    Dim xDoc : Set xDoc = CreateObject("Msxml2.DOMDocument") 
    xDoc.LoadXML GetXml() 

    Dim xList : Set xList = xDoc.SelectNodes _ 
     ("//Staff[@Name = """ & name1 & """ || @Name = """ & name2 & """]") 

    Dim xNode 
    For Each xNode in xList 
     xNode.ParentNode.RemoveChild xNode 
    Next 

    WScript.Echo xDoc.Xml 
End Sub 

Function GetXml() 
    Dim NL : NL = vbNewLine 

    GetXmL = _ 
     "<StaffMembers>" &NL& _ 
     " <Staff Name='Test1' Date='Date1'/>" &NL& _ 
     " <Staff Name='Test2' Date='Date2'/>" &NL& _ 
     " <Staff Name='Test3' Date='Date3'/>" &NL& _ 
     " <Staff Name='Test4' Date='Date4'/>" &NL& _ 
     "</StaffMembers>" 
End Function 
+0

嗨大衛,謝謝你的答案。上述代碼在您的測試程序中可以正常工作,但不會轉換爲我的。我可以確認正在選擇正確的節點 - 我已經通過Debug實現了這一點。打印BaseName和Attributes以確保。 ParentNode肯定是'StaffMemebers',BaseName和屬性完美匹配。你能想出爲什麼它會刪除XML的奇怪部分嗎?我想不出爲什麼它會刪除Root的結束標記,例如 – 2014-09-12 13:56:30

+0

謝謝,這很有道理。您能否指出我在XPath文檔的方向上使用特定屬性值來分隔節點? – 2014-09-12 14:05:27

+0

另一種觀察:'DeleteRecord'沒有使用它的'strName'參數。 – DavidRR 2014-09-12 14:05:53

1

您可以使用XPath匹配屬性的標準來選擇的節點。例如:

..... 
Set xList = xDoc.SelectNodes("//StaffMembers/Staff[@Date='Date2']") 
For Each xnode In xList 
    xnode.ParentNode.RemoveChild xnode 
Next xnode 
..... 
+0

謝謝。我現在嘗試將值設置爲列表,並嘗試選擇單個節點,但我遇到同樣的問題。它正在選擇正確的節點,但並未完全刪除它。這裏似乎還有別的東西在玩。 – 2014-09-12 14:21:26

+0

您可以嘗試使用另一個僅包含您發佈的部分的XML嗎?問題依然存在嗎?無論如何,如果沒有能夠重現問題,很難進一步診斷 – har07 2014-09-12 14:24:30

+0

您好,我已經使用了示例XML,並且我遇到了同樣的問題 - 這是最令人困惑的。 – 2014-09-12 14:28:52