当前位置:  开发笔记 > 编程语言 > 正文

从XmlDocument获取带换行符的缩进XML的最简单方法是什么?

如何解决《从XmlDocument获取带换行符的缩进XML的最简单方法是什么?》经验,为你挑选了7个好方法。

当我从头开始构建XML时XmlDocument,该OuterXml属性已经通过换行符很好地缩进了所有内容.但是,如果我调用LoadXml一些非常"压缩"的XML(没有换行或缩进),那么输出会OuterXml保持这种状态.所以......

从一个实例中获取美化XML输出的最简单方法是XmlDocument什么?



1> Neil C. Obre..:

根据其他答案,我调查XmlTextWriter并提出了以下帮助方法:

static public string Beautify(this XmlDocument doc)
{
    StringBuilder sb = new StringBuilder();
    XmlWriterSettings settings = new XmlWriterSettings
    {
        Indent = true,
        IndentChars = "  ",
        NewLineChars = "\r\n",
        NewLineHandling = NewLineHandling.Replace
    };
    using (XmlWriter writer = XmlWriter.Create(sb, settings)) {
        doc.Save(writer);
    }
    return sb.ToString();
}

它的代码比我希望的要多一些,但它只是很有用.


围绕那个`XmlWriter`的`using`块怎么样?只是为了100%肯定......
您甚至可以考虑将实用程序方法创建为XmlDocument类的扩展方法.
奇怪的是,对我来说除了将xml标头的编码设置为UTF-16之外什么也没做.奇怪的是,即使我明确设置`settings.Encoding = Encoding.UTF8;`,它也会这样做
编码问题可以通过使用带有指定编码的`MemoryStream` +`StreamWriter`而不是`StringBuilder`来解决,并使用`enc.GetString(memstream.GetBuffer(),0,(int)memstream获取文本.长度);`.但最终结果仍然没有格式化.我是否已经从已经有格式化的阅读文档开始了?我只是希望我的新节点也被格式化.
我很想将“ \ r \ n”修改为Environment.Newline。

2> DocMax..:

根据Erika Ehrli的博客改编,应该这样做:

XmlDocument doc = new XmlDocument();
doc.LoadXml("wrench");
// Save the document to a file and auto-indent the output.
using (XmlTextWriter writer = new XmlTextWriter("data.xml", null)) {
    writer.Formatting = Formatting.Indented;
    doc.Save(writer);
}


当调用`Dispose()`时,关闭`using`语句将自动关闭writer.
对我来说,这只是缩进一行.我还有许多其他没有缩进的行.

3> JFK..:

如果您可以访问Linq,甚至更容易

try
{
    RequestPane.Text = System.Xml.Linq.XElement.Parse(RequestPane.Text).ToString();
}
catch (System.Xml.XmlException xex)
{
            displayException("Problem with formating text in Request Pane: ", xex);
}


奇怪的是,这将从XML中删除`<?xml ...?>`和``.确定片段,但不适合完整的文档.

4> Jonathan Mit..:

较短的扩展方法版本

public static string ToIndentedString( this XmlDocument doc )
{
    var stringWriter = new StringWriter(new StringBuilder());
    var xmlTextWriter = new XmlTextWriter(stringWriter) {Formatting = Formatting.Indented};
    doc.Save( xmlTextWriter );
    return stringWriter.ToString();
}



5> Uwe Keim..:

如果为XmlDocument已经包含XmlProcessingInstruction子节点的方法调用上述Beautify方法,则抛出以下异常:

无法编写XML声明.WriteStartDocument方法已经写好了.

这是我原来的修改版本摆脱异常:

private static string beautify(
    XmlDocument doc)
{
    var sb = new StringBuilder();
    var settings =
        new XmlWriterSettings
            {
                Indent = true,
                IndentChars = @"    ",
                NewLineChars = Environment.NewLine,
                NewLineHandling = NewLineHandling.Replace,
            };

    using (var writer = XmlWriter.Create(sb, settings))
    {
        if (doc.ChildNodes[0] is XmlProcessingInstruction)
        {
            doc.RemoveChild(doc.ChildNodes[0]);
        }

        doc.Save(writer);
        return sb.ToString();
    }
}

它现在适用于我,可能你需要扫描节点的所有子XmlProcessingInstruction节点,而不仅仅是第一个节点?


2015年4月更新:

由于我有另一个编码错误的情况,我搜索了如何在没有BOM的情况下强制执行UTF-8.我找到了这篇博客文章并基于它创建了一个函数:

private static string beautify(string xml)
{
    var doc = new XmlDocument();
    doc.LoadXml(xml);

    var settings = new XmlWriterSettings
    {
        Indent = true,
        IndentChars = "\t",
        NewLineChars = Environment.NewLine,
        NewLineHandling = NewLineHandling.Replace,
        Encoding = new UTF8Encoding(false)
    };

    using (var ms = new MemoryStream())
    using (var writer = XmlWriter.Create(ms, settings))
    {
        doc.Save(writer);
        var xmlString = Encoding.UTF8.GetString(ms.ToArray());
        return xmlString;
    }
}


似乎不需要MemoryStream,至少在我这一边。在设置中,我设置:`Encoding = Encoding.UTF8`和`OmitXmlDeclaration = true`

6> benPearce..:
XmlTextWriter xw = new XmlTextWriter(writer);
xw.Formatting = Formatting.Indented;



7> 小智..:
    public static string FormatXml(string xml)
    {
        try
        {
            var doc = XDocument.Parse(xml);
            return doc.ToString();
        }
        catch (Exception)
        {
            return xml;
        }
    }

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有