解析流程(严格模式)
-
词法分析(Tokenization)
解析器逐字符扫描HTML代码,识别以下元素:<
开头的标签(如<div>
)- 属性(如
class="header"
,XML要求引号不可省略) - (如
Hello World
) - 注释(
<!-- comment -->
)
-
语法分析(构建DOM树)
- 标签闭合检查:XML解析器要求所有标签必须显式闭合(如
<p></p>
),遇到自闭合标签(如<img>
)需写成<img/>
。 - 嵌套验证:检查标签嵌套是否合法(如
<div><span></span></div>
有效,但<div><span></div></span>
会报错)。 - 属性规范:属性值必须用引号包裹(
class="header"
有效,class=header
无效)。
- 标签闭合检查:XML解析器要求所有标签必须显式闭合(如
-
生成DOM树
将解析后的节点按层级关系构建为树形结构:<html> <body> <p>Text</p> </body> </html>
转换为:
ROOT (Document) └── <html> └── <body> └── <p> └── "Text"
解析HTML时的常见问题
XML解析器处理HTML的典型失败场景:
- 未闭合标签(如
<li>Item1
未闭合)→ 报错并停止解析。 - 大小写混合(如
<DIV>
和<div>
视为不同标签)→ 破坏DOM结构一致性。 - 属性语法松散(如
<input type=text>
缺少引号)→ 报错。 - 隐含标签(如
<tr>
直接放在<body>
中)→ 不符合XML嵌套规则。
示例错误:
<body> <p>Hello <!-- 未闭合的P标签 --> <img src="img.png"> <!-- 未自闭合 --> </body>XML解析器会报错并终止,而HTML解析器会自动补全
</p>
并修正为<img/>
。
容错处理机制
部分XML解析器通过扩展功能兼容HTML:
- 标签自动补全:为未闭合标签添加
</p>
或</li>
。 - 结构修复:将
<tr>
自动包裹在<table>
内。 - 实体解析:转换
&
为&
,<
为<
。 - 忽略语法错误:跳过无效属性(如
href=example.com
无引号)。
与专用HTML解析器的关键差异
特性 | XML解析器 | HTML解析器 |
---|---|---|
标签闭合要求 | 必须显式闭合 | 自动推断闭合 |
大小写敏感 | 是(<Div> ≠<div> ) |
否(统一转为小写) |
容错能力 | 低(报错终止) | 高(自动修复) |
遵循标准 | XML 1.0规范 | HTML5解析算法 |
🌐 现实应用:浏览器使用HTML解析器(如WebKit的HTMLTokenizer),而Java的Jsoup、Python的BeautifulSoup等库内置了HTML容错解析逻辑。
何时使用XML解析器解析HTML?
- 严格验证场景:需确保HTML符合XHTML标准(如校验CMS模板)。
- 处理:解析嵌入XML数据的HTML片段(如SVG图标)。
- 替代方案建议:
- 优先选用HTML解析器(如Python的
html.parser
、JavaScript的DOMParser
)。 - 使用Tidy等工具先转换HTML为XHTML格式。
- 优先选用HTML解析器(如Python的
引用说明参考以下规范与技术文档:
- W3C XML 1.0 Specification (Fifth Edition)
- HTML5 Parsing Algorithm (W3C Working Draft)
- Mozilla Developer Network: XML Parser vs HTML Parser
- Java DocumentBuilder API Documentation
实际开发中,建议通过W3C Markup Validation Service检测HTML规范性,确保兼容XML解析需求。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/22554.html