1. XML 文件
1.1. XML 概述
HTML 和 XML 的区别
- HTML: 用来显示页面, 网页.
- XML: 用来传输数据, 而非显示数据.
XML 标签没有被预定义, 需要用户自行定义标签.
XML 的必要性:
- XML 是一种通用的数据交换格式, 许多项目都采用 XML 作为数据交换格式
- 掌握 XML 是软件开发人员的一项基本技能
在 Struts1.x, Struts2.x, Spring, Hibernate, Mybatis 等
任意一个 java ee 框架中都可用 XML 做配置文件。
1.2. XML 格式和语法说明
1.2.1. 文件格式
- XML 有两个编码, 要保证两个编码相同, 都为 UTF-8.
- 内容编码;
- 文件本身的编码;
1.2.2. 语法格式
一个 XML 文档必须有且仅有一个根标签, 不允许标签嵌套, 区分大小写.
注释格式:
<!-- 注释内容 -->
在编写 XML 文档时, 需要先使用文档声明来声明 XML 文档, 且必须出现在文档的第一行.
- 语法:
<?xml version=“1.0” ?>
- 语法:
用
encoding
属性说明文档所使用的字符编码, 默认为 UTF-8.
要保证保存在磁盘上的文件编码要与声明的编码一致.- 语法:
<?xml version=“1.0”encoding= “UTF-8”?>
- 语法:
用
standalone
属性说明文档是否独立, 即是否依赖其他文档.- 语法:
<?xml version=“1.0”standalone= “yes”?>
- 语法:
CDATA
是Character Data
的缩写.语法:
<![CDATA[数据内容]>
作用:
把标签当做普通文本内容; 解析器不对 CDATA 区中的内容进行解析,
而是将这些数据原封不动地交给程序去处理.
1.3. XML 文件解析
DOM(Document Object Model):
文档対象模型. 使用面向対象的方式, 把 XML 文件中的结构使用対象来表示.在 XML 中,一切皆节点(Node).
Document
: 文档节点(XML 文件)Element
: 元素节点(使用<>
表示标签)Attr
: 属性节点(元素上属性名="属性値"
)Text
: 文本节点(元素之间的内容)
2. DOM 文档对象
在加载的时候会把 XML 加载进内存中, 在内存中形成一棵 DOM 树.
因此在使用代码操作 Document 对象的时候, 操作的是内存中的 DOM 树,
和磁盘中的 XML 文件并没有太大的关系, 磁盘的 XML 文件只用作生成 DOM 树.但是一旦内存中的 DOM 树结构发生了变化, 即进行了增删改任一操作之后,
那么就必须将这种变化从内存的 DOM 树同步到磁盘中的 XML 文件中去.值得注意的是, 若 XML 文件体积过大, 可能会在导入过程中出现内存溢出的错误.
2.1. 获取 DOM 文档对象
org.w3c.dom.Document
操作 DOM 对象主要涉及到该类.javax.xml.parsers.DocumentBuilder
获取 DOM 对象主要由该类完成.javax.xml.parsers.DocumentBuilderFactory
用于获取 DocumentBuilder 对象.
2.1.1. 获取 DOM 对象的步骤
1) 创建 DocumentBuilderFactory 对象(工厂类中一般都有静态方法用于返回当前工厂类对象)
java DocumentBuilderFactory facObj = DocumentBuilderFactory.newInstance();
2) 根据工厂对象, 创建 DocumentBuilder 对象.
java DocumentBuilder dcObj = factory.newDocumentBuilder();
3) 根据 DocumentBuilder 对象去解析一个已经存在的 XML 文件, 从而得到 Document 对象. java File f = new File("D:/Files/properties.xml"); Document dom = dcObj.parse(f);
2.1.2. 获取 DOM 对象涉及的两个方法的区别
根据 DocumentBuilder 创建 Document 对象, 有两种方式:
- 当 XML 文档不存在的时候, 使用 newDocument.
表示在内存中先创建出一棵 DOM 树, 之后再在磁盘中创建 XML 文件.
创建的 XML 文件的内容与 这棵 DOM 树的内容保持一致.Document doc = builder.newDocument();
- 当 XML 文档存在的时候, 只需要直接去解析即可.
Document doc = builder.parse(File 对象);
- 当 XML 文档不存在的时候, 使用 newDocument.
2.2. 操作 DOM 对象的方法
操作与 js 中对 HTML 文件的操作方式相似, 自行查阅方法即可.
将程序中的 DOM 对象在做完增删改操作后的修改同步回源 XML 文件中,
需要用到javax.xml.transform.Transformer
这个类的transform()
方法.
2.2.1. 同步本地 XML 文件操作实例
//同步操作: 把内存中的数据同步更新到磁盘的XML中. 核心类:Transformer.
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
Source xmlSource = new DOMSource(doc);//源: 内存中的Document对象
Result outputTarget = new StreamResult(f);//目标: 磁盘中的XML文件, 已封装进 File 对象中
trans.transform(xmlSource, outputTarget);//同步操作