【问题标题】:Spacing out output with Linq to Xml将输出与 Linq 分隔到 Xml
【发布时间】:2009-12-23 00:15:06
【问题描述】:

如何使用 Linq to Xml 强制一些节点之间的额外间距?我希望输出以下内容:

<root>

    <group>
        <leaf />
    </group>

    <group>
        <leaf />
    </group>

</root>

通过添加 Empty XText,它只会破坏格式。

var root =
    new XElement("root",
        new XText(""),
        new XElement("group",
            new XElement("leaf")),
        new XText(""),
        new XElement("group",
            new XElement("leaf")),
        new XText(""));

Console.WriteLine(root.ToString());

导致

<root><group><child /></group><group><child /></group></root>

【问题讨论】:

    标签: xml linq linq-to-xml


    【解决方案1】:

    这是一个解决方案,但它并不漂亮......

    将 XText 更改为 XComment 并执行类似的操作...

     
        var root =
            new XElement("root",
                new XComment(""),
                new XElement("group",
                    new XElement("leaf")),
                new XComment(""),
                new XElement("group",
                    new XElement("leaf")),
                new XComment(""));
    
        Console.WriteLine(XElementToText(root));
    
    
        private string XElementToText(XElement element)
        {
            var sb = new StringBuilder();
            using (var writer = XmlWriter.Create(sb, 
                new XmlWriterSettings {Indent = true}))
            {
                element.WriteTo(writer);
            }
            return sb.ToString().Replace("<!---->", string.Empty);
        }
    
    

    编辑:Fogott 转义小于 ...

    【讨论】:

    • 哈哈尼克黑客!没想到这个!不是最好的解决方案,但绝对可以完成这项工作
    【解决方案2】:
    using (var writer = XmlWriter.Create(
        Console.Out,
        new XmlWriterSettings { Indent = true })
    {
        root.WriteTo(writer);
    }
    

    【讨论】:

    • 看来我(而不是我一个人)误解了你的问题——你不仅想要缩进,还想要元素之间的空白行。如果需要,您需要插入自己的 XText 节点 - 不是空节点,而是正确数量的 \n 和空格或制表符,以获得您需要的确切缩进。
    • 是的,如果我的问题具有误导性,我很抱歉。 XText 的问题在于,如果将它与 XElements 混合使用,它会破坏格式。必须自己明确添加所有选项卡有点难看。 (即 new XText("\n\t\t"))
    • 它不会破坏格式,真的。它只是禁用自动缩进,因为自动缩进也将是文本节点;通过在此处插入您自己的文本,您是在说您想要这个确切的文本,而不是其他内容(例如一堆额外的空格);所以XmlWriter 尊重这一点。
    【解决方案3】:

    XmlTextWriterFormatting 设置为Formatting.Indented)传递给root.WriteTo()

    例如:

    using(var writer = new XmlTextWriter(Console.Out));
    {
        writer.Formatting = Formatting.Indented;
        root.WriteTo(writer);
    }
    

    【讨论】:

    • XmlTextWriter 已弃用。
    • 官方文档 (msdn.microsoft.com/en-us/library/system.xml.xmltextwriter.aspx) 不同意:“在 .NET Framework 2.0 版本中,推荐的做法是使用 XmlWriter.Create 方法和 XmlWriterSettings 类创建 XmlWriter 实例。这允许您充分利用此版本中引入的所有新功能。有关详细信息,请参阅创建 XML 编写器。"
    • 这并不等同于弃用。 XmlWriter.Create()本质上是一个工厂方法,允许抽象为XmlWriter而不是实例化一个具体的XmlTextWriter。但这只是最佳实践,而不是弃用。现在,诚然,XmlWriter.Create() 确实提供了某些好处,例如比XmlTextWriter 更好地遵守 XML 标准。但同样,这不是弃用。对于手头的问题,你的方式和我的方式都足够正确。
    • XmlWriter.Create 确实是一个工厂方法,但它不会创建XmlTextWriter 的实例。它提供了一组新的 writer 类的访问权限,这些类是其他方式无法访问的(它们都是 internal),并且与旧的 1.x 类(例如 XmlTextWriter)有细微的差别。特别是,XmlTextWriter 执行较少的验证:它不检查元素/属性名称中的重复属性和无效字符,不正确转义目标编码中无法表示的 Unicode 字符等。请参阅tkachenko.com/blog/archives/000584.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    相关资源
    最近更新 更多