为什么 XmlWriter 并不总是按照 XmlWriterSettings 中指定的方式格式化 XML?

问题描述 投票:0回答:1

背景
我收到很多不包含换行符的 xml 文件,为了快速格式化它们,我使用下面的函数。

场景
当我第一次在不包含换行符的文件上运行该工具时,它会按预期工作:

Convert("myfile.xml", "  ");

如果我在刚刚格式化的同一文件上再次运行该工具以增加缩进,则缩进不会更改:

Convert("myfile.xml", "    ");

问题
为什么我第二次运行该函数时文件未格式化?如何确保该函数始终格式化文件?

public static void Convert(string filename, string indent)
{
    var input_string = File.ReadAllText(filename, Encoding.UTF8);
    var settings = new XmlWriterSettings
    {
        NewLineHandling = NewLineHandling.Entitize,
        Indent = true,
        IndentChars = indent,
        NewLineChars = Environment.NewLine
    };
    var sb = new StringBuilder();
    using (var reader = XmlReader.Create(new StringReader(input_string)))
    using (var writer = XmlWriter.Create(sb, settings))
    {
        writer.WriteNode(reader, false);
        writer.Close();
    }
    File.Delete(filename);
    Encoding utf8 = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
    File.WriteAllText(filename, sb.ToString(), utf8);
}
c# .net xml xmlwriter
1个回答
0
投票

您面临的问题是因为您在写入格式化的 xml 之前删除了原始文件。当您删除原始文件时,您实际上是删除了从中读取 xml 数据的源,因此当您尝试再次格式化它时,源为空,并且该功能将无法按预期工作。

public static void Convert(string filename, string indent)
{
    var input_string = File.ReadAllText(filename, Encoding.UTF8);
    var settings = new XmlWriterSettings
    {
        NewLineHandling = NewLineHandling.Entitize,
        Indent = true,
        IndentChars = indent,
        NewLineChars = Environment.NewLine
    };
    var sb = new StringBuilder();
    using (var reader = XmlReader.Create(new StringReader(input_string)))
    using (var writer = XmlWriter.Create(sb, settings))
    {
        writer.WriteNode(reader, false);
        writer.Close();
    }

    string tempFileName = Path.GetTempFileName();
    Encoding utf8 = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false);
    File.WriteAllText(tempFileName, sb.ToString(), utf8);
    File.Copy(tempFileName, filename, true);
    File.Delete(tempFileName);
}
© www.soinside.com 2019 - 2024. All rights reserved.