【问题标题】:Large XML Parsing Efficiently高效地解析大型 XML
【发布时间】:2015-04-29 18:34:27
【问题描述】:

我需要解析大型 XML 文件并将数据保存到 MS SQL DB 表。一种显然是编写 C# 程序的方法。显然,这提出了性能问题。您知道处理大规模 XML 的最快、最有效的方法吗?

【问题讨论】:

  • 您是否已经考虑过使用 SSIS 来处理这个问题,而不是构建自己的工具?
  • 多大是多大? C# 在解析 XML 方面会非常快。
  • 是的,谢谢。 SSIS 是一种选择。但是对于这种情况下的复杂转换,需要并行运行和/或需要使用大量内存的 SSIS 包。还有其他想法吗?
  • @J E Carter II - XML 大小 500 MB 或有时更多。
  • @Henk - 好的。谢谢。这听起来很有希望!还有其他工具/想法吗?房间里有任何 XML 解析冠军吗?

标签: c# xml performance parsing xml-parsing


【解决方案1】:

如果您想寻求 C# 解决方案,请查看 XmlReader。这将使您仅转发流式访问您的 XML 文件。请注意仅向前的部分。如果您需要对子节点进行更复杂的操作,您最好结合使用XmlReaderXDocument,即使用XmlReader 加载大文件,然后使用ReadSubtree() 加载子树进入 XDocuments。例如,如果您的文档是这样的:

<root>
    <big-child-1>
        <grandchild-a>
            ...
        </grandchild-a>
        <grandchild-b>
            ...
        </grandchild-b>
    </big-child-1>
    <big-child-2>
        ... 
    </big-child-2>
</root>

你可以这样做:

XmlReader xr = XmlReader.Create("C:\\file.xml");\
xr.MoveToContent();

while (xr.Read())
{
    if (xr.Name == "grandchild-a")
    {
        XDocument xd = new XDocument(xr.ReadSubTree()); // now you have an XDocument with all the content under the grandchild-a node
    }
    else if (xr.Name == ...)
}

但是,您只需使用XmlReader的次数越多,它的性能就会越好。

这里有一些文档:

当然你还有其他选择:

  • SQL Server 具有 XML 功能(查看 OPENXML
  • SSIS:您在这里提到了对内存使用的担忧,但这是一个选项。
  • XSLT:在这种情况下,可能不如使用 XmlReader 好,但您可以创建 XSLT,然后从您的 XML 创建 SQL 查询。

【讨论】:

    【解决方案2】:

    答案取决于场景的细节。 XML 文件有多大?您是将整个 XML 文件存储在数据库中,还是仅存储其中的某些部分?您是将 XML 作为 blob 存储在数据库中,还是将不同的元素和属性放入它们自己的专用列中?

    C# 可以很好地满足您的需求,但根据您的场景,有不同的 XML 相关 API。

    如果要将整个 XML 文档反序列化为 .NET 对象,则可以在 C# 中定义对象并使用 System.Xml.Serialization.XMLSerializer 将文档加载到内存中。

    但是,如果文档非常大,并且您无法一次将整个内容全部加载到内存中,那么您可能需要使用 System.Xml.XmlReader,这是一个只进的阅读器,您可以使用它一次抓取一个元素和属性,然后将它们推送到您的数据库中。

    【讨论】:

    • 拉吉夫,谢谢。以下是您的问题的几个答案。 1. 我们是将整个 XML 文件存储在数据库中,还是仅存储其中的某些部分? - 可能是整个文件,但不一定。 2. 我们是将 XML 作为 blob 存储在数据库中,还是将不同的元素和属性放入它们自己的专用列中? - 绝对不是一团。不同的节点到不同的表/列。 3. XML 的最大尺寸是多少?接近 500 MB。
    • 好的,那么我建议使用 System.Xml.XmlReader。在 500MB 时,我可能不想将整个内容加载到内存中。 XmlReader 将允许您一次读取(仅转发)XML 文件一点点,并随时插入到数据库中。
    • 如果应用程序所做的只是加载 XML,那么 500MB 对于 32 位进程来说甚至都不算大。为什么要让它变得更复杂?
    • 谢谢。伟大的cmets。任何可能有助于 XML 解析的开源工具/API?比如 .net 的 SAX 等?你们怎么看?我在 Java 环境中使用了 SAX 解析技术,但从未在 .net 中使用过。这是一个微软堆栈。因此,如果您对 .net 开源 XML 解析有任何想法/cmets,请随时与我分享。 - 谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-26
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多