读取和编写XML作为关系数据 - 最佳实践

时间:2010-09-16 20:25:51

标签: c# sql-server xml xmlreader writexml

我应该做以下事情:
1)读取一个巨大的(700MB~1000万个元素)XML文件;
2)解析它保留订单;
3)使用SQL插入语句创建一个文本(一个或多个)文件,以将其批量加载到DB上;
4)编写关系元组并用XML写回。

我来这里是为了交换一些关于最佳(==快速快速...)方式的想法。我将使用C#4.0和SQL Server 2008。

我相信XmlTextReader是一个良好的开端。但我不知道它是否可以处理如此庞大的文件。是否在实例化时加载所有文件或仅保存内存中的实际读取行?我想我可以做while(reader.Read()),那应该没问题。

编写文本文件的最佳方法是什么?因为我应该保留XML的顺序(采用一些编号模式),我将不得不在内存中保存树的某些部分以进行计算等...我应该使用stringbuilder进行迭代吗?

我将有两个场景:一个节点(元素,属性或文本)将在同一个表中(即,将是同一个对象)和另一个场景,其中对于每种类型的节点(只有这三种类型,没有评论等..)我将在DB中有一个表和一个表示该实体的类。

我的最后一个具体问题是DataSet ds.WriteXml有多好?它会处理10M元组吗?也许最好从数据库中提取块并使用XmlWriter ......我真的不知道。

我正在测试所有这些东西...但我决定发布这个问题来倾听你们的意见,跳跃你的专业知识可以帮助我更正确,更快地完成这些事情。

提前致谢,

Pedro Dusso

2 个答案:

答案 0 :(得分:5)

我会使用SQLXML Bulk Load Component。您为XML提供了一个特殊注释的XSD架构,并为您的关系模型提供了嵌入式映射。然后它可以非常快速地批量加载XML数据。

如果您的XML没有架构,您可以通过加载文件并从XML菜单中选择Create Schema,从visual studio创建一个架构。但是,您需要自己将关系模型添加到关系模型中。 This blog有一些关于如何做到这一点的帖子。

答案 1 :(得分:1)

猜猜是什么?您没有SQL Server问题。你有一个XML问题!

面对你的情况,我会毫不犹豫。我将使用Perl及其众多XML模块之一来解析数据,创建简单的制表符或其他分隔文件以批量加载,并生成结果文件。

使用服务器解析XML有许多缺点:

  1. 不快,很可能
  2. 根据我的经验,积极无用的错误消息
  3. 没有调试器
  4. 当其中一个证明是真的时,无处可转
  5. 另一方面,如果您使用Perl,则需要逐行处理和调试,错误消息旨在指导程序员,如果您的首选软件包不能完成工作,还有许多替代方案。

    如果你经常做这种工作而不懂Perl,那就去学习吧。它会多次报答你。