(一)概述
XML概述
XML:Extensible(可扩展的) Markup(标记的) Language(语言)
这是一门独立的语言,与Java没有关系,但是Java,C,C#都可以使用它
可扩展:扩展性特别强,基本上任何语言都可以使用它
标记: <开始标记> 内容 </结束标记>
XML语言发展史:
XML一共有两个版本 XML1.0 XML1.1(没人用)
我们开发中1000%绝对用的XML1.0
XML语言的作用:
a.保存数据(传输数据)
b.给框架做配置文件(数据库)
(二)XML用途
①:配置文件(例子:Tomcat的web.xml,server.xml……),XML能够非常清晰描述出程序之间的关系
②:程序间数据的传输,XML的格式是通用的,能够减少交换数据时的复杂性!
③:充当小型数据库,如果我们的数据有时候需要人工配置的,那么XML充当小型的数据库是个不错的选择,程序直接读取XML文件显然要比读取数据库要快呢!
(三)XML语法
1.XML的文档声明
常见一个文件,后缀必须是.xml
文档声明的格式:
<?xml 属性名=”属性值” 属性名=”属性值” ?>
属性有两个:
version 值必须是1.0 或者 1.1 (我们绝对使用1.0)
encoding 文件的编码 默认是UTF-8(建议写上)
注意:使用Eclipse可以自动生成带有文档声明的XML文档
2.XML的注释
快捷键: ctrl+shift+/ 自动出现注释
3.XML的标签/标记/元素(Element)
格式:
<开始>内容</结束>
注意事项:
1.内容 可以是普通文本,也可以是其他标签
2.标签名 不能使用特殊符号,不建议使用xml,XMl,xML开头或者结尾
3.如果是空元素,建议写成自闭合标签, ————->
重要:
一个XML 只有一个根标签(根标签:最最最外层那个标签)
4.XML元素的属性(attribute)
每一个元素都可以添加属性,但是属性必须添加到开始元素中
格式:
<开始元素 属性名=”属性值” 属性名=”属性值” ></结束元素>
注意:
a. 属性值 必须用 “”或者’’ 引起来,(建议用双引号)
b. 一个元素中,可以有0-N个属性,但是不能有相同名字的属性
c. 属性名必须以字母开头,且中间不能用特殊符号
5.XML的转译字符
需求: 要求写一个标签,标签内容:
if(5>10 || 6<8){
System.out.println(“傻了”);
}
如果XML中出现以下特殊符号,那么必须转译
> >
< <
“ "
‘ '
& &
建议使用浏览器查看XML的最终效果
6.XML的CDATA区
需求:要求写一个标签,标签内容:
String s = “abc”;
int count = 0;
for(int i = 0;i < s.length() ; i++){
char c = s.charAt(i);
if(c >= ‘a’ && c <= ‘z’){
count++;
}
}
System.out.println(“count = “ + count);
当标签内容出现大量需要转译的字符时,
建议把这些大量需要转译的字符,直接写到CDATA区中
CDATA区的格式:
<![CDATA[
大量需要转译的字符
]]>
(四)XML约束
什么叫XML约束:
规定XML中每个标签,以及每个标签的属性,标签的内容
一.DTD约束 *
什么是DTD约束: Document Type Definition(文档类型定义约束)
重点:我们开中的重点,不是写DTD约束,而是根据DTD约束写出符合要求的XML
根据DTD写XML的步骤
1.在你的XML中 引入DTD约束文档
在DTD文件中拷贝一行代码:
<!DOCTYPE beans SYSTEM “bean.dtd”>
根标签名字 本地 DTD文件的名字
2.根据Eclipse的提示编写XML即可
根据内容模板 Content Model 来写子标签即可
表示该标签出现的次数>=0
? 表示该标签出现的次数<=1
+ 表示该标签出现的次数>=1
| 表示多个标签中选择一个
, 表示多个标签出现的先后顺序
在开发中借助Eclipse的智能提示,快速完成XML的编写
[了解]在XML中引入DTD约束的三种方式:
a.引用内部DTD,直接在XML中写DTD文档,这种写法只对该XML有效
b.引用外部本地DTD: 该DTD在本地或者公司内部网络
<!DOCTYPE beans SYSTEM “bean.dtd”>
c.引用外部公共DTD: 该DTD在公共的网络上,任何人都可以使用
<!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN 2.0//EN”
“http://www.springframework.org/dtd/spring-beans-2.0.dtd">
[了解]DTD的语法:
<!Element 定义元素
<!ATTLIST 定义属性
具体语法可以参照DTD文件
二.schema约束 **
什么是schema约束:
另外一种XML约束
\ 它比DTD约束更加强大:
a.数据类型更丰富
b.支持命名空间(类似Java包)
[重点重点重点]我们开发中的重点,不是编写schema文档,而是根据schema约束文档编写符合要求的XML
根据Schema文档编写XML的步骤:
1.在XML中引入schema约束文档
schema文档,本质也是XML,但是后缀不是xml,而是xsd
我们的XML 根据schema约束文档编写,schema约束文档根据官方文档
拷贝schema中的几行代码:
xsi:schemaLocation=”http://www.itcast.cn/bean bean-schema.xsd”
>
与DTD不一样,schema中拷贝过来的其实就是根标签的开始标签,我们要补充结束标签
2.根据eclipse的提示,完成XML的编写即可
根据内容模板 Content Model 来写子标签即可
* 表示该标签出现的次数>=0
? 表示该标签出现的次数<=1
+ 表示该标签出现的次数>=1
| 表示多个标签中选择一个
, 表示多个标签出现的先后顺序
[了解]schema支持命名空间
什么是命名空间:类似于Java中包
[了解]schema的语法
(五)XML解析
什么叫XML解析:
就是通过Java代码,将保持在XML中的数据提取出来
通过我们学过IO流,能解析,但是过程是十分繁琐
前辈们根据不同的解析方式,分别编写一些类和接口,称为解析器
解析方式:是指解析思想,解析理论
解析器: 是对解析方式的代码实现(API非常复杂)
解析开发包: 封装解析器繁琐的代码,提供简化的代码实现
常用的XML解析理论(解析方式)
a.Dom解析理论:
要求一次性把整个XML加载到内存,最终生成一个Document对象
缺点:
内存占用大,可能导致内存溢出
优点:
整个XML的结构是完整的,就可以对象XML中元素进行增删改查
b.SAX解析理论:
要求读取一行,解析一行,释放一行
缺点:
XML结构不完整
优点:
内存占用小,速度快
c.PULL解析理解:
Android系统内置默认的解析方式
在解析方式这种理论的基础上,开发了解析器(API非常繁琐)
**
常见的解析开发包:
JAXP:它是sun公司提供的解析开发包,即支持Dom解析也支持SAX解析
JDOM: dom4j兄弟
Jsoup: 我们一般用它来解析HTML
Dom4j: 是我们开发过程中最最最最常用的XML解析开发包
使用Dom4j第三方框架,解析XML文档前提
a.Dom解析理论的原理
将整个XML 加载到内存,开始解析最终生成一个Document对象
b.倒立Dom树模型
此Document对象就是一个倒立的Dom树模型
使用Dom4J第三方框架解析XML文档的步骤
1.添加classpath
a.在项目根目录下创建一个文件夹叫lib
b.拷贝第三方框架的字节码文件jar包
c.右键点击需要添加jar包——>build path —->add to build path
就是可以是JDK类一样使用框架中的类
2.解析步骤
使用Dom4j中的核心类,专门用来加载整个XML,并解析最后返回一个Document对象
核心类: SAXReader
总结:
1.使用DTD约束编写XML
2.使用schema约束编写XML
3.使用Dom4j解析开发包解析XML
步骤:
a.使用SAXReader 加载XML,生成Document对象
Document document = new SAXReader().read(new File(“xxx.xml”));
b.获取根标签
Element rootElement = document.getRootElement();
c.获取属性(如果有)
String 属性值 = rootElement.attributeValue(“属性名”);
d.获取子标签
List
List
e.遍历所有的子标签
循环反复cde步骤,直到最后一层标签为止
如果最后一层不是标签,而是文本???
调用标签的getText()或者getTextTrim();
xstream
(一)xml字符串转对象
实体类
public class Person { private String name ; private String age ; private String sex ; private String telphone ;//**省略getset方法 |
---|
转换方法
| public static void main(String[] args) {
String my = “
“
“
“
“
““;
XStream xStream = new XStream();
xStream.alias(“person”,Person.class);
Person person = (Person)xStream.fromXML(my);
System.out.println(person.getName());
System.out.println(person.getAge());
System.out.println(person.getSex());
System.out.println(person.getTelphone());
} |
| —- |
(二)xml实体类互相转换
案例:ZJJ_JavaBasic_2020/01/14_15:26:19_1xm91 ![]() |
---|
(三)实体类嵌套List<对象>的xml字符串解析
案例:ZJJ_JavaBasic_2020/01/14_16:19:07_6spq1 ![]() |
---|