2013-05-04 3 views
2

У меня есть еще одна задача, которую я не могу выполнить: я должен анализировать XML с this site, удалять все узлы, у которых нет «ВИДЕО» от их имени, а затем сохранить его другому XML-файл. У меня нет проблем с чтением и письмом, но удаление затрудняет мне. Я попытался сделать узел -> Parent Node -> дочерний узел с работой Обращаясь, но это не казалось полезным:Удаление узла 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, который не работает, как хорошо, потому что это удаляет все узлы, не удовлетворяющие условию «ВИДЕО».

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

Не могли бы вы помочь мне, пожалуйста?

ответ

2

Я считаю, Linq To 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

+0

Могу ли я задать еще один вопрос? Я попытался изменить запись в консоль, но почему-то это не работает ... 'foreach (элемент var в xDoc.XPathSelectElements (" // item [(start-with (title, 'VIDEO:'))] "). ToList()) { Console.WriteLine ((string) item.Attribute ("title")); } ' – Storm

+1

@Storm' title' не является атрибутом * элемента. Это субэлемент. Попробуйте элемент item.Element («title»). Значение « – I4V

Смежные вопросы