1.xml
XML 指可扩展标记语言
XML 被设计用来传输和存储数据。
XML 很重要,也很容易学习。
之前见过xml文件吗?见过 c3p0-config.xml
以后开发中比如ssm框架 写的xml相当多!!!慢慢自然而然就会。写多了
xml就是用来存储数据的
html w3c组织定义好的标签
xml 自己定义的标签,全部是双边的标签
<?xml version = "1.0" encoding = "UTF-8" ?>
<bookstore>
<book category = "奇幻书">
<title lang = "xyj">西游记</title>
<author>吴承恩</author>
<year>1886</year>
<price>138.21</price>
</book>
<book category = "儿童书">
<title lang="ppl">皮皮鲁大冒险</title>
<author>郑渊洁</author>
<year>2008</year>
<price>250.00</price>
</book>
<!-- 例子中的根元素是 <bookstore>。只能有一个根。文档中的所有 <book> 元素都被包含在 <bookstore> 中。
<book> 元素有 4 个子元素:<title>、< author>、<year>、<price> -->
</bookstore>
【注意事项】:
1.只能那个有一个根元素
2.标签必须是成双成对的
3.一定要见名知意
你发现一个问题,这些都是胡乱写的,只要能存进去数据就行了。
但是真实的开发中不是这样,你的标签不能胡乱写!!!所以就要加约束了
2.1XML文件约束
1.dtd
文档类型定义(DTD)可定义合法的XML文档构建模块。就意味着你不能够胡乱写了标签了
2.schema
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
2.2dtd约束
创建一个student.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 #PCDATA>
<!--以后记住不用写!!!都是别人封装好的!!!你只需要把人家写好的dtd
引入到你的xml文件中使用即可!!!你没有这个能力写dtd文件ssm都是封装好的。目的
为了程序需要统一化!!
-->
创建一个student.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--如果没有引入dtd文件随便写都不会报错!!!-->
<!--但是引入dtd文件以后只能按照别人约束好的来写!!!-->
<!--引入咱们刚才写好的dtd文件-->
<!--<!DOCTYPE 根元素 SYSTEM "文件名">-->
<!--文件名是一个绝对路径!!!-->
<!DOCTYPE students SYSTEM "D:\javast\untitled5\src\com\qwzstu\test\students.dtd">
<!--写完dtd约束以后 你还能随便写标签吗?不能!!!-->
<students>
<student id="1">
<name>张三</name>
<age>21</age>
<sex>男</sex>
</student>
<student id="2">
<name>肖五</name>
<age>23</age>
<sex>女</sex>
</student>
</students>
开发并不是用!!!而是去知道有这个东西!!!就是今天我不讲dtd约束你们后面该写代码还是写代码还是很6,因为咱们就就不用去写dtd
2.3schema约束
是DTD的一个替代品,约束的更加严格
1.新建一个xsd文件
<?xml version="1.0"?>
<xsd:schema xmlns="http://www.qwz.com/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.qwz.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>
在xml文件中
<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns="http://www.qwz.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.qwz.com/xml students.xsd">
<student id="java_0001">
<name>张三</name>
<age>21</age>
<sex>female</sex>
</student>
<student id="java_0002">
<name>李四</name>
<age>25</age>
<sex>male</sex>
</student>
</students>
3.xml解析
java中解析xml四种方案
四种只讲一种。因为这一种在源码有!!!咱们开发中不用去书写解析xml的代码
因为xml保存的是数据,你得把这些数据取出来。这就叫解析
四种:1.DOM解析 2.SAX解析 3.JDOM解析 4.DOM4J解析
只学一种 DOM4J这个,为什么?
以后会学习ssm框架,其中spring里面的底层封装了DOM4J,
开发的话,就用不到dom4j。因为是底层。Hibernate也是dom4j这个xml解析工具
动脑子想一下,咱们框架里面很多的xml文件,如何执行的?靠这个dom4j
把xml文件读取出来,变成一个对象,然后去执行方法就可以了。我现在就是再框架的底层
案例
就解析咱们之前student的一个xml
1.创建一个叫student.xml的文件
2.需要导包,dom4j这种方式进行解析的话,需要导一个包
dom4j-1..16.jar
3.写java代码就行了
<?xml version="1.0" encoding="UTF-8" ?>
<students xmlns="http://www.qwz.com/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.qwz.com/xml students.xsd">
<student id="java_0001">
<name>张三</name>
<age>21</age>
<sex>female</sex>
</student>
<student id="java_0002">
<name>李四</name>
<age>25</age>
<sex>male</sex>
</student>
</students>
package com.qwzstu.client;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.Iterator;
import java.util.List;
public class Student {
public static void main(String[] args) throws DocumentException {
//1.创建一个SAXreader
SAXReader reader = new SAXReader();
//2.T通过reader对象去读取book.xml文件
//返回值是一个document对象
Document document = reader.read("./src/com/qwzstu/test/student.xml");
//3.document对象获取根节点元素
Element rootElement = document.getRootElement();
//4.获取迭代器对象,目的是想遍历
Iterator iterator = rootElement.elementIterator();
//5.遍历迭代器获取根节点的信息
while (iterator.hasNext()){
Element student =(Element)iterator.next();
List<Attribute> attributes = student.attributes();
for (Attribute attribute : attributes) {
System.out.println(attribute.getStringValue());
}
Iterator iterator1 = student.elementIterator();
while (iterator1.hasNext()){
Element stu = (Element)iterator1.next();
System.out.println(stu.getName()+":"+stu.getStringValue());
}
}
}
}