大型XML解析高效(Large XML Parsing Efficiently)

2019-10-22 21:57发布

我需要解析大的XML文件,并保存数据到MS SQL数据库表。 很明显的一个方法来写C#程序。 显然,这种提高的性能问题。 你知道处理大型XML任何最快且有效的方式?

Answer 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 ,更高性能的它会。

下面是一些文档:

  • 的XmlReader: https://msdn.microsoft.com/en-us/library/system.xml.xmlreader%28v=vs.110%29.aspx
  • 的XDocument: https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument%28v=vs.110%29.aspx

你这样做当然有其他的选择:

  • SQL Server有XML功能(考虑OPENXML
  • SSIS:你在这里提到内存使用情况的担忧,但它是一个选项。
  • XSLT:可能不是那么好一种选择,因为使用XmlReader在这种情况下,但您可能能够创建XSLT,那么这将创建一个从你的XML SQL查询。


Answer 2:

答案取决于您的方案的细节。 有多大的XML文件? 你是否在数据库中存储的整个XML文件,或只是其中的某些部分? 你存储XML作为数据库中的BLOB,或者是你把不同的元素和属性到他们自己的专用列?

C#将正常工作为您的需求,但也有根据您的情况不同的XML相关的API。

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

但是,如果文件是真的大,你不能一次全部装载整个事情到内存中,那么很可能你会想使用System.Xml.XmlReader,这是一个只进阅读器,你可以用抢的元素,并在同一时间属性之一,并把它们推到你的数据库。



文章来源: Large XML Parsing Efficiently