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

时间:2017-01-11 17:11:37

标签: c# xml xmlreader xmlwriter

在C#中,我使用SqlCommand ExecuteXmlReader()来调用SQL Server存储过程,该过程使用' For XML'返回大型(1gb +)复杂XML文件(多层次结构)。

ExecuteXmlReader()返回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文件就会被部分写入,因为文件正在逐个节点地流出。

是否有更好的方法可以更快地从XmlReader而不是XMLWriter WriteNode保存XML?

(我知道有.ReadInnerXml()但是这会返回一个不符合XML大小的字符串)

导出文件后需要对其进行转换(我可能会使用Saxon,因为.net框架并没有像我一样被证明是高效的)并且架构通过C#验证它。

1 个答案:

答案 0 :(得分:1)

我发现使用XmlReader / XMLWriter的解决方案似乎是一种很好的方法(https://msdn.microsoft.com/en-us/library/ff647804.aspx),只是XMLWriter-WriteNode默认在写入时验证XML。因为我们知道从SQL Server返回的XML是XML有效的,并且我们在发送之前XSD验证所有XML,所以我们不需要让编写器在写入时执行验证。将“设置”对象传递给XMLWriter CheckCharacters = false会阻止冗余验证,并在几分钟内将文件输出为几小时。

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

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