热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在C#中解析XML文件的最快方法?

我必须从Internet加载许多XML文件.但是为了以更好的速度进行测试,我下载了以下格式的所有内容(超过500个文件).

我必须从Internet加载许多XML文件.但是为了以更好的速度进行测试,我下载了以下格式的所有内容(超过500个文件).



36
Adam Gilchrist
Australia
Gilchrist
A Gilchrist
Nov 14, 1971
Left-hand bat
Right-arm offbreak
Wicket-Keeper
Western Australia, New South Wales, ICC World XI, Deccan Chargers, Australia
Deccan Chargers



ODI
287
279
11
9619
172
9922
149
1000+
0
55
417
55
16
96.95
35.89


.
.
.


.
.
.


.
.
.




ODI
378
58
64
3
0
0
19.33
6.62
21.33


.
.
.


.
.
.


.
.
.



我在用

XmlNodeList list = _document.SelectNodes("/player-profile/batting-statistics/odi-stats");

然后使用foreach循环此列表

foreach (XmlNode stats in list)
{
_btMatchType = GetInnerString(stats, "matchtype"); //it returns null string if node not availible
.
.
.
.
_btAvg = Convert.ToDouble(stats["average"].InnerText);
}

即使我正在离线加载所有文件,解析也很慢
有没有更快的解析方法?或者它是SQL的问题?我正在使用带有插入命令的DataSet,TableAdapters将所有提取的数据从XML保存到数据库.

编辑:现在使用XmlReader请为上面的文档提供一些XmlReader代码.现在,我做到了这一点

void Load(string url)
{
_reader = XmlReader.Create(url);
while (_reader.Read())
{
}
}

XmlReader的可用方法令人困惑.我需要的是完全击球和保龄球数据,击球和保龄球统计数据是不同的,而odi,t2o,ipl等在保龄球和击球中是相同的.

解决方法:

抛出异常的开销可能使XML解析的开销相形见绌.您需要重写代码,以便它不会抛出异常.

一种方法是在询问元素之前检查元素是否存在.这将有效,但它是很多代码.另一种方法是使用地图:

Dictionary map = new Dictionary
{
{ "matchtype", null },
{ "matches", null },
{ "ballsbowled", null }
};
foreach (XmlElement elm in stats.SelectNodes("*"))
{
if (map.ContainsKey(elm.Name))
{
map[elm.Name] = elm.InnerText;
}
}

此代码将处理您关注其名称的所有元素,并忽略您不关注的元素.如果map中的值为null,则表示具有该名称的元素不存在(或没有文本).

实际上,如果您将数据放入DataTable中,并且DataTable中的列名与XML中的元素名相同,则甚至不需要构建映射,因为DataTable.Columns属性是你需要的所有地图.此外,由于DataColumn知道它包含哪种数据类型,因此您无需在代码中复制该知识:

foreach (XmlElement elm in stats.SelectNodes("*"))
{
if (myTable.Columns.Contains(elm.Name))
{
DataColumn c = myTable.Columns[elm.Name];
if (c.DataType == typeof(string))
{
myRow[elm.Name] = elm.InnerText;
continue;
}
if (c.DataType == typeof(double))
{
myRow[elm.Name] = Convert.ToDouble(elm.InnerText);
continue;
}
throw new InvalidOperationException("I didn't implement conversion logic for " + c.DataType.ToString() + ".");
}
}

请注意我没有声明任何变量来存储这些信息,所以我没有机会搞砸并声明一个与它存储的列不同的数据类型的变量,或者在我的表中创建一个列并忘记实现填充它的逻辑.

编辑

好的,这里的东西有点棘手.这是Python中非常常见的技术;在C#中我认为大多数人仍然认为它有些奇怪.

如果你看看我给出的第二个例子,你可以看到它正在使用DataColumn中的元信息来确定用于将元素的值从文本转换为其基类型的逻辑.您可以通过构建自己的地图来完成同样的事情,例如:

Dictionary typeMap = new Dictionary
{
{ "matchtype", typeof(string) },
{ "matches", typeof(int) },
{ "ballsbowled", typeof(int) }
}

然后做我在第二个例子中展示的相同的东西:

if (typeMap[elm.Name] == typeof(int))
{
result[elm.Name] = Convert.ToInt32(elm.Text);
continue;
}

您的结果不再是字典,因为现在它们可以包含非字符串的内容;它们必须是Dictionary.

但这种逻辑看起来有点笨拙;你正在多次测试每个项目,有继续声明要突破它 – 它并不可怕,但它可能更简洁.怎么样?通过使用另一个映射,将类型映射到转换函数:

Dictionary> cOnversionMap=
new Dictionary>
{
{ typeof(string), (x => x) },
{ typeof(int), (x => Convert.ToInt32(x)) },
{ typeof(double), (x => Convert.ToDouble(x)) },
{ typeof(DateTime), (x => Convert.ToDateTime(x) }
};

如果你不习惯lambda表达式,这有点难以阅读.类型Func指定一个以字符串作为参数并返回对象的函数.这就是该映射中的值是什么:它们是lambda表达式,也就是说函数.它们采用字符串参数(x),然后返回一个对象. (我们怎么知道x是一个字符串?Func告诉我们.)

这意味着转换元素可以占用一行代码:

result[elm.Name] = conversionMap[typeMap[elm.Name]](elm.Text);

从内部表达式转到外部表达式:这会在typeMap中查找元素的类型,然后在conversionMap中查找转换函数,并调用该函数,并将其作为参数传递给elm.Text.

在您的情况下,这可能不是理想的方法.我真的不知道.我在这里展示它是因为有一个更大的问题在起作用.正如Steve McConnell在Code Complete中指出的那样,调试数据比调试代码更容易.此技术允许您将程序逻辑转换为数据.在某些情况下,使用此技术可以大大简化程序的结构.值得了解.


推荐阅读
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
author-avatar
冷嘲热讽714
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有