背景
我收到很多不包含换行符的 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);
}
您面临的问题是因为您在写入格式化的 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);
}