我正在嘗試以流方式編寫一個非常大的XML文檔。而不是編寫一個可能消耗太多內存的XDocument
或XElement
,我的想法是,我使用XmlWriter
編寫根元素,然後在關閉根元素之前將多個XElements依次寫入該編寫器。但是,我還沒有找到辦法。爲了模擬的問題,考慮下面的代碼:如何寫一個XElement到一個已經包含內容的XmlWriter
using System;
using System.Xml;
using System.Xml.Linq;
internal static class Program
{
private static void Main()
{
var settings = new XmlWriterSettings { Encoding = Console.OutputEncoding, Indent = true };
using (var writer = XmlWriter.Create(Console.Out, settings))
{
const string namespaceUri = "http://example.com/";
writer.WriteStartElement("x", "root", namespaceUri);
XNamespace x = namespaceUri;
XElement element = new XElement(x + "test");
element.Save(writer);
writer.WriteEndElement();
}
Console.WriteLine();
}
}
程序無法在element.Save(writer);
線,與InvalidOperationException
:「令牌StartDocument狀態元素的開始標記會導致一個無效的XML文檔中」。
此例外的原因很明顯:XElement假定它具有整個XmlWriter全部用於其自身,並且對其調用WriteStartDocument()
。很明顯,這失敗了,因爲該文件已經開始,並且已經有一個開始元素。
請注意,如果我要使用XDocument
,但我不是,我正在使用XElement
,我會期待這種行爲。
另一種方法是寫的
writer.WriteRaw(element.ToString());
代替
element.Save(writer);
它的工作原理,在某種意義上說,它不會崩潰,在這個意義上,它產生正確的XML。
但是,我不喜歡它,因爲它不會產生我期待的乾淨和高效的XML(它不必要地重複名稱空間聲明)。它顯然不能,因爲XElement沒有XmlWriter應該提供的上下文序列化。事實上,它需要一箇中介字符串工作,甚至不是最大的問題。
我應該如何以高效的方式獨立編寫多個XElement
實例到XmlWriter
,以便生成乾淨的XML?或者這是不可能的?
究竟有沒有可能我沒有看到這種方法?無論如何,非常感謝! –