xml 和 xml 解析

本贴最后更新于 848 天前,其中的信息可能已经渤澥桑田

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
  • 常见解析开发包

    • 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 数据
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3167 引用 • 8207 回帖
  • XML
    28 引用 • 59 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...