XDocument并按需加载过大的XML文件

本文关键字:XML 文件 加载 XDocument | 更新日期: 2023-09-27 18:21:46

我写这段代码是为了读取xml文件的url:

XDocument feedXml = XDocument.Load("url address of xml file here");
        var feeds = from feed in feedXml.Descendants("List")
                    select new Event { 
                        Id = Int32.Parse(feed.Element("ID").Value),
                        Name = feed.Element("Name").Value,                            
                        City = feed.Element("City").Value                            
                    };
        return feeds;

我的问题是文件太大(大约40MB),加载时间太长。所以我使用XmlReader来读取xml文件,但这也不适用,因为我不知道如何根据需要加载每个页面中的每一条记录(例如10条),我应该每次读取整个文件,跳过其他记录来访问适当的元素,不是吗?

string XmlFileUrl = @"url address of xml file here";
        using (XmlReader reader = new XmlTextReader(XmlFileUrl))
        {     
            bool openItem = false;
            Event item = new Event();
            while (reader.Read())
            {                    
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.Name == "List")
                    {
                        item = new Event();
                        openItem = true;
                    }
                    else if (reader.Name == "Name" && openItem)
                        item.Name = reader.ReadElementContentAsString();
                        ...
                }
                else if (reader.NodeType == XmlNodeType.EndElement && reader.Name == "List" && openItem)
                {
                    openItem = false;
                    feeds.Add(item);                                     
                }
            }
        }

有没有任何方法可以使用Jquery ajax或通过分页将xml文件转换为json,在每个页面上加载所需的数据,或者有任何建议?

XDocument并按需加载过大的XML文件

我认为用XML结构实现这一点并不容易,在这种情况下,XDocument.Load可能不是合适的方法,因为AFAIK总是立即加载整个文档。您可以使用Stream参数而不是URL来尝试重载,并尝试通过网络只加载文件的一部分。您可能需要编写自己的加载程序(只获取文件的一部分,可能是XmlDocument?),并自行解析不完整的结构。

如果您可以调用由URI控制的XML文件的部分(例如:http://domain/entries?page=10&take=20,并且此调用返回有效的XML),则可以选择使用此URL而不是指向整个文件的链接,例如:

var pagedUri = @"http://domain/entries?page=10&take=20";
XDocument feedXml = XDocument.Load(pagedUri);
var feeds = from feed in feedXml.Descendants("List")
            select new Event {
                Id = Int32.Parse(feed.Element("ID").Value),
                Name = feed.Element("Name").Value,
                City = feed.Element("City").Value
            };
return feeds;

看看这篇SO的帖子,里面有一个类似的问题。