如何在 c# asp.net mvc 3 中反序列化未知的大型 xml 文件

本文关键字:未知 反序列化 大型 文件 xml asp mvc net | 更新日期: 2023-09-27 17:56:07

我几乎 asp.net mvc 3应用程序编写了一个"网上商店",我想用一个网上商店的一些项目填充我的数据库。它们在 xml 文件中为其合作伙伴提供有关项的信息。我已经下载了一个,但它是 150 MB,所以我不能只是打开它并查看内容。

文件中的信息也不会完全匹配我的模型,所以我需要以某种方式"合并"东西。我该怎么做?也许您知道一些关于如何下载xml并对其进行反序列化的精彩教程?

如何在 c# asp.net mvc 3 中反序列化未知的大型 xml 文件

LINQ to XML 是一个了不起的提供程序。它将允许您以 XElements 的形式查询您的 XML 文档。

using System.Xml.Linq;

如果可以通过它们提供的任何 uri 下载代码中的 xml,则可以通过 System.IO.File 将其加载到内存中,并使用 LINQ to XML 对其进行操作。

string xml = new WebClient().DownloadString(url);
XDocument doc = XDocument.Parse(xml);
//item being the name of the node
var itemDescendent = doc.Descendants("item"); 
var query = from item in itemDescendent
            select new
            {
               itemId = item.Attribute("id"),
               itemName = item.Attribute("Name")
            };
foreach (item in query)
{
   //dostuff
}

这将从节点中选择属性,您需要一种略有不同的方法来获取节点内的节点。

使用这个或这个

 using System;
    using System.IO;
    using System.Xml.Serialization;
namespace xmlTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var articles = new Articles();
            articles.ArticleArray = new ArticlesArticle[2]
            {
                new ArticlesArticle()
                    {
                        Guid = Guid.NewGuid(),
                        Order = 1,
                        Type = "deal_abstract",
                        Title = "Abu Dhabi...",
                        Summary = "Abu Dhabi...",
                        ArticleDate = new DateTime(2011,2,24)
                    },
                new ArticlesArticle()
                    {
                        Guid = Guid.NewGuid(),
                        Order = 2,
                        Type = "deal_abstract",
                        Title = "Abu Dhabi...",
                        Summary = "China...",
                        ArticleDate = new DateTime(2011,2,23)
                    },
            };
            var sw = new StringWriter();
            var xmlSer = new XmlSerializer(typeof (Articles));
            var noNamespaces = new XmlSerializerNamespaces();
            noNamespaces.Add("", ""); 
            xmlSer.Serialize(sw, articles,noNamespaces);
            Console.WriteLine(sw.ToString());
        }
    }
    [XmlRoot(ElementName = "articles", Namespace = "", IsNullable = false)]
    public class Articles
    {
        [XmlElement("article")]
        public ArticlesArticle[] ArticleArray { get; set; }
    }
    public class ArticlesArticle
    {
        [XmlElement("guid")]
        public Guid Guid { get; set; }
        [XmlElement("order")]
        public int Order { get; set; }
        [XmlElement("type")]
        public string Type { get; set; }
        [XmlElement("textType")]
        public string TextType { get; set; }
        [XmlElement("id")]
        public int Id { get; set; }
        [XmlElement("title")]
        public string Title { get; set; }
        [XmlElement("summary")]
        public string Summary { get; set; }
        [XmlElement("readmore")]
        public string Readmore { get; set; }
        [XmlElement("fileName")]
        public string FileName { get; set; }
        [XmlElement("articleDate")]
        public DateTime ArticleDate { get; set; }
        [XmlElement("articleDateType")]
        public string ArticleDateType { get; set; }
    }
}