如何反序列化一个 XML 的数据表?

How to deseralize an XML thats a DataTable?

我有一个 XML 文件,当我使用 XSD 工具从 XML 创建一个 class 对象时,我收到一条消息说“A column named 'link' 已经属于此 DataTable: 无法将嵌套的 table 设置为相同的名称。

我想知道如何正确反序列化这个 XML 文件,以便我可以在应用程序上显示数据。这个 XML 文件基本上只是 Rss 新闻提要数据。

您可以在此处查看整个 XML 文件结构:https://github.com/karimo94/XMLDemo/blob/master/leaguenews.xml

看看这个设计

https://blogs.windows.com/buildingapps/2017/05/01/master-master-detail-pattern/#.WSrAkFuGID4.twitter#7gkbxLDhEVrcmL6M.97

DataSet ds = new DataSet();
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(DataSet));
        FileStream readStream = new FileStream("leaguenews.xml", FileMode.Open);
        ds = (DataSet)xmlSerializer.Deserialize(readStream);
        readStream.Close();
        dataGridView1.DataSource = ds.Tables[0];

尝试以下:

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")
                });
            }

        }
    }

}

我两种方法都试过了,老实说,我无法正确地反序列化它而没有错误。幸运的是,我能够使用 rss2json.com 并将 Rss 提要转换为 json,我可以使用 Newtonsoft Json.Net

对其进行解析