将XML转换为类(反序列化)并将其保存到数据库中

时间:2016-12-28 07:15:00

标签: c# xml deserialization xml-deserialization

您好我有20多个xml文件链接。我搜索了很多来将我的xml转换为c#然后根据类反序列化它然后把它放到数据库中但没有找到一个很好的解决方案。请帮我怎么做。

http://kithnyc.com/sitemap_products_1.xml?from=60594372&to=9586327751

这是数据库的链接,一些xml在

之下
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
<url>
<loc>http://kithnyc.com/</loc>
<changefreq>daily</changefreq>
</url>
<url>
<loc>
http://kithnyc.com/products/adidas-originals-nmd-city-sock-black-blue
</loc>
<lastmod>2016-09-12T11:04:04-04:00</lastmod>
<changefreq>daily</changefreq>
<image:image>
<image:loc>...</image:loc>
<image:title>adidas Originals NMD City Sock - Black / Blue</image:title>
</image:image>
</url>
<url>
<loc>
http://kithnyc.com/products/kith-logo-mousepad-white
</loc>
<lastmod>2016-12-23T00:01:41-05:00</lastmod>
<changefreq>daily</changefreq>
<image:image>
<image:loc>
https://cdn.shopify.com/s/files/1/0094/2252/products/20150810-_MG_2963.jpg?v=1482353363
</image:loc>
<image:title>Kith Logo Mousepad - White</image:title>
</image:image>
</url>
</urlset>

这是我希望将所有节点放在数据库中的xml,例如&#34; Loc&#34; ,&#34; lastmod&#34;和&#34; changefreq&#34;请帮我如何将其转换为类,然后如何反序列化它。感谢

2 个答案:

答案 0 :(得分:0)

嗨,你可以这样做:

步骤1:通过以下行阅读文件

XDocument xdoc = XDocument.Load(filebyte);

步骤2:通过Descendants方法获取xml的所有节点并将其转换为列表。 如果需要应用where子句来过滤该数据。

var pNodelist = xdoc.Root.Descendants().ToList().Where(i => i.Name.LocalName == "p");

步骤3:创建数据表并将所有数据存储在列表中的数据表中,如

DataTable dt = new DataTable();
dt.Columns.Add("StartTime");
dt.Columns.Add("EndTime");
dt.Columns.Add("Message");
foreach (var data in pNodelist)
{
if (data.HasAttributes == true)
dt.Rows.Add(data.FirstAttribute.Value, data.LastAttribute.Value, data.Value);
}

步骤4:然后你可以保存它,你可以避免步骤4并直接将日期从列表存储到数据库

答案 1 :(得分:0)

您可以在代码中添加以下数据类和存储库类。您只需使用filepath调用Repository类并调用其FindAll方法。它将返回Url列表。

 public class Url
{
    public string Loc { get; set; }
    public string Changefreq { get; set; }
    public string Lastmod { get; set; }
    public Image Image { get; set; }

}
public class Image
{
    public string Loc { get; set; }
    public string Title { get; set; }
}
    public class Repository
{
    private XDocument xmlDatas;
    public Repository(string filePath)
    {
        xmlDatas = XDocument.Load(filePath);
    }
    public List<Url> FindAll()
    {
        return xmlDatas.Elements().Elements()
            .Select(url =>
            {
                Url data = new Url();
                foreach (var item in url.Elements())
                {
                    switch (item.Name.LocalName)
                    {
                        case "loc":
                            data.Loc = item.Value;
                            break;
                        case "changefreq":
                            data.Changefreq = item.Value;
                            break;
                        case "lastmod":
                            data.Lastmod = item.Value;
                            break;
                        case "image":
                            Image image = new Image();
                            foreach (var img in item.Elements())
                            {
                                switch (img.Name.LocalName)
                                {
                                    case "loc":
                                        image.Loc = img.Value;
                                        break;
                                    case "title":
                                        image.Title = image.Title;
                                        break;
                                }
                            }
                            data.Image = image;
                            break;
                    }
                    var s = item.Name.LocalName;
                }
                return data;
            }).ToList();
    }
}