一、xml
1.1 xml :exterdsible markup language
可扩展的标记语言
1.2 作用
- 可以用来保存数据
- 可以用来做配置文件
- 数据传输载体
1.3 xml文档结构
比如存储两个学生对象实例数据:
<?xml version = "1.0" encoding = "UTF-8"?>
<stus>
<stu>
<name>张三</name>
<age>23</age>
<desc>asda</desc>
</stu>
<stu>
<name>李四</name>
<age>23</age>
<desc>ew</desc>
</stu>
</stus>
1.4 定义xml
文档声明:
version:解析这个文档的时候用的是什么版本的解析器
encoding:解析xml中文字的时候用的是哪种编码
standlone: no: 该文档会依赖关联其他文档,yes:这是一个独立文档
1.5 encoding
- 电脑上的文件在保存的时候并不是真正的文字,而是以对应文件编码的二进制形式进行存储的,需要使用相应的编码格式来解码才可以
- encoding是GBK或者gb2312即可。GBK是在gb2312的基础上添加了繁体字的编码
- 保存的时候ANSI,其实就是我们的本地编码GBK;
1.6 xml元素定义
- <>里面就是元素。成对出现。
- 文档声明下来的第一个元素是根元素
- 标签里面可以嵌套标签
- 空标签
- 标签可以自定义
-名称不能以数字或者表标点符号开始。
1.7 简单元素
标签里面包含了普通的文字
复杂元素:标签里面嵌套了其他的元素
1.8 属性的定义
属性定义在标签之间
1.9 注释
- 注释的格式:<!-- -->
- 注释不允许放在数据的第一行,必须放在文档声明的下面
2.1 CDTE 区域
非法字符:
< <
> glt;
& &
CDATE:如果字符串里包含了类似标签的文字,不想让xml解析器去解析,可以用CDATE来包装。
<des><![CDATE[a href = "http://www.baidu.com">拉拉</a>]]></des>
2.2 xml的解析
获取字符里面的数据或者属性数据。
方式:有很多种,有很多种。
- DOM:document object model
把整个xml全部读到内存当中,形成树状结构,。整个文档称之为document对象,属性对应Attribute对象,所有元素节点对应Element对象,文本也可以称之为text对象,以上所有元素都可以称之为node节点。如果xml特别大,那么将会造成内存不够。可以对文档进行增删改查
- SAX:Simple API for Xml
基于事件驱动
读取一行,解析一行,不会造成内存溢出,不可以进行增删,只能改查。
2.3 针对这两种解析方式的API,给出的解决方案有哪些?
jaxp sun公司,比较繁琐
jdom
dom4j 使用比较广泛
2.4 Dom4j基本用法
1.创建SAXReader对象
2.指定解析的xml
3.获取根元素
4.根据根元素获取子元素或者下面的子孙元素。
2.5 常用方法
-
public SAXReader()
创建SAXReader读取对象 -
Document read(Reader reader)
从给定的Reader对象得到一个Document对象 -
Element element(QName qName)
返回给元素下的第一个元素 -
element.elements();
返回该元素下的所有元素
2.6 举例
public class demo {
public static void main(String[] args) {
//1.创建SAX读取对象
SAXReader reader = new SAXReader();
//2.指定解析的xml源
try {
Document document = reader.read(new File("src/xml/a.xml"));
//3.得到根元素,文档声明下面的
Element element = document.getRootElement();
//4.获取根元素下面的子元素
element.element("stu").element("age").getStringValue();
element.element("stu").element("age").getText();
//5.获取所有的子元素
List<Element> list = element.elements();
list.size();
for(Element element2 : list){
System.out.println(element2.element("age").getText());
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.0 DOM4j的Xpath的使用
Dom4j里面支持xpath的写法,xpath其实就是xml的路径而言,支持我们在解析xml的时候,能够快速定位到具体的某一个元素。
步骤:
1.添加jar包依赖:jaxen-1.1-beta-6.jar
2.在查找制定节点的时候,根据Xpath语法规则来找
3.后续的代码与以前的解析代码一样
public class demo {
public static void main(String[] args) {
//1.创建SAX读取对象
SAXReader reader = new SAXReader();
//2.指定解析的xml源
try {
Document document = reader.read(new File("src/xml/a.xml"));
//3.得到根元素,文档声明下面的
Element element = document.getRootElement();
//4.要想使用xpath,必须添加支持的jar
Element name = (Element)element.selectSingleNode("//name");
System.out.println(name.getText());
List<Element> elements = element.selectNodes("//name");
for(Element ele : elements){
System.out.println(ele.getText());
}
System.out.println(elements.get(1).getText());
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3.1 xml约束
比如约束特定元素只出现一次
- DTD
- 引入网络上的DTD
<!-- 文档类型 跟标签名字 网络上的dtd dtd的名称 dtd的路径–>
<!-- DOCTYPE stus PUBLIC “//UNKNOWN/” “unknown.dtd”>–>
- 引入本地的DTD
<!-- 引入本地的dtd 根标签名字 引入本地的dtd dtd的位置–>
<! --<!DOCTYPE stus SYSTEM “stus.dtd”>–>
- 直接在XML里面嵌入DTD语法
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE stus[
<!ELEMENT stus(stu)>
<!ElEMENT stu (name,age,address)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<stus>
<stu>
<name>张三</name>
<age>18</age>
<address>是你</address>
</stu>
<stu>
<name>李四</name>
<age>128</age>
<address>是你</address>
</stu>
</stus
属性的类型定义:
CDATA : 属性是普通文字
ID: 属性的值是唯一的
<!ELEMENT stus(stu)+>: stus下面有一个或者多个元素stu
<!ElEMENT stu (name,age,address)> stu下面有两个元素name, age 顺序必须是name, age
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST stu id CDATA #IMPLIED> stu有一个属性 文本类型 该属性可有可无
语法自成,早期就出现的,可读性较差。
- [ ]Schema
就是xml,使用xml的语法规则,解析起来比较方便。是为了代替DTD,但是Schema约束文本内容比DTD的内容还要多,所以并没有真正意义上替代DTD;
xsd约束文档参考W3C标准来写,xml参照xsd的规则。
3.2 DTD与schema的区别
一个xm如果想指定他的约束规则,假设使用的是DTD,那么这个xml之能指定一个DTD,不能指定多个DTD,但是如果一个xml的约束是定义在schema里面,可以是多个schema。
3.3 名称空间的作用
就是在写元素的时候,可以指定该元素使用的是那一套规则。