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

C# XDocument:是否可以强制加载格式错误的XML文件?,c#,linq-to-xml,C#,Linq To Xml,我有一个格式不正确的XML文件。根标记未被标记关闭。最后一个标签丢失了 当我试图在C#中加载格式错误的XML文件时 我得到一个异常“发生了意外的文件结尾。以下元素未关闭:批处理。第54行,位置1。” 是否可以忽略关闭标签或强制加载?我注意到我所有的XML工具(比如XML记事本)都会自动修复或忽略这个问题。我无法修复XML文件。这是来自第三方软件的copme,有时文件是正确的。您可以将结束标记添加到内存中的xml中,然后加载它 因此,在将xml加载到streamreader中之后,在执行xml加载

我有一个格式不正确的XML文件。根标记未被标记关闭。最后一个标签丢失了

当我试图在C#中加载格式错误的XML文件时

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


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

您可以将结束标记添加到内存中的xml中,然后加载它


因此,在将xml加载到streamreader中之后,在执行xml加载之前操作数据

您不能使用
XDocument
执行此操作,因为此类将加载内存中的所有文档并对其进行完整解析。
但使用
XmlReader处理文档是可能的,它可以让您阅读并处理完整的文档,最后您会得到缺少的标记验证。

我建议使用来清理混乱的输入

Tidy.NET有一个很好的API来获取“XML”中的问题列表(
MessageCollection
),您可以使用它来修复内存中的文本流。最简单的方法是一次修复一个错误,但如果有很多错误,这将无法很好地执行。否则,您可能会以相反的文档顺序修复错误,以便在进行修复时消息的偏移量保持有效

下面是一个将HTML输入转换为XHTML的示例:

整洁的,整洁的


添加一个示例代码段来转换HTML->XHTMLI,这在XML中无法很好地实现。除非我遗漏了Tidy.NET不是为XML设计的。Tidy旨在对不可靠的HTML进行消毒。因为XHTML存在,所以值得一试;tidy.Options.TidyMark=false;tidy.Options.XmlTags=true
但是Tidy.NET在PPrint.cs中崩溃了。我仍在研究这种方法。
StreamReader sr = new StreamReader(path);
batchFile = XDocument.Load(sr); // Exception
/* 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());