关于Xml解析

163 阅读6分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第21天,点击查看活动详情

XML 介绍

XML 是可扩展标记语言的简称。

XML 独立于计算机平台、操作系统和编程语言,用来表示数据,简单、灵活、交互性好和可扩展这几个特点是其能被广泛使用的主要原因。

XML 的应用范围主要体现在以下几个方面:

  • 存储数据:内存中的数据需要存储到文件中,才能在关闭系统或系统掉电之后,通过文件进行恢复。现如今,用数据库存储数据这种方式使用得最为广泛。因为数据库管理系统不仅能存储数据,而且提供了众多的管理数据的功能,尤其对大量数据的操作,通常都使用数据库。XML 与数据库相比,最大的优势就是简单、通用。
  • 系统配置:如今,许多系统的配置文件都使用 XML 文档。使用 XML 文档进行系统配置,配置修改时不需要重新编译,灵活性强。例如接下来要学习的 Servlet,需要在 web.xml 文件中进行配置,Spring 的默认配置文件是 applicationContext.xml 等。
  • 数据交换:在各个分散的应用系统里,因为其平台、系统、数据库、编程语言的差异,保存起来的数据往往只能被本系统调用,形成一个个信息孤岛。整合各个系统的数据信息,或者在两个或多个系统中进行数据交换。现在利用 XML 交互性好的特点,可以将各个信息孤岛的数据转换成标准的 XML 文件,通过这个标准的 XML 文件进行导入和导出,以达到交换数据的目的。

XML 的组成结构

XML 文档总是以 XML 声明开始,即告知处理程序,本文档是一个 XML 文档。在 XML 声明中,通常包括版本、编码等信息,以 <? 开始,以 ?> 结尾。

XML 文档由元素组成,一个元素由一对标签来定义,包括开始和结束标签,以及其中的内容。元素之间可以嵌套,但不能交叉,也就是说元素的内容里还可以包含元素。

XML 文档规范主要分成两种,一种是 DTD 规范,一种是 Schema 规范。DTD 规范有自己的语法规范要求,不过相对比较简单;而 Schema 规范是完全基于 XML 规范来进行编写的。

<?xml version="1.0" encoding="UTF-8"?>
<vehicles>
    <cars>
        <car id="1">
            <name>战神</name>
            <oil>20</oil>
            <loss>0</loss>
            <brand>长城</brand>
        </car>
        <car id="2">
            <name>跑得快</name>
            <oil>40</oil>
            <loss>20</loss>
            <brand>红旗</brand>
        </car>
    </cars>
    <trucks>
        <truck id="3">
            <name>大力士</name>
            <oil>20</oil>
            <loss>0</loss>
            <load>5吨</load>
        </truck>
        <truck id="4">
            <name>大力士二代</name>
            <oil>30</oil>
            <loss>30</loss>
            <load>10吨</load>
        </truck>
    </trucks>
</vehicles>

通过这个文档可以看出,XML 文档的标签(如、、、等)可以是自定义的,具有可扩展性,这和 HTML 的标签是固定的不同。另外,HTML 的主要作用是通过标签和属性,更好地显示数据,而 XML 是用来存储或交换数据用的,不记录数据的表现形式。

标签可以有属性(属性值要加引号),例如 car 标签和 truck 标签都有 id 这个属性。属性是对标签的进一步描述和说明,一个标签可以有多个属性,每个属性都有自己的名字和值,属性是标签的一部分。

XML 的组成结构

XML 文档的应用范围主要有存储数据、系统配置和数据交换。也就是说,作为程序员,需要编写程序读取 XML 文档中的数据,或将数据写入 XML 文档。

目前最常用的 XML 解析技术有 DOM 和 SAX。

JDK 提供了 JAXP 来使用 DOM 和 SAX,其中 org.w3c.dom 是 W3C 推荐的用于使用 DOM 解析 XML 文档的接口,org.xml.sax 是使用 SAX 解析 XML 文档的接口,javax.xml.parsers 提供处理 XML 文档的类,支持 DOM 和 SAX。

DOM(Document Object Model)是 XML 文档的应用程序接口,它定义了对 XML 文档进行随机访问与操作的方法。

DOM 是一个与语言无关、与平台无关的标准接口规范。利用 DOM,程序开发人员可以动态地创建 XML 文档,遍历文档结构,添加、修改、删除文档内容,改变文档的显示方式等。可以这样说,文档代表的是数据,而 DOM 则代表了如何去处理这些数据。

DOM 把一个 XML 文档映射成一个分层对象模型,而这个层次的结构,是一棵根据 XML 文档生成的节点树。DOM 在对 XML 文档进行分析之后,不管这个文档有多简单或多复杂,其中的信息都会被转化成一棵对象节点树。在这棵节点树中,有一个根节点,其他所有的节点都是根节点的子节点。节点树生成之后,就可以通过 DOM 接口访问、修改、添加、删除树中的节点或内容了。

🤔 那么如何读取转化成树的数据呢?

Java 中提供了几个接口,我们一个个来看一下:

Node 接口在整个 DOM 树中具有举足轻重的地位,DOM 接口中有很大一部分接口是从 Node 接口继承过来的,例如 Document(根节点)、Element(元素)、Attr(属性)、Comment(注释)、Text(元素或属性的文本内容)等接口都是从 Node 继承过来的。 在 DOM 树中,Node 接口代表了树中的一个节点。Node 接口的常用方法如下。

  • NodeList getChildNodes():返回此节点的所有子节点的 NodeList。
  • Node getFirstChild():返回此节点的第一个子节点。
  • Node getLastChild():返回此节点的最后一个子节点。
  • Node getNextSibling():返回此节点之后的节点。
  • Node getPreviousSibling():返回此节点之前的节点。
  • Document getOwnerDocument():返回与此节点相关的 Document 对象。
  • Node getParentNode():返回此节点的父节点。
  • short getNodeType():返回此节点的类型。
  • String getNodeName():根据此节点类型,返回节点名称。
  • String getNodeValue():根据此节点类型,返回节点值。

前面已经提到,DOM 中很多接口都是从 Node 接口继承的,所以 Node 接口拥有的方法这些接口都可以使用。

但是这些从 Node 接口继承下来的接口又都各有特性,所以 Node 接口拥有的方法在各个子接口上的返回值含义不尽相同。

例如,Element(元素接口)的 getNodeType() 的返回值为 Node.ELEMENT_NODE 常量,getNodeName() 的返回值为标签名称,getNodeValue() 的返回值为 null。