我需要解析大的XML文件,并保存数据到MS SQL数据库表。 很明显的一个方法来写C#程序。 显然,这种提高的性能问题。 你知道处理大型XML任何最快且有效的方式?
Answer 1:
如果你想追求一个C#解决方案,考虑XmlReader
。 这会给你只能向前流访问到你的XML文件。 请注意:在一部分。 如果您需要为子节点做更复杂的操作,你可能做的很好使用组合XmlReader
和XDocument
,即装载有大文件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