XStreamingElement 作为 XDocument 的一部分

本文关键字:一部分 XDocument 作为 XStreamingElement | 更新日期: 2023-09-27 18:35:58

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

我以为我能够构造包含XStreamingDocumentXDocument,只有当我调用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的用处。

还是我缺少某种构建包含可流式处理元素的文档的方法?

XStreamingElement 作为 XDocument 的一部分

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

您可以使用单独定义的嵌套XStreamingElement构建更大的结构。我已经在我的代码示例中通过单独引入 String 元素来演示这一点。还可以使用自己的迭代器而不是 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
}