DOM方式解析XML的时候encoding属性的作用

简介: DOM方式解析XML的时候encoding属性的作用

1.规定

W3C定义了三条XML解析器如何正确读取XML文件的编码的规则:

  1. 如果文本文件头部有BOM(Byte Order Mark),即字节顺序标记(它是在Unicode编码标准中用于标识文件是采用哪种格式的编码),就按照BOM来。
  2. 如果没有BOM,就查看XML声明的编码属性。
  3. 如果上述两个都没有,就假定XML文档采用UTF-8编码。

也就是说XML解析器首先根据文件的BOM来解析文件;如果没找到BOM,由用XML里的encoding属性指定的编码;如果xml里encoding没指定的话,就默认用utf-8来解析文档。然后又可以推出,BOM和ENCODING都有的话,则以BOM指定的为准。

2实际DOM解析的时候或者是浏览器解析XML的规则

但是对于DOM(这里以Dom4j为例)解析的时候或者是浏览器解析XML的时候,会省略第一步(本人亲自尝试,例子如下所示),直接就查看XML声明的编码属性,然后用其声明的方式进行解码。如果没有在xml中声明编码方式,就假定XML文档采用UTF-8编码。

关于识别XML的理解:因为无论是哪种编码都是兼容ASCII的,所以XML解析器能够正常读取xml的头部声明,然后在读取xml声明中的encoding,向解析器说明以哪种编码方式解析ascii之外的字符,如果未找到xml头部声明或头部声明中没有encoding属性,则默认为utf-8编码。

2.1如果出现以下几种情况XML解析将会出错:(用上述规则进行分析)

一.编码格式为UTF-8(无BOM),xml声明为encoding=“GBK”
在这里插入图片描述
Dom4j解析出现乱码:
在这里插入图片描述
二.编码格式为UTF-8(有BOM),xml声明为encoding=“GBK”
在这里插入图片描述
Dom4j解析也出现乱码:
在这里插入图片描述
三.编码格式为GB2312(GBK包含了GB2312),xml声明为encoding=“UTF-8”
在这里插入图片描述
Dom4j解析时直接报错:
在这里插入图片描述
四.编码格式为GB2312(GBK包含了GB2312),xml声明中无encoding"
在这里插入图片描述
Dom4j解析时直接报错(因为没指定默认为UTF-8):
在这里插入图片描述

2.2出现如下几种情况正常解析

五.编码格式为GB2312(GBK包含了GB2312),xml声明为encoding=“GBK”
在这里插入图片描述

Dom4j正常解析XML:
在这里插入图片描述
六.编码格式为UTF-8(有无BOM都可以),xml声明为encoding=“GBK”
在这里插入图片描述
Dom4j正常解析XML:
在这里插入图片描述
七.编码格式为UTF-8(有无BOM都可以),xml声明中无encoding"
在这里插入图片描述
Dom4j正常解析XML(因为没指定默认为UTF-8):

在这里插入图片描述
八.编码格式为UTF-8(有无BOM都可以),无xml声明"
在这里插入图片描述
Dom4j正常解析XML(因为没指定默认为UTF-8):
在这里插入图片描述

3.Dom4j解析中的编码

在Dom4j把XML解析成document对象后,可以看到其读取到的xml声明encoding="UTF-8”,其默认的编码格式也是UTF-8,如下图:
在这里插入图片描述

4.这里对BOM说明一下(了解的同学可跳过该部分)

它是在Unicode编码标准中用于标识文件是采用哪种格式的编码。比如:
UTF-8 (文本文件头部的BOM为:EF BB BF)、
UTF-16(大端序)(文本文件头部的BOM为:FE FF)、
UTF-16(小端序)(文本文件头部的BOM为:FF FE)、
UTF-32或UCS-(大端序)(文本文件头部的BOM为:00 00 FE FF)
UTF-32(小端序)(文本文件头部的BOM为:FF FE 00 00)

Ps:
第一点:
这里说一下大小端:
对于0xABCD在内存中存储方式如下:
大端(Big-Endian):
低地址 -----> 高地址 0xAB 0xCD
小端:(Little- Endian):
低地址 -----> 高地址 0xCD 0xAB

第二点:
UTF-8 是可变长编码,不需要 BOM 来表明字节顺序,但可以用 BOM 来表明编码方式。字符 “Zero Width No-Break Space” 的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。Windows 就是使用 BOM 来标记文本文件的编码方式的。

Zero Width No-Break Space是什么?
在UCS 编码中有一个叫做 “Zero Width No-Break Space” ,中文译名作“零宽无间断间隔”的字符,它的编码是 FEFF。而 FEFF 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输字符 “Zero Width No-Break Space”。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian 的;如果收到FFFE,就表明这个字节流是 Little- Endian 的。因此字符 “Zero Width No-Break Space” (“零宽无间断间隔”)又被称作 BOM。

UCS 编码是什么?
Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。而文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。
为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。
要注意,UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。

            </div>
目录
相关文章
|
JavaScript 前端开发 Go
CSS 与 JS 对 DOM 解析和渲染的影响
【10月更文挑战第16天】CSS 和 JS 会在一定程度上影响 DOM 解析和渲染,了解它们之间的相互作用以及采取适当的优化措施是非常重要的。通过合理的布局和加载策略,可以提高网页的性能和用户体验,确保页面能够快速、流畅地呈现给用户。在实际开发中,要根据具体情况进行权衡和调整,以达到最佳的效果。
413 57
|
2月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
209 0
|
9月前
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
2215 1
|
7月前
|
机器学习/深度学习 数据采集 JavaScript
用深度学习提升DOM解析——自动提取页面关键区块
本文介绍了一次二手车数据爬虫事故的解决过程,从传统XPath方案失效到结合深度学习语义提取的成功实践。面对懂车帝平台的前端异步渲染和复杂DOM结构,通过Playwright动态渲染、代理IP隐藏身份,以及BERT模型对HTML块级语义识别,实现了稳定高效的字段提取。此方法抗结构变化能力强,适用于复杂网页数据采集,如二手车、新闻等领域。架构演进从静态爬虫到动态爬虫再到语义解析,显著提升效率与稳定性。
287 13
用深度学习提升DOM解析——自动提取页面关键区块
|
7月前
|
Android开发 开发者
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
本文详细介绍了如何通过自定义 `attrs.xml` 文件实现 Android 自定义 View 的属性配置。以一个包含 TextView 和 ImageView 的 DemoView 为例,讲解了如何使用自定义属性动态改变文字内容和控制图片显示隐藏。同时,通过设置布尔值和点击事件,实现了图片状态的切换功能。代码中展示了如何在构造函数中解析自定义属性,并通过方法 `setSetting0n` 和 `setbackeguang` 实现功能逻辑的优化与封装。此示例帮助开发者更好地理解自定义 View 的开发流程与 attrs.xml 的实际应用。
215 2
Android自定义View之不得不知道的文件attrs.xml(自定义属性)
|
9月前
|
XML JavaScript Android开发
【Android】网络技术知识总结之WebView,HttpURLConnection,OKHttp,XML的pull解析方式
本文总结了Android中几种常用的网络技术,包括WebView、HttpURLConnection、OKHttp和XML的Pull解析方式。每种技术都有其独特的特点和适用场景。理解并熟练运用这些技术,可以帮助开发者构建高效、可靠的网络应用程序。通过示例代码和详细解释,本文为开发者提供了实用的参考和指导。
339 15
|
8月前
|
机器学习/深度学习 数据采集 存储
深度学习在DOM解析中的应用:自动识别页面关键内容区块
本文探讨了如何通过深度学习模型优化东方财富吧财经新闻爬虫的性能。针对网络请求、DOM解析与模型推理等瓶颈,采用代理复用、批量推理、多线程并发及模型量化等策略,将单页耗时从5秒优化至2秒,提升60%以上。代码示例涵盖代理配置、TFLite模型加载、批量预测及多线程抓取,确保高效稳定运行,为大规模数据采集提供参考。
221 0
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
XML Web App开发 JavaScript
XML DOM 解析器
XML DOM 解析器
|
9月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
922 29

推荐镜像

更多
  • DNS