如何将巨大的XML文件转换为关系数据以执行查询

时间:2009-04-14 19:20:26

标签: .net sql-server xml

我至少有100个xml文件,每个文件大约300 MB,电子邮件基本上采用下面列出的格式。

现在我的问题是,我如何将这些数据写入SQL Sever数据库,以便我可以对此数据执行查询。我的疑问将是这样的:某个人是否在特定时期内向某个人发送了一封电子邮件,其中包含某些主题/正文等关键字。

以下是我的尝试:

1)将每个XML文件加载到XML数据类型字段到SQL Server中。通过这种方法,我无法提出Xpath(?)查询来完成我需要的工作。甚至可以在Xpath中执行此操作吗?

2)使用ReadXML和ReadSchema将每个文件加载到.NET DataSet中。这似乎加载正常,它似乎用外键等创建正确数量的DataTable但这意味着我将不得不在数据库上创建100组表。以某种方式将所有连接到一个表中,然后执行查询。

如果你们有任何其他建议,请告诉我。

感谢。

<Message>
<MsgID>4651286700000CAA00EF00010000</MsgID>
<MsgTime>2007-05-21-01.04.39.000000</MsgTime>
<MsgTimeUTC>1179723879</MsgTimeUTC>
<MsgLang>CODE 1252</MsgLang>
<Sender>
    <UserInfo>
        <FirstName>X</FirstName>
        <LastName>Y</LastName>
        <AccountName>121212</AccountName>
        <CorporateEmailAddress>someone@somewhere.com</CorporateEmailAddress>
    </UserInfo>
</Sender>
<Recipient DeliveryType = " ">
    <UserInfo>
        <FirstName>A</FirstName>
        <LastName>B</LastName>
        <FirmNumber>7593</FirmNumber>
        <AccountName>STRATEGIC AS</AccountName>
        <AccountNumber>604806</AccountNumber>
        <CorporateEmailAddress>A@B.COM</CorporateEmailAddress>
    </UserInfo>
</Recipient>
<Subject>
    Please review the following
</Subject>
<Attachment>
    <FileName>37715772.htm</FileName>
    <FileID>503242486522279_37715772.htm</FileID>
    <FileSize>31175</FileSize>
</Attachment>
<MsgBody>
    This is the message Body
</MsgBody>

7 个答案:

答案 0 :(得分:4)

使用 Xml批量加载组件

http://support.microsoft.com/kb/316005

答案 1 :(得分:2)

您可以尝试使用XmlReader.ReadSubtree()来阅读一条消息。将整个文件加载到内存中并不是一个好主意。

将一条消息的数据传递给SQL服务器非常简单,您也可以传递XML并在存储过程中在SQL服务器上解析(使用OPENXML)。

答案 2 :(得分:0)

如果您要查询,为什么不使用XML LINQ来执行此操作。它可能会更简单。

答案 3 :(得分:0)

我使用您提到的ReadXML方法,但一次只在一个XML文件上执行,然后使用DataSet / DataTable Merge方法。只要模式是相同的,它应该继续添加到相同的表(更多行而不是重复的表),并确保每次都处理该文件的XMLDocument或XMLTextReader,这样你就会得到回忆。

完成所有操作后,使用SqlDataAdapter和SqlCommandBuilder自动生成INSERT语句并将其刷新到SQL表中。如果使用Visual Studio的数据资源管理器生成强类型数据集,则会更容易。

您甚至可能希望间歇性地执行此操作并清除数据集,以便保持内存不足。

答案 4 :(得分:0)

使用SQL Server Integration Services。有一个为此任务设计的XML源适配器,有一个方便的设计器,您可以在其中选择XML中的节点或属性,这些节点或属性将变成数据库中的列。

请参阅SSIS小组的this blog post

答案 5 :(得分:0)

如果你需要这样做一次,我会创建一个xslt来将xml转换为SQL insert语句并执行生成的sql脚本来填充表。由于大型xml文件,这不会导致内存问题。

答案 6 :(得分:0)

听起来像数据库不是必需的,只是一种能够查询的方式。如果是这种情况,请尝试XMLMax,它应该在大约20秒内加载300MB xml。它有一个索引的xpath查询,索引应该大约需要15分钟。其他选项是本机xml数据库。 eXistDB是开源的,我有一个用户告诉我他已经使用了千兆字节大小的xml并且非常满意。但它需要花费大量时间来加载,索引并为给定的xml设置它。