XStreamingElement 作为 XDocument 的一部分
本文关键字:一部分 XDocument 作为 XStreamingElement | 更新日期: 2023-09-27 18:35:58
我想写一个非常大的XML文档,所以System.Xml.Linq.XStreamingDocument
似乎是理想的解决方案。
我以为我能够构造包含XStreamingDocument
的XDocument
,只有当我调用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
手动编写包含结构?这会有点乏味,最终我会混合范式(XmlWriter
和System.Xml.Linq
)。这似乎真的限制了XStreamingElement
的用处。
还是我缺少某种构建包含可流式处理元素的文档的方法?
您包装在非流元素中的任何内容(即 XElement
和 XDocument
) 是立即迭代和生成的。如果将根元素类型从 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
}