簡體   English   中英

使用 XMLWriter WriteNode 將 XMLReader 轉換為 XML 文件 - 對於大型 XML 非常慢

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

在 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 文件會被部分寫入,因為該文件正在逐節點流式傳輸到節點。

有沒有比XMLWriter WriteNode更快地從XmlReader保存 XML 的XMLWriter WriteNode

(我知道有 .ReadInnerXml() 但這會返回一個不適合 XML 大小的字符串)

導出文件后,需要對其進行轉換(我可能會使用 Saxon,因為 .net 框架沒有證明我想要的性能)並通過 C# 模式驗證它。

我找到了解決方案,使用XmlReader / XMLWriter似乎是一個很好的方法( https://msdn.microsoft.com/en-us/library/ff647804.aspx )只是默認情況下 XMLWriter-WriteNode 將 XML 驗證為它寫道。 由於我們知道從 SQL Server 返回的 XML 是 XML 有效的,並且我們還在發送之前 XSD 驗證所有 XML,因此我們不需要讓編寫器在寫入時執行驗證。 使用CheckCharacters = false將 Settings 對象傳遞給XMLWriter可以防止冗余驗證,並在幾分鍾內輸出文件,而不是幾小時。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM