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:无法解析不带引号的属性的主要内容,如果未能解决你的问题,请参考以下文章
python:解析js中常见的 不带引号的key的 json
Boost tokenizer 无法解析具有双引号字段的 csv 文件
解决json string转object,value值存在英语双引号,无法解析问题。以及遇到value值中有双引号,如何解析成功。