我至少有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>
答案 0 :(得分:4)
使用 Xml批量加载组件
答案 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设置它。