我的格式错误的XML文件。根标签未被标签关闭。最后的标签丢失了。
当我尝试在C#
中加载格式错误的XML文件时StreamReader sr = new StreamReader(path);
batchFile = XDocument.Load(sr); // Exception
我收到异常“发生了意外的文件结束。以下元素未关闭:批处理。第54行,第1位。”
是否可以忽略关闭标记或强制加载?我注意到我所有的XML工具((如XML记事本))都自动修复或忽略了这个问题。我无法修复XML文件。这一个来自第三方软件,有时文件是正确的。
答案 0 :(得分:3)
您无法使用XDocument
执行此操作,因为此类会将所有文档加载到内存中并完整地解析它。
但是可以使用XmlReader
来处理文档,它可以让您阅读并处理完整的文档,最后您将丢失标记异常。
答案 1 :(得分:3)
我建议使用Tidy.NET来清理凌乱的输入
Tidy.NET有一个很好的API来获取“XML”中的问题列表(MessageCollection
),您可以使用它来修复内存中的文本流。最简单的方法是一次修复一个错误,认为对于许多错误执行不会很好。否则,您可能会按反向文档顺序修复错误,以便在执行修复时消息的偏移量保持有效
以下是将HTML输入转换为XHTML的示例:
Tidy tidy = new Tidy();
/* Set the options you want */
tidy.Options.DocType = DocType.Strict;
tidy.Options.DropFontTags = true;
tidy.Options.LogicalEmphasis = true;
tidy.Options.Xhtml = true;
tidy.Options.XmlOut = true;
tidy.Options.MakeClean = true;
tidy.Options.TidyMark = false;
/* Declare the parameters that is needed */
TidyMessageCollection tmc = new TidyMessageCollection();
MemoryStream input = new MemoryStream();
MemoryStream output = new MemoryStream();
byte[] byteArray = Encoding.UTF8.GetBytes("Put your HTML here...");
input.Write(byteArray, 0 , byteArray.Length);
input.Position = 0;
tidy.Parse(input, output, tmc);
string result = Encoding.UTF8.GetString(output.ToArray());
答案 2 :(得分:1)
你可以做的是将结束标记添加到内存中的xml然后加载它。
因此,在将xml加载到streamreader之后,在执行xml加载之前操作数据