XML
第一章 XML概念及基本语法
1-1 什么是XML?都有哪些版本?
XML为可扩展标记语言,全称为Extensible Markup Language。
XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。
W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用。
我们现在实际项目开发中所使用的都是1.0版本,1.1版本不予考虑。
1-2 XML用处
(1)数据传输(数据传输媒介)
场景1
A公司 java语言
Person p = new Person(“A0001”,”zs”,23);
{“id”:”A0001”,”name”:”zs”,”age”:23}
{id:”A0001”,name:”zs”,age:23}
将p转换成xml文档
person.xml
A0001
zs
23
场景2:
后端(java)连接数据库,取得数据
将数据传输到前端(html)
前端接收数据!!!
使用什么语言来接收数据???
示例:从数据库表中取得 A0001 zs 23
在后台封装到p对象中
Person p = new Person(“A0001”,”zs”,23);
后台将p对象传输到前端js
js来接收p对象
将p转换成xml文档
js解析xml文档
var p = 解析xml得来的数据.
在未来的实际项目开发中,作为数据传输的媒介,xml语法冗长,外部解析插件支持性差,所以我们不用这种形式.
我们未来应用的最多的数据传输媒介的方式是json
(2)配置文件
xml作为配置文件来使用,在每一项技术中,xml的配置文件的作用都不相同.
比如在学习servlet/jsp的时候,我们要使用到的是叫做web.xml的配置文件.这个配置文件的作用是web开发的主配置文件.所有的servlet类必须经过在web.xml中进行注册之后,才能够使用.
在我们以后的框架的学习中,每一款框架都会要求有xml配置文件的应用,不同的框架对于xml配置的作用都是不同的.
1-3 XML语法
(1)创建普通文本文件,后缀名为xml
(2)声明
语法:
解析:
a、文档声明必须以结尾
b、文档声明必须在文档中的0行0列
c、文档声明的3个属性
versioin属性:指定XML文档版本.必须属性,因为我们 不会选择1.1,只会选择1.0;
encoding属性:指定当前文档的编码。可选属性,默认 值是utf-8;
standalone属性:指定文档独立性。可选属性,默认值 为yes,表示当前文档是独立文档。如果为no表示当前文档不 是独立的文档,会依赖外部文件。
(3)元素
语法:
解析
a、元素是XML文档中最重要的组成部分,
b、普通元素的结构开始标签、元素体、结束标签组成。例如: 你好
c、元素体:元素体可以是元素,也可以是文本,例如:
你好
d、空元素:空元素只有开始标签,而没有结束标签,但元素必 须自己闭合.例如:
e、元素命名:
区分大小写
不能使用空格,不能使用冒号:
不建议以XML、xml、Xml开头
良好的XML文档,必须有一个根元素。
(4)属性
语法:
解析:
a、属性是元素的一部分,它必须出现在元素的开始标签中
b、属性的定义格式:属性名=属性值,其中属性值必须使用 单引或双引
c、一个元素可以有0~N个属性,但一个元素中不能出现同名 属性
d、属性名不能使用空格、冒号等特殊字符,且必须以字母开 头
(5)注释
语法:
解析:
与html一样,以“ ”结束。xml解析器会 自动忽略掉注释掉的xml代码。
(6)转义字符
5<3
语法:
< 对应<小于号
>对应>大于号
& 对应&和
' 对应' 单引号
" 对应" 双引号
解析:
a、因为很多符号已经被XML文档结构所使用,所以在元素 体或属性值中想使用这些符号就必须使用转义字符
b、xml中的转义字符与html中的使用方式一样
(7)CDATA区
如果我们表述的文本中出现了大量的需要转义的字符,如果一个一个进行转换,那么会非常麻烦,我们可以使用CDATA来完成,写在CDATA中的内容是不需要进行转义操作的.
语法:
<><><><><>>>>>><><><><><><&&&&&&’’’””””””””””””’>>
]]>
第二章 XML约束
2-1 DTD约束
DTD(Document Type Definition),文档类型定义,用来约束xml文档。规定xml文档中元素的名称,子元素的名称及顺序,元素的属性等。
2-2 Schema约束
同DTD约束一样,也是用来约束xml文档用的技术。
从功能上讲,Schema约束要比DTD强大很多,是DTD 替代者
Schema本身也是xml文档,但Schema文档的扩展名为xsd,而不是xml。
创建包结构
2-3通过使用约束对web.xml进行搭建
见代码
2-4 面试题:XML与DTD、Schema的关系是什么
回答:dtd与schema也是xml,是传统xml文件的约束扩展
第三章 XML文档解析
3-1什么是XML文档解析
将xml文档中的元素、属性、文本内容进行拆解,我们获得 这些组件的过程就叫做xml的解析工作。
3-2 XML文档解析方式
3-3 常见的XML解析开发包
JAXP:sun公司提供支持DOM和SAX开发包
JDom:dom4j前身
dom4j:实际开发中最常用的解析开发包
3-4 使用dom4j技术解析XML案例
(1)导入jar包
dom4j-1.6.1.jar
(2)操作流程
dom4j 必须使用核心类SaxReader加载xml文档获得 Document,通过Document 对象获得文档的根元素,然后就可 以继续操作了。
(3)常用API
a、SaxReader对象
read(…) 加载执行xml文档
Document对象
getRootElement() 获得根元素
b、Element对象
elements(…) 获得指定名称的所有子元素。可以不指定 名称
element(…) 获得指定名称第一个子元素。可以不指定 名称
getName() 获得当前元素的元素名
getText() 获得当前元素的文本内容
(4)具体代码实现方式:
a.导入jar包
b.创建一个核心对象 SAXReader
new SAXReader();
c.将xml文档加载到内存中形成一棵树
Document doc=reader.read(文件)
d.获取根节点
Element root=doc.getRootElement();
e.通过根节点就可以获取其他节点(文本节点,属性节点, 元素节点)
获取所有的子元素
List list=root.elements()
3-5 dom4j技术的扩充–xpath的解析方式
(1)什么是xpath解析
(2)xpath常用方式
3-6 XML与JSON的比较
XML和JSON都可以完成不同系统之间数据交换。
XML体积较大,解析难度较大,所以在现代开发中通常采用JSON进行数据交换,因为JSON体积小,解析简单,而XML通常充当系统当中的配置文件
解析xml的两种形式:
dom4j/xpath
<?xml version="1.0" encoding="UTF-8"?>
<Person>
<p1>
<id>A0001</id>
<name>zs</name>
<age>23</age>
</p1>
<p2>
<id>A0002</id>
<name>ls</name>
<age>24</age>
</p2>
<p3>
<id>A0003</id>
<name>ww</name>
<age>25</age>
</p3>
</Person>
package com.wkcto.test;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Test1 {
public static void main(String[] args) throws Exception {
/*
* 创建出来一个reader对象 阅读器
* 该阅读器用来读xml文档
*/
SAXReader reader = new SAXReader();
/*
* 此时doc对象代表的就是person.xml
* 解析doc对象就相当于是解析person.xml了
* 所以我们接下来就是对于doc对象的操作
*/
Document doc = reader.read("src/com/wkcto/xml/person.xml");
//取得跟元素 Person
Element root = doc.getRootElement();
//查看元素的名字
/*String name = root.getName();
System.out.println(name);*/
//通过根元素取得一级子元素 p1 p2 p3
//eList p1 p2 p3
List<Element> eList = root.elements();
for(Element e:eList){
/*String ename = e.getName();
System.out.println(ename);*/
//通过一级子元素取得里面的二级子元素 每一个一级子元素下的id name age
List<Element> eeList = e.elements();
for(Element ee:eeList){
/*String eename = ee.getName();
System.out.println(eename);*/
//取得元素下的文本
String text = ee.getText();
System.out.println(text);
}
System.out.println("--------------");
}
}
}
第二种解析
package com.wkcto.test;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class Test2 {
public static void main(String[] args) throws Exception {
/*
* 创建出来一个reader对象 阅读器
* 该阅读器用来读xml文档
*/
SAXReader reader = new SAXReader();
/*
* 此时doc对象代表的就是person.xml
* 解析doc对象就相当于是解析person.xml了
* 所以我们接下来就是对于doc对象的操作
*/
Document doc = reader.read("src/com/wkcto/xml/person.xml");
//取得跟元素 Person
Element root = doc.getRootElement();
/*
* Node接口是Element接口的父接口
*
* 我们要用的是Element接口
* 但是我们现在有的是Node接口
*
* 我们要用的是儿子
* 但是我们现在有的是父亲
*
* 是一个父亲转儿子的过程
*
* 父亲:上级
* 儿子:下级
*
*/
Element e = (Element) root.selectSingleNode("//p1/name");
System.out.println(e.getText());
/*
*
* 以上形式为xpath的形式,xpath表示需要你自己写路径找到指定的元素
*
* 总结:
* 在实际项目开发中
* 如果需求为遍历出文档中所有的元素及文本,我们习惯于使用传统的dom4j的形式,参见Test1.java
* 如果需求为快速的找到指定的xml元素,那么我们习惯于使用dom4j的扩展形式xpath的形式,参见Test2.java
*
* 注意:
* xpath的形式是传统dom4j形式的扩展形式,不能独立存在
* jaxen-1.1-beta-6.jar(支持xpath的jar包)不能独立存在,必须依附于dom4j.jar才能使用
*
*
*/
}
}