读取XML文件和缩进

时间:2012-02-09 03:39:03

标签: c# xml indentation

我的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节点都是相同的。

感谢。

5 个答案:

答案 0 :(得分:5)

您可以使用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();
}

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

http://www.xmlformatter.net/

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您也可以使用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>";