10 xml
xml
一、XML 简介
什么是 xml?
xml 是可扩展的标记性语言。 xml 的作用?
xml 的主要作用有:
1、用来保存数据,而且这些数据具有自我描述性
2、它还可以做为项目或者模块的配置文件
3、还可以做为网络传输数据的格式(现在 JSON 为主)。
二、xml语法
- 文档声明
- 元素(标签)
- xml 属性
- xml 注释
- 文本区域(CDATA 区)
2.1 文档声明
右键file 文件名.xml
xml version="1.0" encoding="utf-8" ?>
<!--
xml文件的声明
<?xml version="1.0" encoding="utf-8" ?>
version="1.0" 表名xml的版本
encoding="utf-8 encoding表名xml文件本身的编码
-->
<books><!-- books 表示多个图书信息-->
<book sn="SN1564891"><!--book表示一个图书信息,cn属性表示图书序列号 -->
<name>时间简史</name><!-- name 标签表示书名-->
<author>霍金</author><!--author 表示作者-->
<price>75</price><!--表示图书价格-->
</book>
<book sn="SN1564891"><!--book表示一个图书信息,cn属性表示图书序列号 -->
<name>java从入门到放弃</name><!-- name 标签表示书名-->
<author>沙老师</author><!--author 表示作者-->
<price>9.9 </price><!--表示图书价格-->
</book>
</books>
2.2 元素(标签)
1)什么是 xml

元素是指从开始标签到结束标签的内容。
元素 我们可以简单的理解为是 标签。
Element 翻译 元素
2)XML 命名规则
XML 元素必须遵循以下命名规则:
2.1)名称可以含字母、数字以及其他的字符
2.2)名称不能以数字或者标点符号开始
2.3)名称不能包含空格
3)xml 中的元素(标签)也 分成 单标签和双标签:
单标签
格式: <标签名 属性=”值” 属性=”值” ...... />
双标签
格式:< 标签名 属性=”值” 属性=”值” ......>文本数据或子标签
2.3 xml属性
xml 的标签属性和 html 的标签属性是非常类似的,属性可以提供元素的额外信息
在标签上可以书写属性:
一个标签上可以书写多个属性。每个属性的值必须使用 引号 引起来。
的规则和标签的书写规则一致
1)属性必须使用引号引起来,不引会报错示例代码
2.4 语法规则
- 所有 XML 元素都须有关闭标签(也就是闭合)
- XML 标签对大小写敏感
- XML 必须正确地嵌套
- XML 文档必须有根元素
根元素就是顶级元素,
没有父标签的元素,叫顶级元素。
根元素是没有父标签的顶级元素,而且是唯一一个才行
-
XML 的属性值须加引号
-
XML 中的特殊字符
![]()
-
文本区域(CDATA 区)
CDATA 语法可以告诉 xml 解析器,我 CDATA 里的文本内容,只是纯文本,不需要 xml 语法解析
![]()
三、xml 解析技术介绍
xml 可扩展的标记语言。
不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析。

document 对象表示的是整个文档(可以是 html 文档,也可以是 xml 文档
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 包。
4.1 dom4j 编程步骤:
第一步: 先加载 xml 文件创建 Document 对象
第二步:通过 Document 对象拿到根元素对象
第三步:通过根元素.elelemts(标签名); 可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象
第四步:找到你想要修改、删除的子元素,进行相应在的操作
第五步,保存到硬盘上
需要解析的 books.xml
<?xml version="1.0" encoding="utf-8" ?>
<!--
xml文件的声明
<?xml version="1.0" encoding="utf-8" ?>
version="1.0" 表名xml的版本
encoding="utf-8 encoding表名xml文件本身的编码
-->
<books><!-- books 表示多个图书信息-->
<book sn="SN1564891"><!--book表示一个图书信息,cn属性表示图书序列号 -->
<name>时间简史</name><!-- name 标签表示书名-->
<author>霍金</author><!--author 表示作者-->
<price>75</price><!--表示图书价格-->
</book>
<book sn="SN1564891"><!--book表示一个图书信息,cn属性表示图书序列号 -->
<name>java从入门到放弃</name><!-- name 标签表示书名-->
<author>沙老师</author><!--author 表示作者-->
<price>9.9 </price><!--表示图书价格-->
</book>
</books>
解析获取 Document 对象的代码
第一步,先创建 SaxReader 对象。这个对象,用于读取 xml 文件,并创建 Document
//dom4j获取Document对象
@Test
public void test1() throws Exception {
//创建一个saxReader输入流,去读取xml配置文件,生成document文件
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read("src/books.xml");
System.out.println(document);
}catch (Exception e){
e.printStackTrace();
}
}
4.2 遍历 标签 获取所有标签中的内容(*****重点)
需要分四步操作:
第一步,通过创建 SAXReader 对象。来读取 xml 文件,获取 Document 对象
第二步,通过 Document 对象。拿到 XML 的根元素对象
第三步,通过根元素对象。获取所有的 book 标签对象
第四小,遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素,再通过 getText() 方法拿到起始标签和结
束标签之间的文本内容
//读取books.xml文件生成book类
@Test
public void test2() throws Exception{
//1.读取books.xml文件
SAXReader reader = new SAXReader();
//在junit测试中,相对路径是从模块名开始算
Document document = reader.read("src/books.xml");
//2.通过document对象获取根元素
Element rootElement = document.getRootElement();
//3.通过根元素获取book标签对象
//element() 和 elements() 都是通过标签名查找子元素
List<Element> books = rootElement.elements("book");
//4.遍历 处理每个book标签转换为book类
for (Element book:books){
//把标签对象转换为标签字符串
Element nameElement = book.element("name");
//getText() 可以获取标签中的文本内容
String nameText = nameElement.getText();
//elementText() 直接获取标签名的文本内容
String priceText = book.elementText("price");
String authorText = book.elementText("author");
String snValue = book.attributeValue("sn");
System.out.println(new Book(snValue,nameText,new BigDecimal(Double.parseDouble(priceText)),authorText));
}
}



浙公网安备 33010602011771号