(一)概述

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中的几行代码:
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
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 elements = rootElement.elements();//获取所有的直接子标签
List elements = rootElement.elements(“标签名”);//获取所有的指定名字的子标签
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 = +
xulexun+
22+
+
0571-8989765+
““;
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
XML技术[笔记] - 图1



(三)实体类嵌套List<对象>的xml字符串解析

案例:ZJJ_JavaBasic_2020/01/14_16:19:07_6spq1
XML技术[笔记] - 图2