一、XML是什么?
XML 指可扩展标记语言
XML 被设计用来传输和存储数据。
在我们的 XML 教程中,你将了解什么是 XML,以及 XML 与 HTML 之间的差异。
XML 很重要,也很容易学习。
之前见过xml文件吗?见过 c3p0-config.xml
以后开发中比如ssm框架 写的xml相当多!!!慢慢自然而然就会。写多了
xml就是用来存储数据的
html w3c组织定义好的标签
xml 自己定义的标签,全部是双边的标签
二、自己写一个XML文件
代码如下(示例):
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book category="science">
<title lang="jpm">大力出奇迹</title>
<author>张三</author>
<year>2021</year>
<price>13.574</price>
</book>
<book category="文学">
<title lang="jpm">三国</title>
<author>罗贯中</author>
<year>2021</year>
<price>25.36</price>
</book>
<!-- 例子中的根元素是<bookstore>.只能有一个根元素.文档中的所有<book> 元素都被包含在<bookstore>中
<book>元素有4个子元素:<title>.<author>.<year>.<price>
-->
</bookstore>
<?xml version="1.0" encoding="utf-8"?>
<!-- xml文件的声明
告诉解析器当前版本是1.0的版本
编译器是utf-8
[注意事项]:
1.只能有一个根元素
2.标签必须是成双成对的
3.一定要见名知意
-->
<students>
<student>
<name>张三</name>
<age>68</age>
<gender>男</gender>
</student>
<student>
<name>李四</name>
<age>25</age>
<gender>女</gender>
</student>
</students>
三、XML文件约束
1.DTD约束:
文档类型定义(DTD)可定义合法的XML文件构建模块。就意味着你不能随便写标签了
2.Schema约束:
XML-Schema是基于XML的DTD替代者
XML-Schema描述XML文档的结构
XML-Schema语言也称作XML-Schema定义(XML Schema Definition,XSD)
3.1DTD约束
代码如下(示例):
dtd文件:
<!--students 根节点,要求根节点存放在student根标签-->
<!ELEMENT students (student*)>
<!--student 标签有哪几个子标签-->
<!ELEMENT student (name, age ,sex)>
<!--所有子标签当前的数据都是文本形式存在的-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!--student还想有一个id属性 ATTLIST 属性列表-->
<!ATTLIST student id ID #REQUIRED>
<!--以后记住不用写!!!都是别人封装好的!!你只需要把人家写好的DTD
引入到你的XML文件中使用即可!!你没有这个能力写dtd文件
ssm都是封装好的。目的
使程序统一化-->
xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<!--如果没有引入dtd文件随便写都不会报错!!!-->
<!--但是引入了dtd文件以后只能按照别人约束好的来写-->
<!--引入我们刚才写好的dtd文件-->
<!--<!DOCTYPE 根元素 SYSTEM "文件名"-->
<!--文件名是一个绝对路径-->
<!DOCTYPE students SYSTEM "E:\IdeaProjects\day33_xkh\src\com\qfedu\dtd\student.dtd">
<!--写完约束dtd约束以后,不能再随便写标签了-->
<students>
<student id="java_01">
<name>张三</name>
<age>25</age>
<sex>1</sex>
</student>
</students>
3.2Schema约束
是DTD的一个替代品,约束的更加严格
1.新建一个xsd文件
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.qfedu.com/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.qfedu.com/xml" elementFormDefault="qualified">
<!-- xmlns=url 使用默认的名称空间,后面url随便写
xmlns:xsd=url 可以引入多个xml schema文档
targetNamespace 指定schema元素属于哪个命名空间
-->
<!-- 根节点名字和包含的内容,内容是自定义studentType -->
<xsd:element name="students" type="studentsType"/>
<!-- studentType类型声明 -->
<xsd:complexType name="studentsType">
<xsd:sequence>
<!-- students根节点中存放的是student类型 type="studentType" 要求student的个数从0开始 个数不限制 -->
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- studentType声明 -->
<xsd:complexType name="studentType">
<xsd:sequence>
<!-- 要求student标签内有name,age,sex子标签,并且要求对一个对应保存的数据类型是type指定 -->
<xsd:element name="name" type="xsd:string"/>
<!-- ageType 和 sexType 是自定义数据约束 -->
<xsd:element name="age" type="ageType" />
<xsd:element name="sex" type="sexType" />
</xsd:sequence>
<!-- 给予Student标签属性 属性为id,要声明idType, use="required"不可缺少的 -->
<xsd:attribute name="id" type="idType" use="required"/>
</xsd:complexType>
<!-- sexType性别类型声明 -->
<xsd:simpleType name="sexType">
<xsd:restriction base="xsd:string">
<!-- 有且只有两个数据 male female -->
<xsd:enumeration value="male"/>
<xsd:enumeration value="female"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<!-- 0 ~ 256 要求范围,是一个integer类型 -->
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="256"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="idType">
<xsd:restriction base="xsd:string">
<!-- ID类型,要求gp_xxxx(四位数字) -->
<xsd:pattern value="java_\d{4}"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
2.XML文件:
<?xml version="1.0" encoding="utf-8" ?>
<!--填写根节点的约束关系 schema约束,外部的xsd文件约束进来-->
<students xmlns="http://www.qfedu.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.qfedu.com/xml student.xsd">
<!--以上的内容是不是需要自己写??你是不是要疯?记住以后都是黏贴复制
不可能让你写的,你再牛逼也不行的
-->
<student id="java_0001">
<name>骚磊</name>
<age>120</age>
<sex>female</sex>
</student>
</students>
四、XML解析
java中解析xml四种方案
四种只讲一种。因为这一种在源码有!!!咱们开发中不用去书写解析xml的代码
因为xml保存的是数据,你得把这些数据取出来。这就叫解析
四种:1.DOM解析 2.SAX解析 3.JDOM解析 4.DOM4J解析
只学一种 DOM4J这个,为什么?
以后会学习ssm框架,其中spring里面的底层封装了DOM4J,讲这个不是为了开发
开发的话,就用不到dom4j。因为是底层。我讲这个的目的是为了以后读懂spring
框架的源码。Hibernate也是dom4j这个xml解析工具
动脑子想一下,咱们框架里面很多的xml文件,如何执行的?靠这个dom4j
把xml文件读取出来,变成一个对象,然后去执行方法就可以了。我现在就是再框架的底层
案例:
就解析咱们之前bookstore的一个xml
1.创建一个叫book.xml的文件
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
<book category="science">
<title lang="jpm">金瓶梅</title>
<author>老邢</author>
<year>2021</year>
<price>13.38</price>
</book>
<book category="文学">
<title lang="jpm">三国</title>
<author>骚磊</author>
<year>2020</year>
<price>10.22</price>
</book>
<!-- 例子中的根元素是 <bookstore>。只能有一个根。文档中的所有 <book> 元素都被包含在 <bookstore> 中。
<book> 元素有 4 个子元素:<title>、< author>、<year>、<price> -->
</bookstore>
2.需要导包,dom4j这种方式进行解析的话,需要导一个包
dom4j-1.6.1.jar
3.写java代码就行了
package com.qfedu.parsexml;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;
import java.util.List;
public class Demo1 {
public static void main(String[] args) throws DocumentException {
//1.创建一个SAXreader
SAXReader reader = new SAXReader();
//2.T通过reader对象去读取book.xml文件
//返回值是一个document对象
Document document = reader.read(new File("src/xml/book.xml"));
//3.document对象获取根节点元素
Element bookstore = document.getRootElement();
//4.获取迭代器对象,目的是想遍历
Iterator iterator = bookstore.elementIterator();
//5.遍历迭代器获取根节点的信息
while (iterator.hasNext()){
System.out.println("开始遍历一本书");
Element book = (Element)iterator.next();
//获取book的属性及属性值
List<Attribute> attributes = book.attributes();
for (Attribute attribute : attributes) {
System.out.println("属性:" + attribute.getName() + ": "+attribute.getValue());
}
Iterator itt = book.elementIterator();
while(itt.hasNext()){
Element bookChild = (Element) itt.next();//获取book子标签对象
System.out.println("节点名:" + bookChild.getName()+ "----节点值:" + bookChild.getStringValue());
}
System.out.println("结束遍历一本书");
}
}
}
结果如下(示例):
总结
提示:这里对文章进行总结:没有总结