我想删除整个" TableData"具有特定ID的Elemt(在本例中为ID 10)来自我的xml:
<DataPaths>
<TableData>
<ID>10</ID>
<TablePath>C:\Users\Tom\Test.xls</TablePath>
<TableName>TestName</TableName>
<Mode>TestMode</Mode>
</TableData>
</DataPaths>
我尝试了两种不同的解决方案,我想我几乎就在那里。
解决方案1:
Dim XmldocDel As New XmlDocument()
XmldocDel.Load("" & buildSettingsPath)
Dim node As XmlNode
node = XmldocDel.SelectSingleNode("//DataPaths/TableData[ID = '10']")
If MessageBox.Show("Are you sure you want to delete:", MessageBoxButtons.YesNo) = DialogResult.Yes Then
If node IsNot Nothing Then
node.ParentNode.RemoveChild(node)
'node.ParentNode.RemoveAll()
XmldocDel.Save("" & buildSettingsPath)
Reload()
Else
MessageBox.Show("No node found")
End If
Else
Exit Sub
End If
我在这里得到一个零异常。
解决方案2:
Dim clientNodes = XmldocDel.SelectNodes("//ID")
For Each elem As Xml.XmlElement In clientNodes
If elem.InnerText = "10" Then
elem.ParentNode.RemoveChild(elem)
Exit For
End If
Next
这将无所事事。
答案 0 :(得分:3)
使用解决方案1,因为您要删除整个TableData
元素,XPath应该选择TableData
元素而不是ID
元素:
.....
node = XmldocDel.SelectSingleNode("//DataPaths/TableData[ID = '10']")
.....
*)稍微更新了XPath。查看发布的XML,第一步应该是DataPaths
而不是DataSetPaths
。
更新:
您的实际XML具有默认命名空间。因此,在这种情况下,您需要使用XmlNamespaceManager
注册映射到默认命名空间URI的前缀。在XPath中使用已注册的前缀,并将命名空间管理器作为SelectSingleNode()
的第二个参数传递
方法:
Dim nsManager As New XmlNamespaceManager(New NameTable())
nsManager.AddNamespace("d", "http://tempuri.org/DataPaths.xsd")
.....
node = XmldocDel.SelectSingleNode("//d:DataPaths/d:TableData[d:ID = '10']", nsManager)
.....
<强> [.NET fiddle demo] 强>