c# - XStreamingElement 作为 XDocument 的一部分

标签 c# .net xml linq-to-xml

我想编写一个非常大的 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 的实用性。

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

最佳答案

您包装在非流元素内的任何内容(即 XElementXDocument )都会立即迭代并生成。如果您将 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/

相关文章:

c# - 如何在 XML 序列化后没有列表元素的包装器元素

c# - c# 100个应用同时写入日志时如何实现同步

c# - 如何将 XDocument 的 XML 内容保存为 .xml 文件?

c# - 我可以向调用基类中 protected 方法的派生类添加扩展方法吗?

c# - 循环内的唯一 ID

c# - 优化查找所有实现 IInterface<T> 的类以及使用特定类型显式实现它的类

c# - System.IO.WriteAllBytes - 访问路径被拒绝错误

c# - 在 C# .NET 中,StringDictionary 没有复制构造函数是有原因的吗?

c# - 使用 java xml api 将 xml 文档保存到文件

html - 在 XML 中显示 HTML 标签