2010-12-03 8 views
0

Ich versuche, einen Standard-CNN-Newsfeed zu lesen, um ihn in eine Tabelle zu schreiben, und er sagt mir, doppelte 'Spaltenspalte Ausnahme'. auf der Linie:C# XmlTextReader und DataSet verursachen doppelte Namensausnahme

cnnds.ReadXml(CNNfeed); 

Hier ist der gesamte Code, und es stoppt den Code und wirft Fehler, wenn es sollte einfach nur doppelte Spalten ignorieren oder die letzte Spalte.

XmlTextReader CNNfeed = new XmlTextReader("http://rss.cnn.com/rss/cnn_topstories.rss"); 

DataSet cnnds = new DataSet("CNN"); 
cnnds.ReadXml(CNNfeed, XmlReadMode.Auto); // read the XML feed 

DataTable CNNNewsFeedTable = new DataTable("CNNNewsFeed"); 

Wie kann ich dieses Problem beheben? Ich habe alles versucht, und der einzige Weg, dies zum Laufen zu bringen, ist, den CNN-Feed nicht richtig zu benutzen.

Ich habe gerade XmlReadMode.ReadSchema geändert und es hat durch diesen Teil, aber dann sagt es cnnds.Tables [1] ist ein Index außerhalb des Bereichs. Als ob es ein leeres XML wäre.

Gibt es eine einfachere Möglichkeit, RSS-Feeds von anderen Websites ohne all diese Ausnahmen und Probleme zu lesen?

Edit: Es scheint ein Hinzufügen von versuchen {} Catch() um es herum, aber redundant, scheint dieses Problem zu umgehen.

+0

Sie sollten nie "new XmlTextReader" verwenden. Es ist seit .NET 2.0 veraltet. Verwenden Sie stattdessen "XmlReader.Create". –

+0

John Saunders: aber der gleiche Fehler erscheint auch für XmlReader. – Muflix

Antwort

2

Wenn Sie die XML-Datei in einem Dataset lesen möchten, benötigen Sie das XML-Schema (andernfalls kann ReadXml() nicht zwischen den verschiedenen Namespaces unterscheiden).

Verwendung:

 var CNNfeed = new XmlTextReader("http://rss.cnn.com/rss/cnn_topstories.rss"); 

     var cnnds = new DataSet("CNN"); 
     cnnds.ReadXmlSchema("http://www.thearchitect.co.uk/schemas/rss-2_0.xsd"); // read the rss schema 
     cnnds.ReadXml(CNNfeed); // read the XML feed 

Aber ich glaube, Sie besser XPath verwenden würde, die Informationen, die Sie finden müssen:

 var doc = XDocument.Load("http://rss.cnn.com/rss/cnn_topstories.rss"); 
     foreach (XElement node in (IEnumerable) doc.XPathEvaluate("//item")) 
     { 
      Console.WriteLine(node.XPathSelectElement("title").Value); 
     } 
+0

Ah, danke für den xPath-Kram, ich habe vergessen, dass es auch in .NET existierte. Ich habe das XmlSchema noch nicht gelesen. Auch für diejenigen, die sich fragen, wie man das programmiert: mit System.Xml.Linq; XDocument doc = XDocument.Load ("http://rss.cnn.com/rss/cnn_topstories.rss"); foreach (XElement-Knoten in (IEnumerable ) doc.XPathEvaluate ("// item")) – Dexter