2014-10-18 96 views
1

我想删除整个“资料表” Elemt用(在这种情况下,ID 10)将特定ID:删除特定的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 

这会干脆什么也不做。

回答

3

使用的解决方案1,因为你要删除的整个TableData元素的XPath选择了ID元素的TableData元素代替:上述的XPath更新有点

..... 
node = XmldocDel.SelectSingleNode("//DataPaths/TableData[ID = '10']") 
..... 

*)。查看发布的XML,第一步应该是DataPaths而不是DataSetPaths

UPDATE:

您的实际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]

+0

听起来不错,但也导致了零例外:( – TomWayne 2014-10-18 17:55:17

+0

@TomWayne这段代码肯定不会导致空异常。你选中使用'node'一行但是后来会。你的错,从来没有使用变量,可以是'null'没有,如果它们是有效的检查。 – Tomalak 2014-10-18 18:04:04

+0

@TomWayne检查更新的答案 – har07 2014-10-18 21:59:07