[英]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.