2013-12-17 36 views
1

我正在嘗試以流方式編寫一個非常大的XML文檔。而不是編寫一個可能消耗太多內存的XDocumentXElement,我的想法是,我使用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?或者這是不可能的?

回答

7

如果您將element.Save(writer);更改爲element.WriteTo(writer);,則不會出現異常,它似乎寫入控制檯。

+1

究竟有沒有可能我沒有看到這種方法?無論如何,非常感謝! –

相關問題