删除XML节点

删除XML节点

问题描述:

我有另一个任务,我不能做到:我应该从this site解析XML,删除不具有“视频”,在其名称中的所有节点,然后将其保存到另一个XML文件。我在阅读和写作方面没有任何问题,但移除会使我遇到一些困难。我试图做的节点 - >父节点 - >子节点工作和身边的,但它似乎没有有用:删除XML节点

static void Main(string[] args) 
    { 
     using (WebClient wc = new WebClient()) 
     { 
      string s = wc.DownloadString("http://feeds.bbci.co.uk/news/health/rss.xml"); 
      XmlElement tbr = null; 
      XmlDocument xml = new XmlDocument(); 
      xml.LoadXml(s); 

      foreach (XmlNode node in xml["rss"]["channel"].ChildNodes) 
      { 
       if (node.Name.Equals("item") && node["title"].InnerText.StartsWith("VIDEO")) 
       { 
        Console.WriteLine(node["title"].InnerText); 
       } 
       else 
       { 
        node.ParentNode.RemoveChild(node); 
       } 
      } 

      xml.Save("NewXmlDoc.xml"); 
      Console.WriteLine("\nDone..."); 

      Console.Read(); 
     } 
    } 

我也曾尝试RemoveAll方法,它不工作为好,因为它删除所有不满足“VIDEO”条件的节点。

//same code as above, just the else statement is changed 
else 
{ 
    node.RemoveAll(); 
} 

你能帮助我,好吗?

我找到的LINQ到XML更容易使用

var xDoc = XDocument.Load("http://feeds.bbci.co.uk/news/health/rss.xml"); 

xDoc.Descendants("item") 
    .Where(item => !item.Element("title").Value.StartsWith("VIDEO")) 
    .ToList() 
    .ForEach(item=>item.Remove()); 

xDoc.Save("NewXmlDoc.xml"); 

您还可以使用XPath

foreach (var item in xDoc.XPathSelectElements("//item[not(starts-with(title,'VIDEO:'))]") 
         .ToList()) 
{ 
    item.Remove();    
} 
+1

非常感谢你......我没有一直与LINQ的很多,到目前为止,但它看起来非常简单而且非常强大。接受答案。 – Storm 2013-05-04 19:57:10

+0

我可以再问一个问题吗?我试图改变写入控制台,但不知何故它不工作......'foreach(var item in xDoc.XPathSelectElements(“// item [(starts-with(title,'VIDEO:'))]”)。 ToList()) Console.WriteLine((string)item.Attribute(“title”)); }' – Storm 2013-05-04 20:23:32

+1

@Storm'title'不是item的*属性*。这是子元素。尝试'item.Element(“title”)。Value' – I4V 2013-05-04 20:30:55