Javaweb 第4 天xml 课程
XML课程
今日大纲
● XML概念
● XML基本语法
● XML约束
● dom4j技术
● xpath技术
*************************************************************************************************
1. XML介绍
XML 指可扩展标记语言 Extensible Markup Language
1.1 XML与HTML的区别
html:超文本标记语言。它主要是用来封装页面上要显示的数据,最后通过浏览器来解析html文件,然后把数据展示在浏览器上。同样我们可以使用JS和DOM技术对html文件进行解析和操作。
xml:可扩展的标记语言。它早期是为了代替html技术,但是由于html书写的网页在全球占有率太高,最后没有成功。
后期我们开始使用xml文件作为软件的配置文件,或者数据的存储文件,以及传输数据的文件。
xhtml:以xml的标准去完成html,分大小。
dhtml:js+html
html标签:w3c组织已经定义好了,我们主要是去使用。
xml标签:w3c组织没有预先定义。用户可以自己去定义。
简单通俗的来说,html可以看作是一种特殊的xml。
类似与html的还有wml(无线标记语言)手机上通过wap(无线传输协议)浏览器访问网站的语言。
1.2 XML的作用
XML 被设计用来传输和存储数据。作用和JSON类似,但是比JSON规矩多。
在安卓、IOS等客户端系统和服务器交互过程中,一般会使用xml文件作为数据的传输。
现在传输数据基本上都使用JSON格式。
例如:
描述省市关系:
<中国>
<省 name="江苏省" id="001">
<市 name="南京市">
<区>yyy</区>
</市>
</省>
<省 name="安徽省" id="002">
<市 name="合肥市">
<区>xxx</区>
</市>
</省>
</中国>
但是:
因为xml结构性明显,可读性强,
我们现在通常会把xml当作一个配置文件去使用,特别在框架技术中。(spring struts hibernate springmvc mybatis)
1.3 XML文件扩展名
类似与html和json,xml文件的扩展名就叫.xml
*************************************************************************************************
2. XML基本语法
2.1 文档声明
在定义xml文件的时候,通过声明告诉其他的解析软件,当前的这个文档是一个xml文档。
目的:定义xml文档。可以包含当前的xml的版本,以及xml文件的编码格式。
写法:
<!—写在xml文件的开头部分-->
<?xml key=value key=value ? >
常见:
<?xml version=1.0 encoding=utf-8 >
<?xml version=1.0 encoding=gbk >
解释:
version=1.0 -------xml版本号,目前来说只有1.0的版本
encoding=编码集 -------定义xml的编码格式。(utf-8 gbk)
当我们去创建一个xml的时候,通常工具都会带有,文档声明部分
<?xml version="1.0" encoding="UTF-8"?>
*************************************************************************************************
2.2 标签(元素)
写法:<标签名>
在xml中,同样的去区分单标签和双标签
单标签:<标签名 />
双标签:<标签名> 内容(文本,其他标签) </标签名>
标签名是我们自己定义的。建议大家。采用标识符的命名规则去给一个标签起名字。(数字字母下划线,并且数字不能作为开头)
案例:
描述书籍的信息。书名字,作者,单价。
标签的书写注意事项:
1、xml中的所有标签必须闭合。
2、xml中的标签名称严格区分大小写。 <User><user> ×
3、在xml标签名中间不要书写空格,或者冒号逗号等符号。标签的名字不要有空格一类特殊符号。
4、标签名不要以数字开始。(可以按照标识符的方式给标签去命名)
5、书写xml标签时,标签不能互相混乱嵌套。
<age>23<name>zhangsan></age></name>
6、所有的xml文件只能有一个根标签。
7、我们可以通过浏览器来校验xml文件的格式是否正确。
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>葵花宝典</name>
<author>东方不败</author>
<price>10.9</price>
</book>
<book>
<name>独孤九剑</name>
<author>风清扬</author>
<price>9.9</price>
</book>
</books>
*************************************************************************************************
2.3 属性
属性:书写在标签内的。对标签的数据进行扩展。对标签的进一步描述。
写法:<标签名属性名="属性值" 属性名="属性值">
属性名也是自定义的。
注意问题:
1、如果是双标签,属性要书写在开始标签内
2、属性名不要出现空格,";"":" 特殊字符不要出现。
3、属性值必须用单引号,或者双引号包围起来。
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>葵花宝典</name>
<!-- 有属性的标签 -->
<author sex='男'>东方不败</author>
<price>10.9</price>
</book>
<book>
<name>独孤九剑</name>
<author>风清扬</author>
<price>9.9</price>
</book>
</books>
*************************************************************************************************
2.4 注释
xml中的注释和html中的注释的写法是一样的。
<!-- 内容--> -------本身就是多行注释了。
注意:
注释的内容,会在浏览器中显示出来。
书写注释的时候,内容不能出现 -- 字符
*************************************************************************************************
2.5 CDATA区
CDATA区:可以输出特殊字符:原样的显示书写在CDATA的内容。会原封不动的显示出去。
写法:
<![CDATA[ 内容 ]]>
通过实体字符解决:
<price>9.9<10.9</price>
或者通过CDATA:
<![CDATA[原封不动显示的内容]]>
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>葵花宝典</name>
<!-- 有属性的标签 -->
<author sex='男'>东方不败</author>
<!-- <price>9.9<10.9</price> -->
<!-- 在cdata去里面的内容,解析器不会进行处理,原样不动的进行输出 -->
<price><![CDATA[9.9<10.9]]></price>
</book>
<book>
<name>独孤九剑</name>
<author>风清扬</author>
<price>8.9<9.9</price>
</book>
</books>
w3c预定义了5个实体:
*************************************************************************************************
2.6 处理指令(了解)
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。处理指令放到文件的上方
例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。
<?指令名 key=value key=value ?>
<?xml-stylesheet type="text/css" href="1.css"?>
利用css中样式,去显示xml文件的内容。
处理指令必须以"<?"作为开头,以"?>"作为结尾,XML声明语句就是最常见的一种处理指令。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="css/mao.css"?>
mao.css 文件中:
book {
color: blue;
font-size: 30px;
font-weight: bold;
}
浏览器访问的效果:
*************************************************************************************************
3. XML约束
3.1 XML约束介绍
约束:限制,规则。xml约束:限制xml中,可以有那些标签(xml的标签名),某个标签可以有那些属性。
html其实就是在xml的基础上加上了大量的约束。
XML约束方式主要有两种:DTD和Schema。
DTD约束:早期使用
Schema约束:现在主流
一个xml文件中只能有一个dtd的约束。
一个xml中可以引入多个schema约束。
作用:
可以限定xml中标签的内容。
可以帮助程序员进行提示(标签内容)
还可以帮助程序员,校验xml书写的是否正确。
*************************************************************************************************
3.2 DTD约束快速入门
3.2.1 编写DTD约束文件
创建一个dtd文件,文件扩展名dtd
格式:
<!ELEMENT books (子元素1,子元素2......)>
<?xml version="1.0" encoding="UTF-8"?>
<!--定义元素 (#PCDATA)表示里面内容是文本,没有子元素-->
<!ELEMENT name (#PCDATA) >
<!ELEMENT author (#PCDATA) >
<!ELEMENT price (#PCDATA) >
<!-- 定义复杂元素(含有子元素的元素) -->
<!ELEMENT book (name,author,price)>
<!ELEMENT books (book)>
3.2.2 在XML中引入DTD文件
如何引用外部的DTD 文件(.dtd)
格式:
<!DOCTYPE 根标签 SYSTEM "DTD文件的位置">
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入 books.dtd 约束 -->
<!DOCTYPE books SYSTEM "books.dtd">
<books>
<book>
<name>独孤九剑</name>
<author>风清扬</author>
<price>9.9</price>
</book>
</books>
*************************************************************************************************
3.3 DTD约束语法
3.3.1 DTD定义元素(ELEMENTS)
如何去定义xml中标签
写法:
<!ELEMENT 标签名标签内容>
其他类型:使用小括号去定义一个元素的子标签, (子标签)
多个子标签通过逗号分割开,表示子标签出现的顺序。
子标签出现的次数
+ :1或者多个,在xml中要求该标签最少出现一次
* :0次或者多次。在xml该标签可以不出现。可以不书写
? : 表示子标签出现0次或者1次。可以出现,但是只能出现一次。
dtd文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!--定义元素 (#PCDATA)表示里面内容是文本,没有子元素-->
<!ELEMENT name (#PCDATA) >
<!ELEMENT author (#PCDATA) >
<!ELEMENT price (#PCDATA) >
<!-- 定义复杂元素(含有子元素的元素) -->
<!ELEMENT book (name,author,price)>
<!--加号表示可以出现多次-->
<!ELEMENT books (book+)>
xml文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入 books.dtd 约束 -->
<!DOCTYPE books SYSTEM "books.dtd">
<books>
<book>
<name>葵花宝典</name>
<author>东方不败</author>
<price>9.9</price>
</book>
<book>
<name>独孤九剑</name>
<author>风清扬</author>
<price>9.9</price>
</book>
</books>
*************************************************************************************************
3.3.2 XML中直接编写DTD约束
之前一直使用的引入dtd的放方式,在外部定义一个dtd文件。
我们也可以直接在xml文件中去编写dtd约束
<!DOCTYPE 根标签名 [
写dtd的约束
]>
xml文件的内容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 直接编写约束 -->
<!DOCTYPE books [
<!--定义元素 (#PCDATA)表示里面内容是文本,没有子元素-->
<!ELEMENT name (#PCDATA) >
<!ELEMENT author (#PCDATA) >
<!ELEMENT price (#PCDATA) >
<!-- 定义复杂元素(含有子元素的元素) -->
<!ELEMENT book (name,author,price)>
<!--加号表示可以出现多次-->
<!ELEMENT books (book+)>
]>
<books>
<book>
<name>葵花宝典</name>
<author>东方不败</author>
<price><![CDATA[9.9<10.9]]></price>
</book>
<book>
<name>独孤九剑</name>
<author>风清扬</author>
<price>9.9</price>
</book>
</books>
*************************************************************************************************
3.3.3 DTD定义属性(ATTLIST)
定义标签中的属性
ATTLIST attribute list ,可以定义多个属性
为一个标签定义多个属性。
标签名:属性属于那个标签的。
<!ATTLIST 标签名 -------我们给那个标签定义属性
属性名属性的类型(CDATA (EN1|EN2) )属性的约束(REQUIRED)
---为了便于阅读。把多个属性进行换行。
属性名属性的类型属性的约束
属性名属性的类型属性的约束
>
属性的类型:CDATA (en1|en2|…) 值是en1或者en2,ID,表示属性值唯一(在一个xml文件中,该标签的该属性的值不能够重复)。
属性的类型:
属性的约束
#REQUIRED 如果一个标签定义了该约束。则该属性在标签中必须书写。
#IMPLIED 可以书写该属性也可以不书写该属性
dtd文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义一个books标签,(book)表示是book的子标签,可以出现1次或者多次 -->
<!ELEMENT books (book+)>
<!ELEMENT book (name,author,price)>
<!-- (#PCDATA) 表示该标签内,只能书写文本信息 -->
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!--定义属性规则-->
<!ATTLIST author
sex (男|女) #REQUIRED
age CDATA #IMPLIED
>
sex (男|女) #REQUIRED : 不能为空
age CDATA #IMPLIED : 可以为空
xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入 books.dtd 约束 -->
<!DOCTYPE books SYSTEM "books.dtd">
<books>
<book>
<name>葵花宝典</name>
<author sex="女" age="19">东方不败</author>
<price>9.9</price>
</book>
<book>
<name>独孤九剑</name>
<author sex="女">风清扬</author>
<price>9.9</price>
</book>
</books>
*************************************************************************************************
3.3.4 DTD定义实体(ENTITY)
实体是用于定义用于定义引用普通文本或特殊字符的快捷方式的变量。
如何引用一个实体? &实体名字;
实体引用是对实体的引用。
实体可在内部或外部进行声明。
xml中出现很多重复的单词或者语句。可以使用实体进行替代。
例如: < 使用 < lt 实体的名字
写法:entity
<!ENTITY 实体名字 "实体的值">
如果在xml中。会出现很多次相同的长的字符串。也可以把这个字符串去定义一个实体。
当我们在书写该字符串的时候,就可以使用&实体名字; 去代替这个长的字符串。
dtd文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义一个books标签,(book)表示是book的子标签,可以出现1次或者多次 -->
<!ELEMENT books (book+)>
<!ELEMENT book (name,author,price)>
<!-- (#PCDATA) 表示该标签内,只能书写文本信息 -->
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!--定义属性规则-->
<!ATTLIST author
sex (男|女) #REQUIRED
age CDATA #IMPLIED
>
<!--定义字符实体-->
<!ENTITY mao "好便宜,只要9毛9">
xml中实体的引用:
&实体的名字;
例如< lt 实体的名字
xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入 books.dtd 约束 -->
<!DOCTYPE books SYSTEM "books.dtd">
<books>
<book>
<name>葵花宝典</name>
<author sex="女" age="19">东方不败</author>
<!-- 引用自定义字符实体 -->
<price>&mao;</price>
</book>
<book>
<name>独孤九剑</name>
<author sex="女">风清扬</author>
<price>9.9</price>
</book>
</books>
注意:chrome浏览器对DTD实体的支持度不够,不能够完全兼容其标准。
要想让实体正确显示,必须把DTD内置到XML里面而不是作为单独的文件。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 直接编写dtd约束 -->
<!DOCTYPE 根标签名 [
<!-- 定义简单元素规则 #PCDATA 表示该元素内部可以是文本,没有子元素-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!-- 定义复杂元素规则 复杂元素:包含子元素的元素 -->
<!ELEMENT book (name,author,price)>
<!ELEMENT books (book+)>
<!-- 定义属性 -->
<!ATTLIST author
sex (男|女) #REQUIRED
age CDATA #IMPLIED
>
<!-- 定义实体 -->
<!ENTITY mao "好便宜">
]>
<books>
<book>
<name>葵花宝典</name>
<author sex="男">东方不败</author>
<price>9.9</price>
</book>
<book>
<name>独孤九剑</name>
<author sex="男">风清扬</author>
<price>&mao;9.9</price>
</book>
</books>
*************************************************************************************************
3.4 Schema约束快速入门
3.4.1 Schema约束介绍
Schema它也是用来约束xml文件的。w3c组织提出来。想去替换掉dtd约束。
DTD的缺点:
DTD约束xml的时候,不能对xml中的数据类型做详细的限定。
DTD约束有自己的语法,书写时必须遵守DTD的语法。
一个xml文件中只能引入一个DTD约束,而无法通过多个DTD文件来约束同一个xml文件。
Schema约束:
对DTD那些缺点进行补充。Schema文件它本身就是一个xml文件。schema的语法就是xml的语法。书写的时候,它遵守xml的语法规则。
但是schema文件后缀名是xsd
schema 是一个xml。xml标签是自定义的。schema 约束xml中标签。schema中的标签是w3c 组织预先定义好。
XML Schema是用一套预先规定的XML元素和属性创建的,这些元素和属性定义了XML文档的结构和内容模式。 XML Schema规定XML文档实例的结构和每个元素/属性的数据类型
在书写Schema的时候,就和书写xml文件一样。
书写Schema文件的时候,它的文件扩展名xsd。
*************************************************************************************************
3.4.2 编写Schema约束文件
注意:
schema文件本身是xml文件,但是后缀名不同,xsd是schema文件的后缀名。
schema文件的根标签是schema
schema文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- schema 就是schema的根标签 targetNamespace:名称空间,当前的schema唯一标识,值可以是任意的字符串,
xmlns="http://www.w3.org/2001/XMLSchema" 引入约束。固定格式,引入w3c组织为schema文件本身定义好的约束
elementFormDefault:指定xml中使用别名的情况 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/books" elementFormDefault="qualified">
<element name="books">
<!-- 定义当前的标签是一个复杂标签 -->
<complexType>
<!-- 在 sequence 去定义子标签出现的顺序,定义子标签 -->
<sequence>
<element name="book">
<complexType>
<sequence>
<element name="name"></element>
<element name="author"></element>
<element name="price"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
xmlns属性:引入w3c组织为schema文件本身定义好的约束。这样我们才能在schema文件中使用相应的标签
targetNamespace属性: 名称空间,值可以是任意的字符串。
供其它xml文件引入该schema约束的必要条件之一,另一个必要条件是schema文件名
*************************************************************************************************
3.4.3 在XML中引入Schema约束
xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!--
在根标签上书写属性
xmlns:引入约束 目标schema文件的名称空间
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 写法固定。表示当前的xml文件是一个schema约束的实例。
xsi:schemaLocation:去引入 shcema文件名字空间,并找到具体的文件
格式:shcema文件名字空间 空格 具体的shcema文件
-->
<books
xmlns="http://www.itcast.cn/books"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/books books.xsd"
>
<book>
<name>葵花宝典</name>
<author>东方不败</author>
<price> 9.9</price>
</book>
</books>
xmlns属性:引入约束 目标schema文件的名称空间
xmlns:xsi属性:写法固定。表示当前的xml文件是一个schema约束的事例
xsi:schemaLocation属性:去引入 shcema文件名字空间,并找到具体的文件
注意:
1、xml文件中xmlns属性的值,一定要和 schema文件的targetNamespace 属性的值一致。
2、xml文件中xsi:schemaLocation属性的值的前半部分一定要和 schema文件 targetNamespace 属性的值一致。
3、xml文件中xsi:schemaLocation属性的值的后半部分 一定要和 schema文件名一致。
*************************************************************************************************
3.5 Schema 约束语法
3.5.1 Schema 定义别名(了解)
targetNamespace 相当于 java文件中最开始头文件中的package,只不过等号后面形式不一样,不是包名 www.thisxml.com.schema 而是 "http://www.thisxml.com/schema"。
xmlns 相当于 import。只不过这个"import"后面可以带个别名。
xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<books
xmlns="http://www.itcast.cn/books"
xmlns:mao="http://www.itcast.cn/books"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/books books.xsd"
>
<mao:book>
<mao:name></mao:name>
<mao:author></mao:author>
<mao:price>1</mao:price>
</mao:book>
</books>
Schema 文件中:
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/books"
elementFormDefault="qualified">
elementFormDefault="qualified" 可以使用别名
elementFormDefault="unqualified" 禁止使用别名
*************************************************************************************************
3.5.1 Schema 定义元素
在schema中,区分简单标签和复杂标签:简单标签,没有属性没有子标签,复杂标签,有属性或者有子标签
1、简单标签:
<element name="name"></element>
<element name="author"></element>
<element name="price"></element>
2、复杂标签:
需要在element内部去添加:
<complexType>
3、如果还有子标签,则在complexType下面添加 sequence 在sequence 添加子标签
<element name="books">
<!-- 定义当前的标签是一个复杂标签 -->
<complexType>
<!-- 在 sequence 去定义子标签出现的顺序,定义子标签 -->
<sequence>
......
</sequence>
</complexType>
</element>
4、允许出现多个子标签
schema文件的完整定义:
<?xml version="1.0" encoding="UTF-8"?>
<!-- schema 就是schema的根标签 targetNamespace:名称空间,当前的schema唯一标识,值可以是任意的字符串,
xmlns="http://www.w3.org/2001/XMLSchema" 引入约束。固定格式,引入w3c组织为schema文件本身定义好的约束
elementFormDefault:指定xml中使用别名的情况 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.itcast.cn/books"
elementFormDefault="qualified"
>
<element name="books">
<!-- 定义当前的标签是一个复杂标签 -->
<complexType>
<!-- 在 sequence 去定义子标签出现的顺序,定义子标签 -->
<sequence>
<!-- maxOccurs :表示当前标签,最多能出现的次数
如果值是unbounded 表示不限制
minOccurs="1" :表示最小能出现的次数,必需出现的次数
-->
<element name="book" maxOccurs="unbounded" minOccurs="1">
<complexType>
<sequence>
<element name="name"></element>
<element name="author"></element>
<element name="price"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
xml文件内容:
<!-- xml文件 -->
<?xml version="1.0" encoding="UTF-8"?>
<books
xmlns="http://www.itcast.cn/books"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/books books.xsd"
>
<book>
<name>葵花宝典</name>
<author>东方不败</author>
<price> 9.9</price>
</book>
<book>
<name>九阳真经</name>
<author>张无忌</author>
<price> 9.9</price>
</book>
</books>
*************************************************************************************************
3.5.2 Schema 定义属性
Schema中可以限制xml标签中的属性定义格式:
Schema文件中关键内容:
<element name="book" maxOccurs="unbounded" minOccurs="1">
<complexType>
<sequence>
<element name="name"></element>
<element name="author"></element>
<!-- type="double" 表示标签中的数据类似是double -->
<element name="price" type="double"></element>
</sequence>
<!-- attribute 允许可以去定义一个标签的属性写在complexType里面,sequence后面-->
<attribute name="id" type="integer"></attribute>
</complexType>
</element>
XML文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<books
xmlns="http://www.itcast.cn/books"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn/books books.xsd"
>
<book id="1">
<name>葵花宝典</name>
<author>东方不败</author>
<price>9.9</price>
</book>
<book>
<name>九阳真经</name>
<author>张无忌</author>
<price> 9.9</price>
</book>
</books>
*************************************************************************************************
4. dom4j 技术
4.1 解析xml相关技术介绍
我们在实际应用中,通常使用xml作为存储数据,或者配置文件(进行配置。存储功能)。所以需要获取到xml文件的内容。所以需要用一定的方法去获取到xml中的内容。转化为我们需要的内容。
xml可扩展的标记语言。不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析。
Java对dom技术解析标记型文档也做了实现:
早期sun公司就制定的 dom 技术。而这个技术在页面xml的时候需要把整个xml文件加载到内存中,可以根据getElementById、getElementsByName 、getElementsByTagName 等方法解析。
效率低。
sun公司在JDK6版本对 dom解析技术进行升级:SAX解析 Stax 解析
sax 解析技术。读取xml,理解为一行一行的去读取。读取下一行的时候,会把之前读取的内容进行释放。
sun公司的解析统称 JAXP。Java API for XMLProcessing,意为XML处理的Java API
常用的第三方解析技术工具:pull、xStream、jdom、dom4j。
*************************************************************************************************
4.2 下载dom4j
dom4j:是一个开源的api,属于第三方公司开发的产品。(dom4j的api不再jdk中。)
jar包。以jar作为文件的后缀名。其实就是一个压缩文件。里面包含了。java类的信息。
如果要使用dom4j 需要去dom4j官网下载dom4j相关资料。
去dom4j官网去现在jar包http://dom4j.sourceforge.net/
*************************************************************************************************
4.3 准备工作
4.3.1 导入dom4j 的jar包
myeclipse 使用web工程导入jar包:
将dom4j-1.6.1.jar 复制到WebRoot目录下的WEB-INF目录下的lib目录中。
*************************************************************************************************
4.3.2 编写xml文件
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<name>葵花宝典</name>
<author>东方不败</author>
<price> 19.9</price>
</book>
<book>
<name>九阳真经</name>
<author>张无忌</author>
<price> 9.9</price>
</book>
</books>
为了方便java程序读写,我们将该xml文件放置d盘的根目录下
*************************************************************************************************
4.4 使用dom4j解析xml
4.4.1 获得Document对象
public static void main(String[] args) throws DocumentException {
// TODO Auto-generated method stub
//文件读取器
SAXReader reader = new SAXReader();
//读取xml文件返回文档对象
Document document = reader.read("d:\\books.xml");
System.out.println(document);
}
*************************************************************************************************
4.4.2 获取所有标签的文本值
/**
* 获取所有标签的文本值
* @throws DocumentException
*/
@Test
public void readAllText() throws DocumentException {
// 文件读取器
SAXReader reader = new SAXReader();
// 读取xml文件返回文档对象
Document document = reader.read("d:\\books.xml");
//获得根标签(books)
Element root = document.getRootElement();
//通过根标签获得旗下所有子标签(book...)
List<Element> bookList = root.elements();
//遍历所有子标签(book...)
for (Element book : bookList) {
//得到所有子标签的子标签(name、author、price)
List<Element> bookChilds = book.elements();
//遍历所有子标签的子标签(name、author、price)
System.out.println("**********************");
for (Element bookChild : bookChilds) {
//打印出他们的名称和内容
System.out.print(bookChild.getName());
System.out.println(bookChild.getText());
}
}
}
*************************************************************************************************
4.4.3 获取指定标签的文本值
/**
* 获取指定标签的文本值
*
* @throws DocumentException
*/
@Test
public void readTextByTagName() throws DocumentException {
// 文件读取器
SAXReader reader = new SAXReader();
// 读取xml文件返回文档对象
Document document = reader.read("d:\\books.xml");
// 获得根标签(books)
Element root = document.getRootElement();
// 通过根标签获得旗下所有子标签(book...)
List<Element> bookList = root.elements();
// 遍历所有子标签(book...)
for (Element book : bookList) {
// 得到所有子标签的子标签(name、author、price)
List<Element> bookChilds = book.elements();
// 遍历所有子标签的子标签(name、author、price)
System.out.println("**********************");
//获得book的id属性等于2
//book.attributeValue("id") 获得该标签的属性值
if("2".equals(book.attributeValue("id"))){
for (Element bookChild : bookChilds) {
// 就只想获得author标签的值,
if ("author".equals(bookChild.getName())) {
// 打印出他们的名称和内容
System.out.print(bookChild.getName());
System.out.println(bookChild.getText());
}
}
}
}
}
*************************************************************************************************
4.4.4 修改指定标签的值
/**
* 修改指定标签的文本值
*
* @throws DocumentException
* @throws IOException
*/
@Test
public void updateTextByTagName() throws DocumentException, IOException {
// 文件读取器
SAXReader reader = new SAXReader();
// 读取xml文件返回文档对象
Document document = reader.read("d:\\books.xml");
// 获得根标签(books)
Element root = document.getRootElement();
// 通过根标签获得旗下所有子标签(book...)
List<Element> bookList = root.elements();
// 遍历所有子标签(book...)
for (Element book : bookList) {
// 得到所有子标签的子标签(name、author、price)
List<Element> bookChilds = book.elements();
// 遍历所有子标签的子标签(name、author、price)
System.out.println("**********************");
// 获得book的id属性等于2
// book.attributeValue("id") 获得该标签的属性值
if ("2".equals(book.attributeValue("id"))) {
for (Element bookChild : bookChilds) {
// 就只想获得author标签的值,
if ("author".equals(bookChild.getName())) {
// 修改它的内容
// 只是在内存中进行修改,需要将修改的结果写入文件中
bookChild.setText("孙悟空");
}
}
}
}
//将document对象同步到文件中
//文件写入器
XMLWriter writer = new XMLWriter(new FileWriter("d:\\books.xml"));
//开始写入
writer.write(document);
writer.close();//关闭
}
*************************************************************************************************
4.4.5 输出格式控制
漂亮的输出和紧凑的输出
漂亮的输出:便于阅读。
紧凑的输出:省流量。--- 节省xml的存储空间。
核心代码:
// 定义输出格式
OutputFormat format = OutputFormat.createCompactFormat();//紧
//OutputFormat format = OutputFormat.createPrettyPrint();//松
//format.setEncoding("gbk");//定义编码
// 将document对象同步到文件中
// 文件写入器
XMLWriter writer = new XMLWriter(new FileWriter("d:\\books.xml"),format);
// 开始写入
writer.write(document);
writer.close();// 关闭
*************************************************************************************************
4.4.6 删除标签
dom4j中通过父删除子标签
/**
* 删除标签
*
* @throws DocumentException
* @throws IOException
*/
@Test
public void deleteTag() throws DocumentException, IOException {
// 文件读取器
SAXReader reader = new SAXReader();
// 读取xml文件返回文档对象
Document document = reader.read("d:\\books.xml");
// 获得根标签(books)
Element root = document.getRootElement();
// 通过根标签获得旗下所有子标签(book...)
List<Element> bookList = root.elements();
// 遍历所有子标签(book...)
for (Element book : bookList) {
// 得到所有子标签的子标签(name、author、price)
List<Element> bookChilds = book.elements();
// 遍历所有子标签的子标签(name、author、price)
System.out.println("**********************");
// 获得book的id属性等于2
// book.attributeValue("id") 获得该标签的属性值
if ("2".equals(book.attributeValue("id"))) {
for (Element bookChild : bookChilds) {
// 就只想获得author标签的值,
if ("author".equals(bookChild.getName())) {
// 通过父标签删除
book.remove(bookChild);
}
}
}
}
// 定义输出格式
// OutputFormat format = OutputFormat.createCompactFormat();//紧
OutputFormat format = OutputFormat.createPrettyPrint();// 松
// format.setEncoding("gbk");//定义编码
// 将document对象同步到文件中
// 文件写入器
XMLWriter writer = new XMLWriter(new FileWriter("d:\\books.xml"),
format);
// 开始写入
writer.write(document);
writer.close();// 关闭
}
*************************************************************************************************
4.4.7 增加标签
dom4j中通过父添加子标签
/**
* 添加标签
*
* @throws DocumentException
* @throws IOException
*/
@Test
public void addTag() throws DocumentException, IOException {
// 文件读取器
SAXReader reader = new SAXReader();
// 读取xml文件返回文档对象
Document document = reader.read("d:\\books.xml");
// 获得根标签(books)
Element root = document.getRootElement();
// 通过根标签获得旗下所有子标签(book...)
List<Element> bookList = root.elements();
// 遍历所有子标签(book...)
for (Element book : bookList) {
// 得到所有子标签的子标签(name、author、price)
List<Element> bookChilds = book.elements();
// 遍历所有子标签的子标签(name、author、price)
System.out.println("**********************");
// 只查找book中id=1的 book.attributeValue("id");
if ("1".equals(book.attributeValue("id"))) {
//添加元素
Element element = book.addElement("mao"); //<mao></mao>
element.setText("这本书很好");//<mao>这本书很好</mao>
}
}
// 定义输出格式
// OutputFormat format = OutputFormat.createCompactFormat();//紧
OutputFormat format = OutputFormat.createPrettyPrint();// 松
// format.setEncoding("gbk");//定义编码
// 将document对象同步到文件中
// 文件写入器
XMLWriter writer = new XMLWriter(new FileWriter("d:\\books.xml"),
format);
// 开始写入
writer.write(document);
writer.close();// 关闭
}
*************************************************************************************************
5. xpath技术
5.1 xpath技术介绍
XPath 是一门在 XML 文档中查找信息的语言。
xpath专注于在xml中去查询内容。
XPath是基于XML的树状结构,提供在数据结构树中找寻节点的能力。
表达式 |
描述 |
nodename |
选取此节点的所有子节点。 |
/ |
从根节点选取。 |
// |
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. |
选取当前节点。 |
.. |
选取当前节点的父节点。 |
@ |
选取属性。 |
books |
选取 books 元素的所有子节点。 |
/books |
选取根元素 books。 |
books/book |
选取属于 books 的子元素的所有 book 元素。 |
//book |
选取所有 book 子元素,而不管它们在文档中的位置。 |
books//book |
选择属于 books 元素的后代的所有 book 元素,而不管它们位于 books 之下的什么位置。 |
//@id |
选取名为 id 的所有属性。 |
5.2 xpath技术与dom4j技术结合
5.2.1 导入相关jar包
dom4j-1.6.1\lib\jaxen-1.1-beta-6.jar
如果不导入,会报如下错误,自己看着办。
5.2.1 使用xpath查找指定标签
/**
* 使用xpath读取标签内容
* @throws DocumentException
*/
@Test
public void readTagTextByXpath() throws DocumentException {
// 文件读取器
SAXReader reader = new SAXReader();
// 读取xml文件返回文档对象
Document document = reader.read("d:\\books.xml");
//找寻name
List<Node> list = document.selectNodes("//name");
for (Node node : list) {
System.out.println(node.getText());
}
}
*************************************************************************************************
6. 总结