我想编写一个非常大的 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
手动编写包含结构?这会有点乏味,最终导致我混合范例(XmlWriter
和 System.Xml.Linq
)。这似乎确实限制了 XStreamingElement
的实用性。
或者我是否缺少某种构建包含可流元素的文档的方法?
最佳答案
您包装在非流元素内的任何内容(即 XElement
和 XDocument
)都会立即迭代并生成。如果您将 Root 元素类型从 XElement
更改为至XStreamingElement
,那么 linq 查询不会立即执行。您可以使用XElement
对于使用 linq 延迟生成的叶节点(例如您的 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
}
关于c# - XStreamingElement 作为 XDocument 的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35603582/