【问题标题】:XDocument : is it possible to force the load of a malformed XML file?XDocument:是否可以强制加载格式错误的 XML 文件?
【发布时间】:2011-04-18 09:00:52
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案1】:

    你不能用 XDocument 来做,因为这个类将所有文档加载到内存中并完整地解析它。
    但是它可以使用XmlReader 处理文档,它会让你阅读和处理完整的文档,最后你会得到缺少标签的异常。

    【讨论】:

      【解决方案2】:

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

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

      这是一个将 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());
      

      【讨论】:

      • 添加示例 sn-p 以转换 HTML -> XHTML
      • 我没有很好地使用 XML。除非我遗漏了一些 Tidy.NET 不是为 XML 设计的。
      • 是的。 Tidy 旨在清理不稳定的 HTML。因为存在 XHTML,所以值得一试。
      • 我已经到了tidy.Options.XmlOut = true; tidy.Options.TidyMark = false; tidy.Options.XmlTags = true; 但是 Tidy.NET 在 PPrint.cs 的内部崩溃了。我仍在研究这种方法。
      【解决方案3】:

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

      所以在将 xml 加载到 streamreader 之后,在进行 xml 加载之前操作数据

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多