XmlReader:无法解析不带引号的属性

Posted

技术标签:

【中文标题】XmlReader:无法解析不带引号的属性【英文标题】:XmlReader: Trouble parsing attribute without quotes 【发布时间】: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。

【问题讨论】:

您不应该使用 XmlReader 来解析 HTML,例如,请参阅 [Is there an XmlReader equivalent for HTML in .Net?][1]。 [1]:***.com/questions/6452433/… 【参考方案1】:

为了阅读 HTML,您需要专门为此设计的阅读器。 HtmlAgilityPack 可以在这里为您提供帮助,this answer 到 a 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。感觉有点脏,但我已经可以想到我可能会使用它的情况。

以上是关于XmlReader:无法解析不带引号的属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 和 XMLReader 解析 XML

python:解析js中常见的 不带引号的key的 json

不带www的域名怎么设置解析

PHP XMLReader 解析行 2 次

Boost tokenizer 无法解析具有双引号字段的 csv 文件

解决json string转object,value值存在英语双引号,无法解析问题。以及遇到value值中有双引号,如何解析成功。