XDocument:是否可以强制加载格式错误的XML文件?

时间:2011-04-18 09:00:53

标签: c# linq-to-xml

我的格式错误的XML文件。根标签未被标签关闭。最后的标签丢失了。

当我尝试在C#

中加载格式错误的XML文件时
StreamReader sr = new StreamReader(path);
batchFile = XDocument.Load(sr); // Exception

我收到异常“发生了意外的文件结束。以下元素未关闭:批处理。第54行,第1位。

是否可以忽略关闭标记或强制加载?我注意到我所有的XML工具((如XML记事本))都自动修复或忽略了这个问题。我无法修复XML文件。这一个来自第三方软件,有时文件是正确的。

3 个答案:

答案 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加载之前操作数据