c# - 高效解析大型 XML

标签 c# xml performance parsing xml-parsing

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

最佳答案

如果您想寻求 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 查询。

关于c# - 高效解析大型 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29951809/

相关文章:

java - 在 JAVA 中解析大型 XML 文档

javascript - 如何使用 javascript 将新属性动态插入到 xml 标记中?

java - 快速检查服务器是否有 Activity 的 Web 服务器(多线程)

android - 所有 ViewHolders 同时创建

c# - XML 中缺少标记会阻止 XmlSerializer 创建属性

计算量大的程序的性能测试

c# - 每天在特定时间在 Web 服务上运行预定进程

c# - 通过单独的任务更新 BindingSource 中的元素

c# - 大量警告是否会使 C# 编译时间变长?

java - 将相同的数据插入属于不同服务器的两个表中