【问题标题】:Reading XML file and indenting读取 XML 文件并缩进
【发布时间】:2012-02-09 03:39:02
【问题描述】:

我的 XML 文件的缩进一直有问题。每次我从某个服务器加载它们时,XML 节点都会在几行上混杂在一起。我想编写一个快速应用程序来正确缩进节点。那就是:

<name>Bob<name>
<age>24</age>
<address>
  <stnum>2</stnum>
  <street>herp derp st</street>
</address>

目前它是这样出来的:

<name>bob</name><age>24</age>
<address>
      <stnum>2</stnum><street>herp derp st</street>
</address>

因为我无法触摸提供这些 xml 文件的内部程序,并且在没有程序的情况下重新缩进它们需要很长时间,所以我想编写一个快速程序来为我执行此操作。当我使用 XMLdocument 库的东西时,它只读取节点的信息。所以我的问题是,有什么好方法可以逐行读取文件,然后为我重新缩进。所有的xml节点都是一样的。

谢谢。

【问题讨论】:

  • 不要编写代码来读取 XML 文件。请改用内置的 .NET XML 库之一。
  • 为什么重要? XML 对空格不敏感,如果您在 XML 可视化工具中打开它,它会为您处理格式。
  • 只是出于好奇:你为什么关心 xml 缩进?
  • @DBM 我知道是这样,但是在某些节点内部包含 HTML,我需要正确缩进,以便我可以更轻松地阅读/编辑它

标签: c# xml indentation


【解决方案1】:

您可以使用 XmlTextWritter 类。更具体地说,.Formatting = Formatting.Indented。

这是我在这篇博文中找到的一些示例代码。 http://www.yetanotherchris.me/home/2009/9/9/formatting-xml-in-c.html

public static string FormatXml(string inputXml)
{
    XmlDocument document = new XmlDocument();
    document.Load(new StringReader(inputXml));

    StringBuilder builder = new StringBuilder();
    using (XmlTextWriter writer = new XmlTextWriter(new StringWriter(builder)))
    {
        writer.Formatting = Formatting.Indented;
        document.Save(writer);
    }

    return builder.ToString();
}

【讨论】:

    【解决方案2】:

    使用 LINQ to XML,它基本上是单行的:

    public static string Reformat(string xml)
    {
        return XDocument.Parse(xml).ToString();
    }
    

    【讨论】:

    • 谢谢米迦勒。加载文件、格式​​化和保存非常简单:File.WriteAllText(filePath, XDocument.Parse(File.ReadAllText(filePath)).ToString());
    【解决方案3】:

    Visual Studio 或任何体面的 XML 编辑器都可以轻松地格式化(tabify)XML 文档。也有可用的在线工具:

    http://www.xmlformatter.net/

    http://www.shell-tools.net/index.php?op=xml_format

    【讨论】:

      【解决方案4】:

      如果您使用的是 Visual Studio,只需打开 xml 执行 Ctrl+a Ctrl+k Ctrl+F 即可进行格式化。

      【讨论】:

        【解决方案5】:

        您也可以使用 XSLT:

          // This XSLT copies everything but idented
        
          StringReader sr = new StringReader( xsl );
          XmlReader reader = XmlReader.Create(sr);
          XslTransform xslt = new XslTransform();
          xslt.Load(reader);
          xslt.Transform(xmlFileUnidentedPath, xmlFileIdentedPath);
        

        将 xsl 定义为:

        string xsl = @"
        <?xml version=""1.0""?>
        <xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"">
        <xsl:output method=""xml"" omit-xml-declaration=""no"" indent=""yes"" encoding=""US-SCII""/>
        <xsl:strip-space elements=""*""/>
        <xsl:template match=""/"">
          <xsl:copy-of select="".""/>
        </xsl:template>
        </xsl:stylesheet>";
        

        【讨论】:

          猜你喜欢
          • 2012-08-23
          • 1970-01-01
          • 1970-01-01
          • 2014-02-19
          • 2021-09-11
          • 1970-01-01
          • 2020-07-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多