XML
XML简介
- XML是可扩展的标记性语言
XML的作用
1、用来保存数据,而且这些数据具有自我描述性
Students[id=1,name="姚行志"];
Students[id=2,name="金生"]
studens.xml
<students>
<student>
<id>1</id>
<name>姚行志</name>
</student>
<student>
<id>2</id>
<name>金生</name>
</student>
</students>
2、作为项目或者模块的配置文件
3、作为网络传输数据的格式(目前以JSON为主)
XML语法
元素(标签)
- html标签:
格式:<标签名>封装的数据</标签名>
单标签:<标签名/>
<br/>
换行
水平线双标签:<标签名>封装的数据</标签名>
标签名大小写不敏感
标签有属性,有基本属性和事件属性
标签要闭合(不闭合,html中不报错。但养成良好的书写习惯,闭合)
- xml元素:
xml元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。
元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
<bookstore>
<book category="CHILDREN">
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title>Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
- 在上例中,
<bookstore>
和<book>
都拥有元素内容,因为他们包含了其他元素。<author>
只有文本内容,因为它仅包含文本
命名规则:
1)名称可以含字母、数字以及其他的字符
例如:
<book id=*"SN213412341"*> <!-- 描述一本书 --> <author>班导</author> <!-- 描述书的作者信息 --> <name>java 编程思想</name> <!-- 书名 --> <price>9.9</price> <!-- 价格 --> </book>
2)名称不能以数字或者标点符号开始
3)名称不能包含空格
xml 中的元素(标签)也 分成 单标签和双标签:
单标签
格式: <标签名 属性=”值” 属性=”值” … />
双标签
格式:< 标签名 属性=”值” 属性=”值” …>文本数据或子标签</标签名>
XML属性
-
xml 的标签属性和 html 的标签属性是非常类似的,属性可以提供元素的额外信息
-
在标签上可以书写属性: 一个标签上可以书写多个属性。每个属性的值必须使用 引号 引起来。
-
规则和标签的书写规则一致。
XML注释
- html 和 xml 注释一样 :
语法规则
1**)所有** XML 元素都须有关闭标签(也就是闭合)
2)XML 标签对大小写敏感
3)XML 必须正确地嵌套
4)XML 文档必须有根元素
根元素就是顶级元素,
没有父标签的元素,叫顶级元素。
根元素是没有父标签的顶级元素,而且是唯一一个才行。
5)XML 的属性值须加引号
6)XML 中的特殊字符
7)文本区域(CDATA 区)
CDATA 语法可以告诉 xml 解析器,我CDATA 里的文本内容,只是纯文本,不需要 xml 语法解析
CDATA 格式:
<![CDATA[** 这里可以把你输入的字符原样显示,不会解析 xml **]]>
<![CDATA[<<<<<<<<yxz]]>
XML解析技术介绍
- xml是可扩展的标记语言,不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织指定的dom技术来解析
XML文档对象模型定义访问和操作XML文档的标准方法
DOM将XML文档作为一个树形结构,而树叶被定义为节点
document
对象表示的是整个文档(可以是html文档,也可以是xml文档)
早期JDK为我们提供了两种xml解析技术DOM和Sax简介(已经过时,但是需要了解)
-
dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom 技术解析标记也做了实现。
-
sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML )
-
SAX 解析,它跟 W3C 制定的解析不太一样。它是以类似事件机制通过回调告诉用户当前正在解析的内容。 它是一行一行的读取 xml 文件进行解析的。不会创建大量的 dom 对象。 所以它在解析 xml 的时候,在内存的使用上。和性能上。都优于 Dom 解析。
-
第三方的解析:
jdom 在 dom 基础上进行了封装 、
dom4j
又对 jdom 进行了封装。pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件。
这个 Dom4j
它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析 xml 文件。
dom4j解析技术(重点)
- 由于 dom4j 它不是 sun 公司的技术,而属于第三方公司的技术,我们需要使用 dom4j 就需要到 dom4j 官网下载 dom4j 的 jar 包。
dom4j 编程步骤:
- 第一步:先加载xml文件创建Document对象
- 第二步:通过Document对象拿到根元素对象
- 第三步:通过根元素.elements(标签名);可以返回一个集合,这个集合里放着所有你指定的标签名的元素对象
- 第四步:找到你想要修改、删除的子元素,进行相应的操作
- 第五步:保存到硬盘上
获取document对象
- 导入jar包
- 需要解析的books.xml文件内容
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book sn="SN12341232">
<name>辟邪剑谱</name>
<price>9.9</price>
<author>班主任</author>
</book>
<book sn="SN12341231">
<name>葵花宝典</name>
<price>99.99</price>
<author>班长</author>
</book>
</books>
获取对象:
@Test
public void getDocument() throws Exception {
//要创建一个 Document 对象,需要我们先创建一个 SAXReader 对象
SAXReader saxReader = new SAXReader();
//这个对象用于读取 xml 文件,然后返回一个 Document。
Document document = saxReader.read("src/books.xml");
System.out.println(document);
}
遍历标签来获取所有标签中的内容(重点)
/*
读取books.xml文件生成Book类
*/
@Test
public void test2() throws Exception {
//1.读取books.xml文件
SAXReader saxReader = new SAXReader();
//在Junit测试中,相对路径是从模块名开始算
Document document = saxReader.read("src/books.xml");
//2.通过Document对象获取根元素
Element rootElement = document.getRootElement();
//System.out.println(rootElement);
//3.通过根元素获取book标签对象
// element()和elements都是通过标签名查找子元素,区别在于个数的不同
List<Element> books = rootElement.elements("book");
//4.遍历,处理每个book标签转换为Book类
for (Element book : books) {
//asXML():把标签对象转换为标签字符串
//System.out.println(book.asXML());
Element nameElement = book.element("name");
//System.out.println(nameElement.asXML());
// getText():获取标签中的文本内容
String nameText = nameElement.getText();
//System.out.println(nameText);
//直接获取标签名中的文本内容
String priceText = book.elementText("price");
//System.out.println(priceText);
String authorText = book.elementText("author");
String snValue = book.attributeValue("sn");
System.out.println(new Book(snValue,nameText, Double.parseDouble(priceText),authorText));
}
}