![](/img/trans.png)
[英]XmlWriter.WriteNode(XmlReader) writes invalid XML using memory streams
[英]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.