MSXML删除节点不按预期行事

时间:2014-09-12 12:59:39

标签: xml excel vba msxml

我正在尝试从以下XML中删除节点 - 以下数据仅代表实际数据:

<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

选择了正确的节点,但仅部分删除了该节点。如果我在记事本中打开生成的XML,则该节点的某些文本仍然存在。谁能解释一下呢?

编辑:

我尝试在删除元素之前单独删除每个属性。这也遇到了同样的问题。

谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用XPath选择具有匹配属性条件的节点。例如:

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

答案 1 :(得分:0)

这是一个XPath选择器,它将选择名为Test2 Test3的节点:

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

答案 2 :(得分:0)

感谢您的回复。我设法将问题缩小到缓慢的网络连接。保存到本地文件夹时不会发生损坏。

由于