2013-05-04 293 views
2

我有另一個任務,我不能做到:我應該從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(); 
} 

你能幫助我,好嗎?

回答

2

我找到的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