前言:学习xml基础的代码和相关jar包,chm文件都在GitHub中,链接如下:
https://github.com/litBlue/xml-study.git
一、xml的应用
1.不同的系统之间传输数据
2.用来表示生活中有关系的数据
3.经常用在文件配置
二、xml的语法
1.xml的文档声明
(1)一定要放在第一行
(2)创建一个文件,后缀名是 .xml
(3)如果写xml,必须要有一个文档声明(写了文档声明之后,表示写xml文件的内容)
<?xml version="1.0" encoding="utf-8"?>
2.定义元素(标签)
(1)形式: <person></person> 或 <person/>
(2)标签可以没有内容,可以在标签内结束
(3)标签可以嵌套
(4)命名规范:
区分大小写
不能以数字和下划线开头
不能以xml,XML,Xml 开头
不能包含空格和冒号
可以是中文
(5)一个xml文档有且只能有一个根标签,其他标签要在根标签内
**注意:
在xml中,空格和换行都会被当做原始内容处理。
3.定义属性
(1)一个标签上可以有多个属性
(2)属性名不能相同
(3)属性值用单引号或者双引号包起来
(4)命名规范与定义元素的相同
4.注释 <!-- -->
5.特殊字符
*转义与html中相同
6.CDATA区(了解)
(1)可以解决多个字符都需要转义的操作,把这些内容放在CDATA区中就不需要转义了
(2)写法: <![CDATA[ 内容 ]]>
(3)把特殊字符当做文本内容,而不是标签
7.PI指令 (了解)
(1)可以在xml设置样式
(2)写法:
<?xml-stylesheet type="text/css" href="css的路径"?>
三、xml的约束
1.应用
xml标签是自定义的,需要技术来规定xml中只能出现的元素,这时候就需要约束
2.xml的约束常用的技术: dtd schema
四、dtd的使用
1.创建一个dtd文件,后缀名为 .dtd
2.具体步骤
(1)看xml中有多少元素,有几个元素就添加几个<!ELEMENT>
(2)判断元素是简单元素还是复杂元素
-复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素)>
-简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
(3)需要在xml引入dtd文件
eg:xml: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE person SYSTEM "test.dtd"> <person> <name>zs</name> <age>20</age> </person> dtd: <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)>
3.注意:
打开xml文件使用浏览器打开的,浏览器只校验语法,不检验约束,可以使用编译器。
4.dtd的三种引入方式
(1)引入外部的dtd 文件,如上例
<!DOCTYPE person SYSTEM "test.dtd">
(2)引入内部的文件
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE person [ <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]> <person> <name>zs</name> <age>20</age> </person>
(3)使用网络上的dtd
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
5.使用dtd定义元素
(1)语法: <!ELEMENT 元素名 约束>
(2)简单元素:没有子元素的元素
<!ELEMENT name (#PCDATA)>
*** (#PCDATA): 约束name 是字符串类型
***EMPTY : 元素为空(没有内容)
***ANY::任意
(3)复杂元素:
<!ELEMENT 元素名称 (子元素)>
-表示子元素出现的次数
+ 表示出现一次或者多次
? 表示出现0次或者1次
* 表示出现0或者多次
若未出现上述中的任何一个,表示必须且只能出现一次
eg: <!ELEMENT person (name+,age?,addres*)>
-子元素直接使用逗号隔开,表示元素出现的顺序
-子元素直接使用 | 隔开,表示元素只能出现其中任意的一个
6.使用 dtd 定义属性
-语法:
<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
-属性值类型
CDATA :表示字符串
枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个
红绿灯效果
ID:表示属性的取值只能是字母或下划线
-属性的约束
#REQUIRED:表示该属性必须出现
#IMPLIED:表示该属性可有可无
#FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"
直接值:表示属性的取值为该默认值
eg: <!ATTLIST 商品 类别 CDATA #REQUIRED 必须的 颜色 CDATA #IMPLIED 可选的 > 对应的XML为:<商品 类别=“服装” 颜色=“黄色”/>
7.实体的定义
语法: <!ENTITY 实体名称 "实体的值">
使用实体 &实体名称;
注意:
定义实体需要卸载内部 dtd里面,如果写在外部的dtd里面,在某些浏览器下得不到
五、xml的解析
1.xml是标记型文档,解析xml的技术有 dom 和 sax
dom方式解析
*根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象。
*优点:方便实现增删改操作
*缺点:如果文件过大,容易造成内存溢出
sax方式解析:
*采用事件驱动,边读边解析
-从上到下,一行一行的解析,解析到某一个对象,返回对象名称
*优点:文件过大不会溢出,方便实现查询操作
*缺点:不能实现增删改操作
六、实现增删查改操作
具体的操作在顶部提供的代码链接中
七、schema的约束
1.schema文件自身就是一个xml文件,但是扩展名通常为 .xsd
其也必须要有一个根节点,但是这个根节点的名称为schema
2.一个xml中可以有多个schema,多个schema使用名称空间分区(类似于Java包名)
3.dtd 里面有PCDATA类型,但是在schema中可以支持更多的数据类型
八、schema的快速入门
1.创建一个schema文件,后缀为 .xsd
2.在schema中,
-属性 xmlns="http://www.w3.org/2001/XMLSchema" 表示当前xml文件是一个约束文件
-targetNamespace="http://www.litBlue.cn/zcm" 表示使用schema约束文件,直接通过这个地址引入约束文件
-elementFormDefault="qualified"
3.步骤
(1)看xml中有多少个元素
<element>
(2)看简单元素和复杂元素
*如果是复杂元素
<complexType> <sequence> 子元素 </sequence> </complexType>
*如果是是简单元素,写在复杂元素里面
<element name="person"> <complexType> <sequence> <element name="name" type="string"></element> <element name="age" type="int"></element> </sequence> </complexType> </element>
4.在被约束文件中引入.xsd文件
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="zcm" xsi:schemaLocation="zcm SchemaDemo.xsd"> <name>张三</name> <age>18</age> </person>
-- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
表示xml是一个被约束的文件
-- xmlns="zcm"
是约束文档里面的targetNamespace
-- xsi:schemaLocation="zcm SchemaDemo.xsd"
targetNamespace 空格 约束文档的地址路径
5.复杂元素指示器
表示元素出现的顺序
表示元素只能出现一次
元素只能出现其中的一个
maxOccurs="unbounded" :表示元素不限制出现的次数
表示任意元素
6.可以约束属性
(1)写在复杂元素里面
(2)写在 之间
(3)写法:
<attribute name="id1" type="int" use="requried"></attribute>
-name:属性名称
-type:属性类型 int string
-use 属性是否必须出现 required
7.引入多个schema:
九、sax解析
1.sax:事件驱动,边读边解析
在javax.xml.parsers包中
-SAXParser:此类实例可以从 SAXParserFactory.newSAXParser() 方法获得
-SAXParserFactory
实例newInstance(); 方法获得
sax执行过程:
-当解析到开始标签的时候,自动执行 startElement方法
-当解析到文本的时候,自动执行characters方法
-当解析到结束标签的时候,自动执行endElement方法
2.使用jaxp的sax方式解析xml
-sax 方式不能实现增删改操作,只能做查询
-执行parse方法,第一个参数是路径,第二个参数是事件处理器
-实例看代码
十、使用dom4j解析xml
1.了解: dom4j是一个组织,针对xml解析,提供dom4j解析器
dom4j 不是javaee的一部分,需要导入jar包
2.具体资料,代码在链接中
十一、使用dom4j支持xpath的操作
可以直接获得某个元素
第一种形式 :
/AAA/DDD/BBB : 表示一层一层的,AAA下面的DDD下面的BBB
第二种形式:
//AAA 表示所有的AAA
第三种形式:
//AAA/* 表示AAA下面的所有元素
第四种形式:
BBB[1] 表示第一个
BBB[last()] 表示最后一个
第五种形式:
//BBB[@id]
注意:
默认情况下。dom4j不支持xPath
如果想要使用,需要导入jar包,使用 jaxen-1.1-beta-6.jar