XML
1. XML 介绍
eXtensible Markup Language
可扩展标记语言,通常用于各种组件或者框架的配置文件,文件内容由各种标签组成
2. XML 与 HTML 区别
区别 | HTML | XML |
---|---|---|
功能 | 制作网页 | 用于配置文件 |
大小写 | 不区分大小写 | 区分大小写 |
语法严谨性 | 不严谨,若一个标签有开始,没有结束,浏览器也能解析 | 很严谨,标签的开始和结束必须严格配对 |
可扩展性 | 没有可扩展性,所有的标签的功能都已固定 | 可以扩展,因为所有的标签都是自定义的 |
3. XML 组成
XML 文件由 7 个组成元素构成:
文档声明
- 语法:以
<?xml
开头,以?>
结尾- 位置:必须在 XML 文件的第一行
- 例子:
<?xml version="1.0" encoding="UTF-8"?>
- 三个属性:
文档声明的三个属性 说明 version 用于指定 XML 使用哪个版本,固定的写法 1.0 enconding 指定当前 XML 编码 standalone yes/no 默认是 yes,这个 XML 文件是否是一个单独的文档 标签元素 Element
语法:有主体标签 < 标签 > 和无主体标签:< 标签/> 主体部分:分为有主体和无主体标签,主体部分可以包含文本或者元素 空元素:无主体标签也需要关闭 大小写:标签名区分大小写 命名不能有空格,不能有冒号 根元素:每个 XML 文档有且仅有一个根元素,
- 属性 Attribute
属性位置:必须放在开始标签中 属性的值必须使用双引号或单引号 在同一个标签不能出现多个同名的属性 命名中不能出现空格和冒号
- 注释 Comment
- 与 HTML 注释相同,不可嵌套
- 转义字符(实体字符)
说明 字符 转义字符 小于 < lt; 大于 > gt; 双引号 " quot; 单引号 ' apos; 与符号 & amp;
- 字符数据区(用于显示大量特殊字符)
- 格式:
<![CDATA[ 文本数据 ]]>
- 可以让某些字符不被 XML 解析,始终作为纯文本来操作
- 处理指令(不常用)
- 格式:
<?xml-stylesheet 属性=""... ?>
- 作用:处理指令,简称 PI(Processing instruction)用来指挥解析引擎如何解析 XML 文档
4. XML 作用
主要用于数据的处理和表达,因为 HTML 等其他标记语言无法准确表达其本质内容,而主要是表现样式,导致带来诸多不便,所以 XML 就诞生了
在企业开发中的主要应用场景:
- 数据交换,用于不同的系统之间,或不同的数据库之间进行数据交换
- 用于各种框架的配置
5. XML 文件约束
因为 XML 是可扩展标记语言,可以写任意标记,所以需要对 XML 进行一些约束,保证 XML 文件数据的正确性和有效性
-
DTD 约束
DTD:Document Type Definition 文档类型定义
作用:用于约束 XML 文件,DTD 本身是个文本文件
导入 DTD 文件的两种格式 | 说明 |
---|---|
<!DOCTYPE 根元素 SYSTEM "DTD 文件"> | 系统的 DTD 文件,使用范围比较小,一般用于公司,不对外开放的 DTD 文件 |
<!DOCTYPE 根元素 PUBLIC "DTD 文件"> | 公共的 DTD 文件,用于互联网上,使用广泛的用途 |
-
Schema 约束
- XML Schema Definition 比 DTD 强大,是 DTD 的替代者
- 本身也是 XML 文档,扩展名为 xsd
- 功能更强大,数据约束类型更完善
XML 解析
-
三种解析方式
- DOM:要求解析器把整个 XML 文档装载到内存并解析称为一个 Document 对象
- 优点:元素与元素之间保留了结构关系,可以进行增删改查操作
- 缺点:若 XML 过大可能出现内存溢出
- SAX:是一种速度更快更有效的方法。逐一扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都触发对应的事件
- 优点:处理速度快,可以处理大文件
- 缺点:只能读,逐行后将释放资源,解析操作繁琐
- PULL:Android 内置的 XML 解析方式,类似 SAX
- DOM:要求解析器把整个 XML 文档装载到内存并解析称为一个 Document 对象
-
常见解析开发包
- JAXP:Oracle 公司提供支持 DOM 和 SAX 开发包
- Dem4j:比较简单的解析开发包,将整个 XML 加载到内存中作为一个 DOM 树
- JDom:与 Dem4j 类似
- Jsoup:功能强大的 DOM 方式的 XML 解析包,同时对 HTML 的解析也很方便
Jsoup
将整个文档加载到内存,生成一个 DOM 树,并获得一个 Document 对象,通过 Document 对象操作 DOM 树
-
获取 Document 对象的三种方式
public static Document parse(String html)
:将一段 HTML 内容转化成一个 Document 对象public static Document parse(File in,String charsetName)
:指定 XML 或者 HTML 文件和字符集,得到一个 Document 对象public static Document connect(String url)
:解析互联网上的某个 URL 地址,创建连接,通过连接获取一个 Document 对象
-
获取元素对象
- 通过 GET 方式得到元素对象
返回类型 Document 对象的方法 说明 Element getElementById(String id) 通过 id 得到唯一元素对象 Elements getElementsByTag(String tagName) 通过标签名得到一组元素 Elements getElementsByClass(String className) 通过类名得到一组元素对象 - 通过 CSS 选择器得到元素
返回类型 方法 说明 Elements select(String cssQuery) 作用:通过选择器得到多个元素 Element selectFirst(String cssQuery) 作用:通过选择器得到第一个元素 -
选择器
- 基本选择器
选择器类型 描述 选择器语法 ID 选择器 根据 id 获取元素,id 前面使用#符号 #id class 选择器 根据元素 class 属性获取元素 .类名 标签选择器 根据元素名称获取元素 标签名 属性选择器 获取含有该属性名的所有元素 [属性名] 属性选择器 利用属性值来查找元素 [属性名=属性值] - 组合选择器
选择器代码 说明 标签名[属性名] 属性选择器,包含指定属性的标签。 如:a[href],即选中 a 标签包含 href 属性的元素 标签名.类名 交集选择器,同时指定标签名和类名的选择器 例如 div.one 即 <div class="one"> 内容 </div> 父元素 > 子元素 子选择器,找某个元素下的所有子元素,选择器之间使用空格隔开 父元素 子元素 后代选择器,找到父元素下面的子元素(包括子元素下面的所有子元素、孙元素等) 兄弟 A+ 兄弟 B 兄弟选择器,查找在 A 元素后面第一个同级元素 B
JsoupXPath
JsoupXPath 是一款纯 Java 开发的使用 xpath 解析 HTML 的解析器,JsoupXPath 不是 Jsoup 的一部分,是在 Jsoup 基础上进行的扩展。XPath 使用路径表达式来选取 HTML 或 XML 文档中的元素节点或属性节点
-
核心 API
-
JXDocument
public JXDocument JXDocument(Document doc)
:通过 Document 对象创建一个新的 JXDocument 对象public List<JXNode> selN(String xpath)
:通过 xpath 表达式得到指定的节点对象集合public JXNode selOne(String xpath)
:通过 xpath 表达式得到符合条件的节点对象
-
JXNode
JXNode 表示一个节点对象,元素、文本都是节点对象
public Element getElement()
:通过节点得到元素public List<JXNode> sel(String xpath)
:用在相对路径上,从当前节点开始向下查询其他子节点
-
-
四种 XPath 语法表达方式
- 相对路径表达式
- 以“/”开头,一级一级描述标签的层级路径,不可跨越层级(从 body 开始往下搜索)
- 开头的“/”表示根元素
- 相对路径表达式
- 以“./”开始,一级一级描述标签的层级路径,不可跨越层级
- “.”表示当前路径
- 全文搜索路径
- “//”符号,不用逐层写路径,直接选取到对应的节点
//li
:查询所有的 li 元素,无论在哪一级//a@href
:查询所有的 a 元素,找到它的 href 属性
- 条件筛选
//元素[@属性名=值]
:获取“属性=值”的所有元素//元素[@属性名>值]@属性名
:获取“属性 > 值”的所有元素的属性值//元素[@属性名=值]test()
:获取符合条件元素的文本数据//元素[@属性名=值]html()
:获取符合条件元素的 HTML 数据
- 相对路径表达式
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于