2013-12-19 49 views
0

我正在寻找一种通过名称来搜索和删除节点的方法。在C#中通过不同的XML对象以字符串搜索XML节点

我有XML例如,我想删除节点<aRemove>

我尝试使用:

xmlDoc.SelectNodes("//aRemove"); 
xmlDoc.SelectNodes(".//aRemove"); 
xmlDoc.SelectNodes("a aRemove"); 

XML文件:

<a> 

     <a1> 
      <a12> 
        <aRemove> </aRemove> 
      </a12> 

     </a1> 

     <a2> 

     <a2> 

    </a> 

它永远也找不到该节点。我的XML是不同的......一个<aRemove><a1></a1>和其他内部<b><b3></b3></b>

编辑:一些以XML格式的有属性的节点,例如:

<a2=t655> </a2> 

我如何可以搜索节点通过串并删除它,它不同的XML对每一个?

+0

你确定你的XML不包含'xmlns'属性? –

+0

某些文件有属性...是否重要? – AlexKulr

+2

哇,是一个有效的XML格式,''?不是''?对不起,如果这实际上是有效的,我只是从来没有见过这种格式的xml .. – har07

回答

1

这可能很容易与System.Xml.Linq。

var xml = XElement.Parse(xmlString);//alternatively, you can load xml from file with XElement.Load(filepath) 
xml.XPathSelectElements(".//aRemove").Remove(); 

编辑:

正如阿列克谢Levenkov在评论所说,如果aRemove元素具有与其相关的命名空间,并要删除名称为aRemove所有元素,无论它们属于哪个命名空间,您可以尝试xpath ".//*[local-name()='aRemove']。使用XML LINQ的代码片段会,

var xml = XElement.Parse(xmlString);//alternatively, you can load xml from file with XElement.Load(filepath) 
xml.XPathSelectElements(".//*[local-name()='aRemove']").Remove(); 
+0

+0:OP已声称''.//aRemove“'XPath找不到节点 - 所以很可能还有其他一些问题(如名称空间)。 –

+0

'local-name()'是一个C#属性,或者我应该将其更改为任何字符串? – AlexKulr

+0

local-name()是一个xpath函数,它给你一个元素的名字,忽略它的名字空间。 –

0

你可以做这样的事情:

 string fileName = @"c:\test\test.xml"; 
     XDocument doc = XDocument.Load(fileName); 
     doc.Descendants("aRemove").Remove<XElement>(); 
     doc.Save(fileName);