XMLReader 到 XML 文件使用 XMLWriter WriteNode - 对于大型 XML 非常慢

XMLReader to XML file using XMLWriter WriteNode - Very Slow for Large XML

在 C# 中,我使用 SqlCommand ExecuteXmlReader() 调用 SQL 服务器存储过程,该过程使用 'For XML' 到 return 大型 (1gb+) 复杂 XML 文件(多层次)。

ExecuteXmlReader() return 一个 XmlReader 我想保存到 XML 文件。为此,我使用 XmlWriter 将数据从 XMLReader 流式传输到文件系统。

using (XmlReader xmlFromDatabase = xmlReaderFromDatabase)
{
  var settings = new XmlWriterSettings {Encoding = Encoding.UTF8, Indent = true};
  using (XmlWriter outputXmlFileToDisk = XmlWriter.Create(fileDirectory + fileName, settings))
  {
    outputXmlFileToDisk.WriteNode(xmlFromDatabase, false);
  }
}

旁注:我无法将整个 XML 加载到内存 (XDocument) 中,因为它太大了。

我的问题是 WriteNode 非常慢 - 写入文件需要几个小时。如果我终止我的应用程序,写入光盘的 XML 文件将被部分写入,因为该文件正在逐个节点地流出。

有没有比 XMLWriter WriteNode 更快地从 XmlReader 保存 XML 的更好方法?

(我知道有 .ReadInnerXml() 但这个 return 是一个字符串,不适合 XML 的大小)

在我导出文件后需要对其进行转换(我可能会使用 Saxon,因为 .net 框架的性能没有我想要的那么好)并通过 C# 对其进行模式验证。

我找到了解决方案,使用 XmlReader/XMLWriter 似乎是采用 (https://msdn.microsoft.com/en-us/library/ff647804.aspx) 的好方法,只是 XMLWriter-WriteNode 默认情况下会验证 XML 如其所写。因为我们知道从 SQL 服务器返回的 XML 是 XML 有效的,我们也 XSD 在发送之前验证所有 XML 我们不需要writer 在写入时执行验证。使用 CheckCharacters = false 将设置对象传递给 XMLWriter 可防止冗余验证并在几分钟内输出文件,而不是几个小时。

var settings = new XmlWriterSettings{
            CheckCharacters = false,
            NewLineHandling = NewLineHandling.None,
            Indent = true,
            Encoding = Encoding.UTF8 };

using (var outputXmlFileToDisk = XmlWriter.Create(fileDirectory + fileName, settings))
{