【问题标题】:How to transform huge XML files into relational data to perform queries如何将巨大的 XML 文件转换为关系数据以执行查询
【发布时间】:2009-04-14 19:20:25
【问题描述】:

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

现在我的问题是,如何将这些数据导入 SQL Sever 数据库,以便我可以对这些数据执行查询。我的查询大致如下:某个人是否在给定时间段内向另一个人发送了电子邮件,主题/正文等具有某些关键字。

这是我尝试过的:

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

2) 使用 ReadXML 和 ReadSchema 将每个文件加载到 .NET 数据集中。这似乎可以很好地加载,并且似乎使用外键等创建了正确数量的 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>

【问题讨论】:

    标签: .net sql-server xml


    【解决方案1】:

    使用 Xml 批量加载 组件

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

    【讨论】:

    • 不知道我是怎么错过的。感谢所有回复的人。
    【解决方案2】:

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

    然后将一条消息的数据传递给 SQL 服务器很容易,您还可以在存储过程中传递 XML 并在 SQL 服务器上解析它(使用OPENXML)。

    【讨论】:

      【解决方案3】:

      如果您希望进行查询,为什么不直接使用 XML LINQ 来执行此操作呢?它可能会更简单。

      【讨论】:

        【解决方案4】:

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

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

        您甚至可能希望间歇性地执行此操作并清除数据集,以减少内存。

        【讨论】:

          【解决方案5】:

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

          请参阅 SSIS 团队的this blog post

          【讨论】:

            【解决方案6】:

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-06-02
                • 2011-02-15
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多