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

本文关键字:错误 格式 XML 文件 加载 是否 XDocument | 更新日期: 2023-09-27 17:50:31

我有一个格式错误的XML文件。根标记没有被标记关闭。最后一个标签缺失。

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

StreamReader sr = new StreamReader(path);
batchFile = XDocument.Load(sr); // Exception

我得到一个异常"意外结束文件已经发生。以下元素不关闭:batch。第54行,位置1 "

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

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

您不能在XDocument中这样做,因为该类将加载内存中的所有文档并完全解析它。
但是用XmlReader处理文档是可能的,它会让你读取和处理完整的文档,最后你会得到缺失标签的例外。

我建议使用Tidy。. NET清理杂乱的输入

整洁。. NET有一个很好的API来获得问题列表(MessageCollection)在你的"XML",你可以用它来修复内存中的文本流。最简单的方法是一次修复一个错误,但如果有很多错误,它的性能就不太好了。否则,您可能会以相反的文档顺序修复错误,以便在进行修复时消息的偏移量保持有效

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

/* 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());

你可以做的是在内存中添加结束标记到xml,然后加载它。

在将xml加载到流阅读器中之后,在执行xml load

之前对数据进行操作