7.XML
1.XML基本介绍
1.概述
2.XML作用
功能 | 说明 |
---|---|
存储数据 | 相比于将数据存储在数据库,存储在XML可以让数据的可移植性更强 |
配置文件 | 作为各种技术框架的配置文件使用 (最多) |
在网络中传输 | 客户端使用可用xml格式向服务器发数据,服务器对Xml格式数据进行解析 |
<?xml version="1.0" encoding="utf-8" ?>
<!-- 1.xml必须要文档声明,且必须写在第一行 -->
<users><!-- 2.xml有且只有一个根元素(users)-->
<user id="1" sex="男">
<ename>林黛玉</ename>
<age>20</age>
<close/> <!--空元素,只有开始标签没有结束标签,自我闭合-->
</user>
</users>
<!--
xml中的元素命名规则
1.不可使用空格与冒号
2.区分大小写
3.属性是元素的一部分,用单、双引号包裹,以字母开头
-->
2.XML约束
- XML约束:规范xml中所写内容
- 常见的两种xml约束:
- DTD
- Schema
- 程序员需掌握两点:
- 会阅读
- 会引入
- 不用自己编写(框架已写好)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ecuMNebB-1618124034385)(C:\Users\HUSKY\AppData\Roaming\Typora\typora-user-images\image-20210120182450191.png)]
1.DTD约束
- DTD(Document type defintion)文档类型定义,规定xml文档中元素的名称、子元素、子元素出现的名称与顺序、元素的属性等
- 开发中,我们不会自己编写DTD文档,通常通过框架提供的DT约束文档,来编写相应的XML文档。常见框架使用DTD约束的有:Struts2、hibernate等
<!--约束文件 student.dtd -->
<!ELEMENT students (student+) >
<!ELEMENT student (name,age,sex)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #required>
<!--
ELEMENT: 用来定义元素
students (student+) : 代表根元素 必须是 <students>
student+ : 根标签中至少有一个 student子元素, + 代表至少一个
student (name,age,sex): student 标签中包含的子元素,按顺序出现
#PCDATA: 是普通文本内容
ATTLIST: 用来定义属性
student number ID : student子元素中 有一个ID属性叫做 number
# required:number的属性是必须填写的
ID: 唯一、不可重复,值只能是字母或者下划线开头
-->
1.引入DTD
- 将dtd文档引入到xml中,有本地与网络两种方式
- student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYstem "student.dtd">
<students>
<student number="s1">
<name>张三</name>
<age>18</age>
<sex>男</sex>
</student>
</students>
2.Schema约束
1.什么是Schema
<!--student.xsd-->
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.lagou.com/xml"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.lagou.com/xml"
elementFormDefault="qualified">
<!--根标签students 类型:studentsTye -->
<xsd:element name="students" type="studentsType"/>
<!--引入studensType -->
<xsd:complexType name="studentsType">
<xsd:sequence> <!--子元素student 类型:studenType -->
<xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!--引入studenType -->
<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>
<!--以age为例 -->
<xsd:simpleType name="ageType">
<xsd:restriction base="xsd:integer">
<xsd:minInclusive value="0"/>
<xsd:maxInclusive value="200"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:schema>
2.引入Schema
- 写出根(students)元素
- 使用xmlns指定根元素来自哪个命名空间
- 引入W3C的标准命名空间(直接复制)
- 引入的命名空间与xsd文件对应
<?xml version="1.0" encoding="UTF-8" ?>
<students
<!-- 自定义命名空间 -->
xmlns="http://www.lagou.com/xml"
<!--W3C命名空间 -->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<!--约束文件的位置 -->
xsi:schemaLocation="http://www.lagou.com/xml student.xsd"
>
<student number="hehe_1000">
<name>张三</name>
<age>14</age>
<sex>male</sex>
</student>
</students>
3.XML解析(重点)
1.XML解析方式
-
有两种常见的解析方式:
2.dom4j解析器
1.API介绍
-
使用核心类SaxReader加载xml文档获得Document,通过Document 对象获得文档的根元素
-
SaxReader对象
- read(…) 加载执行xml文档
-
Document对象
- getRootElement() 获得根元素
-
Element对象
2.读取XML
@Test
public void test1() throws DocumentException {
//1.获取XML解析对象
SAXReader reader = new SAXReader();
//2.解析xml,获取Document对象
Document document = reader.read("C:\\Users\\HUSKY\\IdeaProjects\\jdbc_work\\xml_task03\\src\\xml03\\user.xml");
//3. 获取根元素
Element rootElement = document.getRootElement();
System.out.println("根元素名是:" + rootElement.getName());
//获取根元素下的节点
List<Element> elements = rootElement.elements();
//取集合下第一个子节点
Element user = elements.get(0);
String name = user.getName(); //子节点元素名
String id = user.attributeValue("id");//获取节点指定属性名
String name1 = user.elementText("name"); //获取指定子元素文本值
String age = user.elementText("age");
String hobby = user.element("hobby").getText();//获取当前元素的文本值
System.out.println(name + id + name1 + age + hobby);
/*
根元素名是:users
user001张三18抽烟
*/
}
3.使用xpath读取XML
- xPath:一门在XML中查找的语言。由于DOM4J在解析时只能一层一层的解析,当层数过多久不方便,结合xPath可以获取到某个元素
- 导入jaxen-1.1-beta-6.jar
使用dom4j支持的xpath操作的主要形式:
语法 | 说明 |
---|---|
/AAA/DDD/BBB | 表示一层一层的找 |
//BBB | 获取多个,只要名称是BBB |
//* | 所有元素 |
BBB[1] , BBB[last()] | 根据位置找。第一与最后 |
//BBB[@id] | 只要有id属性,都得到 |
//BBB[@id=‘b1’] | 得到id为’b1’的元素 |
常用方法:
方法 | 说明 |
---|---|
selectSingleNode(query) | 查找和 XPath 查询匹配的一个节点。 |
selectNodes(query) | 得到的是xml根节点下的所有满足 xpath 的节点; |
- Node是节点对象
public class TestXPath {
/**
* 查找匹配的单个节点
*/
@Test
public void test1() throws DocumentException {
//1.创建解析器对象
SAXReader reader = new SAXReader();
//2.获取文档对象
Document document = reader.read("C:\\Users\\HUSKY\\IdeaProjects\\jdbc_work\\xml_task03\\src\\xml04\\book.xml");
//查询指定节点中的内容
Node node = document.selectSingleNode("/bookstore/book/name");
System.out.println("节点是:" + node.getName());//name
System.out.println("节点名称是:" + node.getText());//金瓶梅
//查询第二本书的内容
//Node node1 = document.selectSingleNode("/bookstore/book[2]/name");//根据序号查
Node node1 = document.selectSingleNode("/bookstore/book[@id='book2']/name");//根据ID查
System.out.println("节点是:" + node1.getName());//name
System.out.println("节点名称是:" + node1.getText());//红楼梦
//查询第二本书的ID属性
Node node2 = document.selectSingleNode("/bookstore/book[@id='book2']/attribute::id");
System.out.println("第二本的数的id值为:" + node2.getText());//book2
}
/**
* 使用selectNodes()方法,获取对应名称的所有节点
*/
@Test
public void test2() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read("C:\\Users\\HUSKY\\IdeaProjects\\jdbc_work\\xml_task03\\src\\xml04\\book.xml");
//获取所有节点的名称
List<Node> list = document.selectNodes("//*");
for (Node node : list) {
System.out.println("节点名:" + node.getName());
}
//获取所有的书名
List<Node> list1 = document.selectNodes("//name");
for (Node node : list1) {
System.out.println("书名是:" + node.getText());
}
//获取ID为book1节点的所有内容
List<Node> list2 = document.selectNodes("/bookstore/book[@id='book1']//*");
for (Node node : list2) {
System.out.println(node.getName() + node.getText());
}
}
}
4.JDBC自定义XML
1.定义配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<jdbc>
<property name="driverClass">com.MysqL.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:MysqL://localhost:3306/db5?characterEncoding=UTF-8</property>
<property name="user">root</property>
<property name="password">123456</property>
</jdbc>
2.编写工具类
public class JDBCUtils {
public static String DRIVERNAME;
public static String URL;
public static String USER;
public static String PASSWORD;
static {
try {
SAXReader reader = new SAXReader();
Document document = reader.read("C:\\Users\\HUSKY\\IdeaProjects\\jdbc_work\\xml_task03\\src\\xml05\\jdbc-config.xml");
//获取驱动名
Node node = document.selectSingleNode("/jdbc/property[@name='driverClass']");
DRIVERNAME = node.getText();
URL = document.selectSingleNode("/jdbc/property[@name='jdbcUrl']").getText();
USER = document.selectSingleNode("/jdbc/property[@name='user']").getText();
PASSWORD = document.selectSingleNode("/jdbc/property[@name='password']").getText();
Class.forName(DRIVERNAME);
} catch (Exception e) {
e.printstacktrace();
System.out.println("err");
}
}
public static Connection getConnection() {
try {
Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
return connection;
} catch (sqlException e) {
e.printstacktrace();
return null;
}
}
}
3.测试类
public static void main(String[] args) throws sqlException {
Connection connection=JDBCUtils.getConnection();
Statement statement = connection.createStatement();
String sql="select * from employee";
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
String ename = resultSet.getString("ename");
System.out.println(ename);
}
}
on {
Connection connection=JDBCUtils.getConnection();
Statement statement = connection.createStatement();
String sql=“select * from employee”;
ResultSet resultSet = statement.executeQuery(sql);
while(resultSet.next()){
String ename = resultSet.getString(“ename”);
System.out.println(ename);
}
}