在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#验证它。
答案 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))
{