C# 读取大型Xml文件
这篇博客将介绍在C#中如何读取数据量很大的Xml文件。请看下面的Xml文件,
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<book id="bk101">
<author>Gambardella, Matthew</author>
<title>C# developer</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>An in-depth look at creating applications
with XML.</description>
</book>
<book id="bk102">
<author>Ralls, Kim</author>
<title>Midnight Rain</title>
<genre>Fantasy</genre>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.</description>
</book>
</catalog>
使用LINQ TO XML会很方便的处理这个Xml文件,例如我们要获取Book的数量
XElement doc = XElement.Load("Book.xml");
var books = from book in doc.Descendants("book")
where book.Attribute("id").Value != "bk109"
select book;
Console.WriteLine("Books count: {0}", books.Count());
非常方便快捷的可以得到结果。但是当Xml文件很大时(例如,XML文件50M),使用这种方式读取会很慢。这是因为XElement会将这个Xml文档一次性的加载到内存中,在内存中需要维护XML的DOM模型,会消耗很多的内存。使用XmlDocument操作大Xml文件结果也是一样。
当遇到大型的Xml文件,使用XmlReader来处理。请看下面的代码;
public static IEnumerable<Book> Books(this XmlReader source)
{
while (source.Read())
{
if (source.NodeType == XmlNodeType.Element &&
source.Name == "book")
{
string id = source.GetAttribute("id"); int count = source.AttributeCount; string content = source.ReadInnerXml(); string formated = string.Format("<book>{0}</book>", content); XElement element = XElement.Parse(formated); yield return new Book
{
Id = id, Author = element.Element("author").Value, Title = element.Element("title").Value, Description = element.Element("description").Value
};
}
}
}
using (XmlReader reader = XmlReader.Create("Book.xml"))
{
Console.WriteLine("Books count: {0}", reader.Books().Count());
}
使用XmlReader读取Xml文件时,不会一次性将Xml文件读取到内存中。处理大型Xml文件的效率比XmlDocument/LINQ TO Xml高很多。
感谢您的阅读。
C# 读取大型Xml文件的更多相关文章
- XmlReader和XElement组合之读取大型xml文档
简介 在.NET framework 中存在大量操作xml数据的类库和api,但在.NET framework 3.5后我们的首选一般就是linq to xml. linq to xml操作xml数据 ...
- C# - 操作大型XML文件
对于小型XML文件,利用XDocument和XMLDocument可以很方便进行读写(推荐XDocument),但问题是XDocument和XMLDocument是In-Memory类型的,随着文件大 ...
- boost::property_tree读取解析.xml文件
boost::property_tree读取解析.xml文件 1)read_xml 支持中文路径 boost::property_tree::wptree wpt; std::locale:: ...
- XML解析之sax解析案例(一)读取contact.xml文件,完整输出文档内容
一.新建Demo2类: import java.io.File; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXPar ...
- UE4读取本地XML文件
其实这里读取XML也是利用了Tinyxml来读取xml,主要是讲Tinyxml放在UE4中,遇到的一点点坑 1.先给出Tinyxml链接:http://www.grinninglizard.com/t ...
- python读取/创建XML文件
Python中定义了很多处理XML的函数,如xml.dom,它会在处理文件之前,将根据xml文件构建的树状数据存在内存.还有xml.sax,它实现了SAX API,这个模块牺牲了便捷性,换取了速度和减 ...
- C# 创建 读取 更新 XML文件
public static class XmlHelper { /// <summary> /// 读取节点值 /// </summary> /// <param nam ...
- IoC COntainer Create Javabeans 可以通过读取beans.xml 文件来创建一个应用程序上下文对象 依赖反转
Spring初学快速入门 - Spring教程™ https://www.yiibai.com/spring/spring-tutorial-for-beginners.html# pom <? ...
- C# 读取保存xml文件
直接读取xml文件中的内容 XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(result); XmlNode root = xmlDoc. ...
随机推荐
- 调出CorelDRAW新工具栏的方法
CorelDRAW中允许用户自定义调出新工具栏.当使用CorelDRAW软件某一工具.命令频率较高时,对于不同的设计师来说会有不同的习惯的,有的喜欢中规中矩的按部就班的操作,有的则喜欢用右键快速调用, ...
- 【BZOJ-3039&1057】玉蟾宫&棋盘制作 悬线法
3039: 玉蟾宫 Time Limit: 2 Sec Memory Limit: 128 MBSubmit: 753 Solved: 444[Submit][Status][Discuss] D ...
- (转)MySQL索引原理及慢查询优化
转自美团技术博客,原文地址:http://tech.meituan.com/mysql-index.html 建索引的一些原则: 1.最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到 ...
- arguments
arguments 转数组 通常使用下面的方法来将 arguments 转换成数组: Array.prototype.slice.call(arguments); 还有一个更简短的写法: [].sli ...
- JQuery常用代码汇总
获取<input />的value $("#id").val( ); 标签间的html $("#id").html('<tr><t ...
- python 3编码
python 3和2很大区别就是python本身改为默认用unicode编码. 字符串不再区分"abc"和u"abc", 字符串"abc"默 ...
- JSP脚本中的9个内置对象
JSP脚本中包含9个内置对象,这9个内置对象都是Servlet API接口的实例,只是JSP规范对它们进行了默认初始化.也就是说它们已经是对象,可以直接使用. 我们随意打开一个由JSP页面生成的Ser ...
- PHP文件包含漏洞攻防实战(allow_url_fopen、open_basedir)
摘要 PHP是一种非常流行的Web开发语言,互联网上的许多Web应用都是利用PHP开发的.而在利用PHP开发的Web应用中,PHP文件包含漏洞是一种常见的漏洞.利用PHP文件包含漏洞入侵网站也是主流的 ...
- shell--2.shell数组
shell 数组 (1)定义数组 shell中,用括号表示数组,数组元素用空格分开,定义数组的一般形式 arrt_name=(val1 val2 val3) 或者 arry_name=(val1 va ...
- DAY5 DVWA之SQL注入演练(low)
1.设置 把安全等级先调整为low,让自己获得点信心,免得一来就被打脸. 2.测试和分析页面的功能 这里有一个输入框 根据上面的提示,输入用户的id.然后我们输入之后,发现它返回了关于这个 ...