大 XML 高效解析

Large XML Parsing Efficiently

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

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

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

如果您想将整个XML文档反序列化为.NET对象,那么您可以在C#中定义您的对象并使用System.Xml.Serialization.XMLSerializer加载文件存入内存。

但是,如果文档真的很大,并且您无法一次性将整个文件加载到内存中,那么您可能会想要使用 System.Xml.XmlReader,这是一个仅向前的 reader,您可以使用它一次获取一个元素和属性,并将它们推入您的数据库。

如果您想寻求 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 服务器具有 XML 功能(查看 OPENXML
  • SSIS:您在这里提到了对内存使用的担忧,但这是一个选项。
  • XSLT:在这种情况下可能不如使用 XmlReader 好,但您可以创建 XSLT,然后从您的 XML 创建一个 SQL 查询.