【问题标题】:XmlReader: Trouble parsing attribute without quotesXmlReader:无法解析不带引号的属性
【发布时间】:2012-08-09 18:52:45
【问题描述】:

我试图解析的一段 HTML 包含一些不带引号的属性值,例如宽度和高度属性:

<img src="/static/logo.png" width=75 height=90 />

在 C# 代码中,阅读器会一直读取到下一个锚标记。

while (reader.ReadToFollowing("a"))

此语句报告 XmlException:

'75' is an unexpected token. The expected token is '"' or '''. Line 16, position 37.

是否有一些 XmlReaderSetting 可以使 XmlReader 更宽松?我无法控制生成的 HTML。

【问题讨论】:

标签: c# xml-parsing html-parsing


【解决方案1】:

为了阅读 HTML,您需要专门为此设计的阅读器。 HtmlAgilityPack 可以在这里为您提供帮助,this answera related question 中提到的 SgmlReader 也可以。

HTML 不是XML。它们都基于SGML,但遵循不同的规则。 XML 具有比 HTML 更严格的规则,其中包括需要关闭所有标签以及用单引号或双引号将属性括起来。因此,除非您正在解析符合 XML 的 XHTML,否则 XmlReader 将无法为您工作。

【讨论】:

  • HtmlAgilityPAck 如何在这里提供帮助?我已经尝试过htmlDoc.OptionFixNestedTags = true; htmlDoc.OptionCheckSyntax = true; htmlDoc.OptionAutoCloseOnEnd = true; htmlDoc.OptionOutputOptimizeAttributeValues = true;,但没有任何效果......
【解决方案2】:

您也可以使用 WebBrowser 控件。将文件加载到其中并从 WebBrowser.Document 属性中获取 HtmlDocument。然后,您可以循环通过控件。

【讨论】:

  • 太好了。最初我使用的是 HtmlAgilityPack,但是对于这个简单的办公实用程序,我不想添加 DLL 依赖项(我想要的是单个 EXE),所以这种 WebBrowser 方法可以正常工作。
  • 这是一个有趣的 hack。感觉有点脏,但我已经可以想到我可能会使用它的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
相关资源
最近更新 更多