16.XML
1.概念
XML:Extendsible Markup Language 可扩展标记语言
1.可扩展:
标签都是自定义的
2.功能:
1.配置文件
2.在网络中传输
3.与HTMl的区别
1.XML标签是自定义的,HTML标签是预定义的
2.XML语法严格,HTML语法松散
3.XML是存储数据的,HTML是展示数据的
2.语法
1.语法:
1.XML文档的后缀:.xml
2.XML文档的第一行必须是文档声明<?XML version='1.0' ?>
3.XML文档中有且仅有一个根标签
4.属性值必须使用引号(单双均可)引起来
5.标签必须正确关闭
6.XML标签区分大小写
案例:
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user id="1">
<name>比尔盖茨</name>
<age>29</age>
<gender>Male</gender>
</user>
<user id="2">
<name>埃隆马斯克</name>
<age>64</age>
<gender>Male</gender>
</user>
</users>
2.组成
1.文档声明
-
格式:
<?xml 属性列表 ?>
-
属性列表:
-
version:版本号
-
encoding:编码格式。告知解析引擎当前文档使用的字符集,默认值为:ISO-8859-1.用来校验文本 实际编码是否与告知编码集相符
-
Standalone:是否独立
取值:
yes: 不依赖其他文件
no:依赖其他文件
-
2.指令:
与css结合使用控制XML样式的,现在已经不用了
3.标签:
自定义标签
规则:
1.名称可以包含字母,数字以及其它字符
2.名称不能以数字或者标点符号开始
3.名称不能以 字母组合XML(任何大小写组合都不行,XML,Xml等)开始
4.名称不能包含空格
4.属性
规则:
1.以键值对的形式存在
2.属性必须用引号引起来
3.id属性值必须唯一
5.文本
注意:
1.文本中包含<
,>
,&
必须使用转译字符:
<
:<
&
:&
>
:>
2.原样输出:CDATA区
- 格式:
<![CDATA[内容]]>
3.约束
3.1概述
规定xml文档的书写规范
学习要求
1.会引入约束
2.大致能读懂约束
约束图解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uGMUzQOi-1614243255072)(E:\JAVA上课笔记\img\image-20210225131038125.png)]
分类
-
DTD:简单的约束技术
-
Schema:复杂的约束技术
3.2DTD
- 引入
内部DTD:将约束规则定义在XML文档中(写完外部在写内部即可)
1.外部DTD
studen.dtd
<!--students标签 它内部可以包含0-n个student标签-->
<!ELEMENT students (student*) >
<!--student标签 它内部包含name,age,sex三个标签,顺序必须按照规定顺序,并且只能出现一次-->
<!ELEMENT student (name,age,sex)>
<!--name,age,sex标签,#PCDATA代表String数据类型-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!--定义属性:student标签中,number:属性名 ID:唯一#required必须的-->
<!ATTLIST student number ID #REQUIRED>
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
<student number="s001">
<name>刘德华</name>
<age>哈哈</age>
<sex>男</sex>
</student>
<student number="s002">
<name>刘德华</name>
<age>28</age>
<sex>男</sex>
</student>
</students>
2.内部DTD
<?xml version="1.0" encoding="UTF-8" ?>
<!--<!DOCTYPE students SYSTEM "student.dtd">-->
<!DOCTYPE students [
<!--students标签 它内部可以包含0-n个student标签-->
<!ELEMENT students (student*) >
<!--student标签 它内部包含name,age,sex三个标签,顺序必须按照规定顺序,并且只能出现一次-->
<!ELEMENT student (name,age,sex)>
<!--name,age,sex标签,#PCDATA代表String数据类型-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!--定义属性:student标签中,number:属性名 ID:唯一#required必须的-->
<!ATTLIST student number ID #REQUIRED>]>
<students>
<student number="s001">
<name>刘德华</name>
<age>28</age>
<sex>男</sex>
</student>
<student number="s002">
<name>刘德华</name>
<age>28</age>
<sex>男</sex>
</student>
</students>
通过上述案例,我们不难发现DTD的弊端:无法对属性内容进行限定
外部DTD
- 本地的:
<!DOCTYPE 根标签 SYSTEM "DTD文件位置">
- 网络的:
<!DOCTYPE 根标签 PUBLIC "DTD文件名" "DTD文件位置(URL)">
内部DTD
<!DOCTYPE 根标签 [外部DTD]>
3.3Schema
Schema文档要求能读懂,可以做简单的修改即可
Student.xsd
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.wdit.cn/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.wdit.cn/xml" elementFormDefault="qualified">
<xsd:element name="students" type="studentsType"/>
<xsd:complexType name="studentsType">
<xsd:sequence>
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="studentType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<xsd:attribute name="number" type="numberType" use="required"/>
</xsd:complexType>
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="numberType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="IT_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wc1B6ahK-1614243255073)(E:\JAVA上课笔记\img\image-20210225153303960.png)]
Student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--
1.根元素
2.固定格式:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空间; xsi:schemaLocation="http://www.wdzl.cn/xml student.xsd"
*http://www.wdzl.cn/xml:命名空间
*student.xsd:约束文件存储路径
-->
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.wdit.cn/xml student.xsd"
xmlns="http://www.wdit.cn/xml">
<student number="IT_0001">
<name>周杰伦</name>
<age>18</age>
<sex>male</sex>
</student>
</students>
4.解析
4.1常见XML操作
1.解析:将XML文档中数据读到内存中
2.持久化:将内存中数据保存到XML文档中(不常用)
4.2解析XML方式
1**.DOM**:将标记语言文档一次性加载到内存,在内存中形成一个DOM树
优点:操作简单,可以对文档进行CRUD(增删改查)
缺点:占内存,不适合移动和嵌入式设备
2.SAX(Simple API for XML):逐行读取基于事件驱动的解析方式
3.第三方解析
- jdom:在dom基础上进行了封装
- dom4j:在jdom基础上进行了封装
- pull:主要用在Android手机开发,它与SAX解析方式类似,都是事件驱动方式解析XML文件
5.dom4j解析技术-重点
5.1dom4j类库的使用
由于dom4j它不是sun公司的技术,而属于第三方公司的技术,需要配置依赖jar包。
5.2dom4j 解析案例
1.准备xml解析用例
<?xml version="1.0" encoding="UTF-8" ?>
<books>
<book bid="BID123456">
<name>Java葵花宝典</name>
<price>20.59</price>
<author>詹姆斯高斯林</author>
</book>
<book bid="BID123444">
<name>Java入门宝典</name>
<price>29.9</price>
<author>比尔盖茨</author>
</book>
</books>
2.准备对应的Book类
package org.wdit.xml.dome4jtest;
public class Book {
private String bid;
private String name;
private String price;
private String author;
public Book(){
}
public Book(String bid, String name, String price, String author) {
this.bid = bid;
this.name = name;
this.price = price;
this.author = author;
}
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"bid='" + bid + '\'' +
", name='" + name + '\'' +
", price='" + price + '\'' +
", author='" + author + '\'' +
'}';
}
}
3.新建jar包,并将jar添加到项目中
4.使用dom4j读取XML文件
5.通过Document对象获取xml数据,并包装成实体类
package org.wdit.xml.dome4jtest;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.jupiter.api.Test;
import java.util.List;
public class dom4jtest {
@Test
public void test() throws DocumentException {
//将XML文件包装成Document对象
SAXReader saxReader=new SAXReader();
Document document = saxReader.read("books.xml");
System.out.println(document);
}
@Test
public void test2() throws DocumentException {
SAXReader saxReader=new SAXReader();
Document document = saxReader.read("books.xml");
//2.通过Document对象获取根元素
Element rootElement = document.getRootElement();
//3.获取根元素的子元素集合
List<Element> books = rootElement.elements("book");
//4.遍历,处理每一个标签,并将数据包装成book类对象
for(Element book:books){
//书名
Element nameElement = book.element("name");
String name = nameElement.getText();
// System.out.println(name);
//价格
Element priceElement = book.element("price");
String price = priceElement.getText();
//作者
String author = book.element("author").getText();
//属性
String bid = book.attributeValue("bid");
//包装对象
System.out.println(new Book(bid,name,price,author));
}
}
}
String name = nameElement.getText();
// System.out.println(name);
//价格
Element priceElement = book.element("price");
String price = priceElement.getText();
//作者
String author = book.element("author").getText();
//属性
String bid = book.attributeValue("bid");
//包装对象
System.out.println(new Book(bid,name,price,author));
}
}
}