大 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 文件。注意前向部分。如果您需要对子节点进行更复杂的操作,您最好结合使用 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
- X文档:https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument%28v=vs.110%29.aspx
你当然还有其他选择:
- SQL 服务器具有 XML 功能(查看
OPENXML
)
- SSIS:您在这里提到了对内存使用的担忧,但这是一个选项。
- XSLT:在这种情况下可能不如使用
XmlReader
好,但您可以创建 XSLT,然后从您的 XML 创建一个 SQL 查询.
我需要解析大型 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 文件。注意前向部分。如果您需要对子节点进行更复杂的操作,您最好结合使用 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
- X文档:https://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument%28v=vs.110%29.aspx
你当然还有其他选择:
- SQL 服务器具有 XML 功能(查看
OPENXML
) - SSIS:您在这里提到了对内存使用的担忧,但这是一个选项。
- XSLT:在这种情况下可能不如使用
XmlReader
好,但您可以创建 XSLT,然后从您的 XML 创建一个 SQL 查询.