2017-06-04 4 views
0

J'ai un fichier XML, et quand j'ai utilisé l'outil XSD pour créer un objet de classe à partir du XML, je reçois un message disant "Une colonne nommée 'link' appartient déjà à cette DataTable: impossible de définir une table imbriquée au même nom .Comment désertifier un XML c'est un DataTable?

Je veux savoir comment je peux correctement désérialiser ce fichier XML afin que je puisse afficher les données sur une application. ce fichier XML est fondamentalement juste des données de flux de nouvelles RSS.

Vous pouvez voir le fichier XML entier Structure ici: https://github.com/karimo94/XMLDemo/blob/master/leaguenews.xml

+0

Nous devons voir un [mcve] qui comprend un exemple de XML pour être sûr de ce qui se passe , mais vous pouvez essayer de générer des POCO en utilisant l'option xsd.exe ['/classes'](https://msdn.microsoft.com/en-us/library/x6c1kb0s(v=vs.110).aspx) plutôt qu'un 'DataSet' en utilisant'/dataset'. – dbc

+0

Connexes? [L'erreur de retour de code Une colonne nommée 'link' appartient déjà] (https://stackoverflow.com/q/18209393/3744182). – dbc

+0

Pour utiliser RSS, vous pouvez utiliser [SyndicationFeed] (https://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.syndicationfeed (v = vs.110) .aspx) class. –

Répondre

0

J'ai essayé les deux sens et honnêtement, je ne pouvais pas obtenir désérialiser correctement sans erreurs. Heureusement, j'ai été capable d'utiliser rss2json.com et cela a converti le flux Rss dans un json que je pourrais analyser en utilisant Newtonsoft Json.Net

0

Essayez followng:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.Data; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test1.xml"; 
     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 

      dt.Columns.Add("Title", typeof(string)); 
      dt.Columns.Add("Description", typeof(string)); 
      dt.Columns.Add("Link", typeof(string)); 
      dt.Columns.Add("IsPermaLink", typeof(Boolean)); 
      dt.Columns.Add("GUID", typeof(string)); 
      dt.Columns.Add("Publish Date", typeof(DateTime)); 
      dt.Columns.Add("Width", typeof(int)); 
      dt.Columns.Add("Height", typeof(int)); 
      dt.Columns.Add("URL", typeof(string)); 

      XDocument doc = XDocument.Load(FILENAME); //or uri 
      List<XElement> items = doc.Descendants("item").ToList(); 

      foreach (XElement item in items) 
      { 
       dt.Rows.Add(new object[] { 
        (string)item.Element("title"), 
        (string)item.Element("description"), 
        (string)item.Element("link"), 
        (Boolean)item.Element("guid").Attribute("isPermaLink"), 
        (string)item.Element("guid"), 
        (DateTime)item.Element("pubDate"), 
        (int)item.Elements().Where(x => x.Name.LocalName == "thumbnail").FirstOrDefault().Attribute("width"), 
        (int)item.Elements().Where(x => x.Name.LocalName == "thumbnail").FirstOrDefault().Attribute("height"), 
        (string)item.Elements().Where(x => x.Name.LocalName == "thumbnail").FirstOrDefault().Attribute("url") 
       }); 
      } 

     } 
    } 

}