2016-02-24 29 views
1

的一部分,我想寫一個非常大的XML文檔,所以System.Xml.Linq.XStreamingDocument似乎是理想的解決方案。XStreamingElement作爲一個XDocument

我想我可以構造XDocument來包含XStreamingDocument,並且只有當我呼叫Save()時樹會被遍歷並且可枚舉被迭代。

public void WriteXml(IEnumerable<string> lotsOfStrings, TextWriter output) 
{ 
    var rootElement = new XElement("Root", 
     new XStreamingElement ("Strings", lotsOfStrings.Select(s => new XElement("Line", s)))); 

    var document = new XDocument(rootElement); 
    document.Save(output); 
} 

但事實並非如此。只要我將XStreamingElement添加到包含元素中,它就會遍歷枚舉並生成所有元素。

我打算嵌套幾個要素深這麼久元素列表。在致電XStreamingElement.WriteTo()之前,是否必須使用XmlWriter手動編寫包含結構?這將是有點乏味,並最終與我混合範例(XmlWriterSystem.Xml.Linq)。這似乎確實限制了XStreamingElement的有用性。

還是我失去了構建一個包含流式傳輸內容的文件的一些方法?

+0

當您將它添加到XDocument中時,如何知道它遍歷元素?如果您在調試時顯示了它的值,那麼會導致'.ToString()'被元素迭代調用。 – xjuice

+0

@xjuice我在'Select' lambda中放置了一個斷點。 'document.Save()'被擊中之前碰到了。也可以使用具有副作用的迭代器進行驗證。 –

回答

3

任何包裝在非流式元素(即,XElementXDocument)中的任何東西都會被迭代並立即生成。如果從XElement更改元素類型XStreamingElement,那麼不執行LINQ查詢的時候了。您可以使用XElement爲與LINQ(如您元素)懶洋洋地生成的葉節點,但是你將不得不使用XStreamingElement對於具有不想過早生成動態內容的任何元素。

就可以構建單獨定義嵌套XStreamingElement的更大的結構。我已經在我的代碼示例中通過分別引入字符串元素來演示這一點。您也可以使用自己的Iterators而不是linq查詢來創建動態內容。

最後但並非最不重要,XStreamingElement有方法Save(TextWriter writer),所以你實際上並不需要XDocument要麼。

public static void WriteXml(IEnumerable<string> lotsOfStrings, TextWriter output) 
{ 
    var stringsElement = new XStreamingElement("Strings", 
     lotsOfStrings.Select(s => new XElement("Line", s))); 
    var rootElement = new XStreamingElement("Root", stringsElement); 

    //No XML is generated yet 

    rootElement.Save(output); //Whole XML is generated and saved to output 
} 
+0

邦上。我曾想過爲了輸出XML指令等,我需要將它包裝在一個'XDocument'中,但沒有必要。謝謝。 –