(一) XML 概念
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是 Internet 环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在 1998 年,W3C 就发布了 XML1.0 规范,使用它来简化 Internet 的文档信息传输。
(二)XML 作用
1. 描述带关系的数据(常用做软件的配置文件):描述包含于被包含的关系,适用范围非常广泛,比如 tomcat SSH 框架全部都使用到了 XML
例如配置主机和端口号:
- 1 host.xml
- 2 <host>
- 3 <ip>255.43.12.55</ip>
- 4 <port>1521</port>
- 5 </host>
2. 作为数据的载体(存储数据,小型的 "数据库")
例如存储信息:
- 1 teacher.xml
- 2 <teacher>
- 3 <name>张三</name>
- 4 <email>zhangsan@qq.com</email>
- 5 <workage>2</workage>
- 6 </teacher>
(三)XML 语法
xml 文件以 xml 后缀名结尾。
xml 文件需要使用 xml 解析器去解析。浏览器内置了 xml 解析器
语法: <student></student> 开始标签 标签体内容 结束标签
1)<student/> 或 <student></student> 空标签。没有标签体内容
2)xml 标签名称区分大小写。
3)xml 标签一定要正确配对。
4)xml 标签名中间不能使用空格
5)xml 标签名不能以数字开头
6)注意: 在一个 xml 文档中,有且仅有一个根标签
语法: <Student name="eric">student</Student>
注意:
1)属性值必须以引号包含,不能省略,也不能单双引号混用!
2)一个标签内可以有多个属性,但不能出现重复的属性名!
在 xml 中内置了一些特殊字符,这些特殊字符不能直接被浏览器原样输出。如果希望把这些特殊字符按照原样输出到浏览器,对这些特殊字符进行转义。转义之后的字符就叫转义字节。
特殊字符 转义字符
< <
> >
" "
& &
空格 &nsbp;
(四) XML 的 DOM 解析:
XML 文档除了需要供开发者来阅读、配置相关信息,还需要让程序能够读懂其中包含的信息,这就叫做 XML 文档的解析。
其中 XML 文档主要有两种解析方式,DOM 解析和 SAX 解析,这里我们主要讲 DOM 解析方式,而这种方式也是 SSH 三大框架的解析 XML 的方式。
4.1 DOM 解析:
DOM 解析原理:xml 解析器一次性把整个 xml 文档加载进内存,然后在内存中构建一颗 Document 的对象树,通过 Document 对象,得到树上的节点对象,通过节点对象访问(操作)到 xml 文档的内容。
Document 对象代表了一个完整的 xml 文档,通过 Document 对象,可以得到其下面的其他节点对象,通过各个节点对象来访问 xml 文档的内容。
其中主要包括:标签节点,属性节点,文本节点和注释节点;并且各类节点也被封装成对应的对象,通过操作不同的对象来访问 xml 的内容:
树只有一个根标签,树上的分支叫做节点(node)
4.2 Domj4 读取 xml 文件
首先创建 xml 解析器对象,获取到 Document 对象:
- 1 public static Document getDocument() {
- 2 3 //创建一个XML解析器
- 4 SAXReader saxReader = new SAXReader();
- 5
- try {
- 6 //读取Document对象
- 7 Document document = null;
- 8 document = saxReader.read("./src/xml/User.xml");
- 9
- return document;
- 10
- } catch(DocumentException e) {
- 11 e.printStackTrace();
- 12
- }
- 13
- return null;
- 14
- }
节点:
Iterator Element.nodeIterator(); // 获取当前标签节点下的所有子节点
Element Document.getRootElement(); // 获取 xml 文档的根标签
Element ELement.element("标签名") // 指定名称的第一个子标签
Iterator<Element> Element.elementIterator("标签名");// 指定名称的所有子标签
List<Element> Element.elements(); // 获取所有子标签
代码示例:
属性:
String Element.attributeValue("属性名") // 获取指定名称的属性值
Attribute Element.attribute("属性名");// 获取指定名称的属性对象
Attribute.getName() // 获取属性名称
Attibute.getValue() // 获取属性值
List<Attribute> Element.attributes(); // 获取所有属性对象
Iterator<Attribute> Element.attibuteIterator(); // 获取所有属性对象
代码示例:
文本:
Element.getText(); // 获取当前标签的文本
Element.elementText("标签名") // 获取当前标签的指定名称的子标签的文本内容
代码示例:
- 1
- /**
- 2 * 获取文本信息
- 3 */
- 4 5 public static String getText(Element element) {
- 6 //注意:空格和换行也是xml的内容
- 7 String text = element.getText();
- 8
- return text;
- 9
- }
4.3 Domj4 修改 xml 文件
增加:
DocumentHelper.createDocument() 增加文档
addElement("名称") 增加标签
addAttribute("名称","值") 增加属性
代码示例:
修改:
Attribute.setValue("值") 修改属性值
Element.addAtribute("同名的属性名","值") 修改同名的属性值
Element.setText("内容") 修改文本内容
代码示例:
删除
Element.detach(); 删除标签
Attribute.detach(); 删除属性
代码示例:
写出内容到 xml 文档
XMLWriter writer = new XMLWriter(OutputStream, OutputForamt)
wirter.write(Document);
代码示例:
- 1 /**
- 2 * 把修改后的Document对象写出到xml文档中
- 3 * @param document
- 4 * @throws IOException
- 5 */
- 6 public void writeXml(Document document) throws IOException {
- 7 //把修改后的Document对象写出到xml文档中
- 8 FileOutputStream out = new FileOutputStream("./src/xml/userWrite.xml");
- 9 //比较美观的排版方式 用于人阅读
- 10 OutputFormat format = OutputFormat.createPrettyPrint();
- 11
- 12 //紧凑型的排版方式 ,主要用于程序运行中使用 减少不必要的空格换行等
- 13 //OutputFormat format2 = OutputFormat.createCompactFormat();
- 14
- 15 format.setEncoding("utf-8");
- 16 XMLWriter writer = new XMLWriter(out,format);
- 17 writer.write(document);
- 18 writer.close();
- 19
- 20 }
其中使用的到 xml 文件:
- 1 <?xml version="1.0" encoding="utf-8"?>
- 2
- 3 <UserList>
- 4 <User id="001">
- 5 <username>张三</username>
- 6 <passwprd>33333</passwprd>
- 7 <age>33</age>
- 8 <address>aaaaaaaa</address>
- 9 </User>
- 10
- 11 <User id="002">
- 12 <username>李四</username>
- 13 <passwprd>44444</passwprd>
- 14 <age>44</age>
- 15 <address>bbbbbbbbb</address>
- 16 </User>
- 17 <abc></abc>
- 18
- 19 </UserList>
(五)xPath 技术
5.1 引入
5.2 xPath 作用
主要是用于快速获取所需的节点对象。
5.3 在 dom4j 中如何使用 xPath 技术
/ | 绝对路径 | 表示从 xml 的根位置开始或子元素(一个层次结构) |
// | 相对路径 | 表示不分任何层次结构的选择元素。 |
* | 通配符 | 表示匹配所有元素 |
[] | 条件 | 表示选择什么条件下的元素 |
@ | 属性 | 表示选择属性节点 |
and | 关系 | 表示条件的与关系(等价于 &&) |
text() | 文本 | 表示选择文本内容 |
语法示例:
/AAA |
选择根元素 AAA |
|
/AAA/CCC |
选择 AAA 的所有 CCC 子元素 |
|
/AAA/DDD/BBB |
选择 AAA 的子元素 DDD 的所有子元素 |
|
如果路径以双斜线 // 开头, 则表示选择文档中所有满足双斜线 // 之后规则的元素 (无论层级关系)
//BBB |
选择所有 BBB 元素 |
|
//DDD/BBB |
选择所有父元素是 DDD 的 BBB 元素 |
|
星号 * 表示选择所有由星号之前的路径所定位的元素
/AAA/CCC/DDD/* |
选择所有路径依附于 / AAA/CCC/DDD 的元素 |
|
/*/*/*/BBB |
选择所有的有 3 个祖先元素的 BBB 元素 |
|
方块号里的表达式可以进一步的指定元素, 其中数字表示元素在选择集里的位置, 而 last() 函数则表示选择集中的最后一个元素.
/AAA/BBB[1] |
选择 AAA 的第一个 BBB 子元素 |
|
/AAA/BBB[last()] |
选择 AAA 的最后一个 BBB 子元素 |
|
属性通过前缀 @ 来指定
来源: http://www.cnblogs.com/infaraway/p/6525049.html