XStreamingElement 作为 XDocument 的一部分

XStreamingElement as part of an XDocument

我想写一个非常大的 XML 文档,所以 System.Xml.Linq.XStreamingDocument 似乎是理想的解决方案。

我以为我可以构造 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 的用处。

或者我是否缺少某种构建包含流式元素的文档的方法?

您包装在非流式元素(i.a。XElementXDocument)中的任何内容都会立即迭代并生成。如果将 Root 元素类型从 XElement 更改为 XStreamingElement,则不会立即执行 linq 查询。您可以对使用 linq 延迟生成的叶节点使用 XElement(例如您的 Line 元素),但是您必须对任何元素使用 XStreamingElement具有您不希望过早生成的动态内容。

您可以使用单独定义的嵌套 XStreamingElement 构建更大的结构。我在我的代码示例中通过单独引入 Strings 元素对此进行了演示。您也可以使用自己的 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
}