XML基本介绍

概述

XML即可扩展标记语言(Extensible Markup Language)

  • W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版 本,所以1.1没有人用。同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是 1.0版本 !

特点

  • 可扩展的, 标签都是自定义的
  • 语法十分严格

    XML的作用

    XML能做什么?
功能 说明
存储数据 通常,我们在数据库中存储数据。不过,如果希望数据的可移植性更强,我们可以 把数据存储 XML 文件中
配置文件 作为各种技术框架的配置文件使用 (最多)
在网络中传输 客户端可以使用XML格式向服务器端发送数据,服务器接收到xml格式数据,进行解析

XML的语法

XML文档声明格式

  • 文档声明必须为结束;
  • 文档声明必写在第一行;
  1. 语法格式:

    1. <?xml version="1.0" encoding="UTF-8"?>
  2. 属性说明:

  • versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
  • encoding:指定当前文档的编码。可选属性,默认值是utf-8;

    元素

    Element 元素: 是XML文档中最重要的组成部分元素的命名规则
  1. 不能使用空格,不能使用冒号
  2. xml 标签名称区分大小写
  3. XML 必须有且只有一个根元素

语法格式:

  1. <users><users>
  1. XML 必须有且只有一个根元素,它是所有其他元素的父元素,比如以下实例中 users 就是根元素: ```xml <?xml version=”1.0” encoding=”utf-8” ?>

  1. 2. 普通元素的结构开始标签、元素体、结束标签组成。
  2. ```xml
  3. <hello> 大家好 </hello>
  1. 元素体:元素体可以是元素,也可以是文本 ```xml

    你好

  1. 4. 空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭合
  2. ```xml
  3. <close/>

属性

  1. <bean id="" class=""> </bean>
  1. 属性是元素的一部分,它必须出现在元素的开始标签中
  2. 属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
  3. 一个元素可以有0~N个属性,但一个元素中不能出现同名属性
  4. 属性名不能使用空格、冒号等特殊字符,且必须以字母开头

    注释

    XML的注释,以“ ”结束。注释内容会被XML解析器忽略!
    任务三_XML - 图1使用XML 描述数据表中的数据 ```xml <?xml version=”1.0” encoding=”UTF-8” ?>

    林黛玉 20 5000 2010-01-01 杜甫 40 15000 2010-01-01

  1. <a name="p02as"></a>
  2. # XML约束
  3. - 在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。
  4. - 常见的xml约束:
  5. DTD<br />Schema
  6. - 作为程序员只要掌握两点
  7. 会阅读<br />会引入<br />不用自己编写
  8. ![](https://cdn.nlark.com/yuque/0/2021/jpeg/258783/1616305768348-ff539dc3-9ec2-4a4e-8254-2b2c30ccc0ac.jpeg#align=left&display=inline&height=896&margin=%5Bobject%20Object%5D&originHeight=896&originWidth=1280&status=done&style=none&width=1280)
  9. <a name="tdbqN"></a>
  10. ## DTD约束
  11. DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。
  12. <a name="4PWmH"></a>
  13. ### 编写DTD
  14. 开发中,我们不会自己编写DTD约束文档<br />常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档。常见框架使用DTD约束有:<br />Struts2、hibernate等。<br />创建约束文件 student.dtd
  15. ```java
  16. <!ELEMENT students (student+) >
  17. <!ELEMENT student (name,age,sex)>
  18. <!ELEMENT name (#PCDATA)>
  19. <!ELEMENT age (#PCDATA)>
  20. <!ELEMENT sex (#PCDATA)>
  21. <!ATTLIST student number ID #REQUIRED>
  22. <!--
  23. ELEMENT: 用来定义元素
  24. students (student+) : 代 表 根 元 素 必 须 是 <students> student+ : 根标签中至少有一个 student子元素, + 代表至少一个student (name,age,sex): student 标签中包含的子元素,按顺序出现#PCDATA: 是普通文本内容
  25. ATTLIST: 用来定义属性
  26. student number ID #REQUIRED
  27. student子元素中 有一个ID属性叫做 number,是必须填写的ID: 唯一 值只能是字母或者下划线开头
  28. -->

引入DTD

引入dtd文档到xml文档中,两种方式
内部dtd:将约束规则定义在xml文档中
外部dtd:将约束的规则定义在外部的dtd文件中
本地: 网络:
student.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE students SYSTEM "student.dtd">
  3. <students>
  4. <student number="S1">
  5. <name>长海</name>
  6. <age>20</age>
  7. <sex></sex>
  8. </student>
  9. <student number="S2">
  10. <name>大玲子</name>
  11. <age>18</age>
  12. <sex></sex>
  13. </student>
  14. </students>

Schema约束

什么是Schema

  1. Schema是新的XML文档约束, 比DTD强大很多,是DTD 替代者;
  2. Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
  3. Schema 功能更强大,内置多种简单和复杂的数据类型
  4. Schema 支持命名空间 (一个XML中可以引入多个约束文档)

    Schema约束示例

    student.xsd

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <xsd:schema xmlns="http://www.lagou.com/xml"
    3. xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    4. targetNamespace="http://www.lagou.com/xml" elementFormDefault="qualified">
    5. <xsd:element name="students" type="studentsType"/>
    6. <xsd:complexType name="studentsType">
    7. <xsd:sequence>
    8. <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
    9. </xsd:sequence>
    10. </xsd:complexType>
    11. <xsd:complexType name="studentType">
    12. <xsd:sequence>
    13. <xsd:element name="name" type="xsd:string"/>
    14. <xsd:element name="age" type="ageType" />
    15. <xsd:element name="sex" type="sexType" />
    16. </xsd:sequence>
    17. <xsd:attribute name="number" type="numberType" use="required"/>
    18. </xsd:complexType>
    19. <xsd:simpleType name="sexType">
    20. <xsd:restriction base="xsd:string">
    21. <xsd:enumeration value="male"/>
    22. <xsd:enumeration value="female"/>
    23. </xsd:restriction>
    24. </xsd:simpleType>
    25. <xsd:simpleType name="ageType">
    26. <xsd:restriction base="xsd:integer">
    27. <xsd:minInclusive value="0"/>
    28. <xsd:maxInclusive value="200"/>
    29. </xsd:restriction>
    30. </xsd:simpleType>
    31. <xsd:simpleType name="numberType">
    32. <xsd:restriction base="xsd:string">
    33. <xsd:pattern value="hehe_\d{4}"/>
    34. </xsd:restriction>
    35. </xsd:simpleType>
    36. </xsd:schema>

    任务三_XML - 图2Xml Schema的根元素:

    XML引入Schema约束

    xml中引入schema约束的步骤:

  5. 查看schema文档,找到根元素,在xml中写出来 ```xml <?xml version=”1.0” encoding=”UTF-8” ?>

  1. 2. 根元素来自哪个命名空间。使用**xmlns**指令来声明
  2. ```xml
  3. <?xml version="1.0" encoding="UTF-8" ?>
  4. <students
  5. xmlns="http://www.lagou.com/xml"
  6. >
  7. </students>
  1. 引入 w3c的标准命名空间, 复制即可

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <students
    3. xmlns="http://www.lagou.com/xml"
    4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    5. >
    6. </students>
  2. 引入的命名空间跟哪个xsd文件对应?

使用schemaLocation来指定:两个取值:第一个为命名空间 第二个为xsd文件的路径

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <students
  3. xmlns="http://www.lagou.com/xml"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.lagou.com/xml student.xsd"
  6. >
  7. </students>
  1. 命名空间

指的是一个环境,所用的标签来自于哪个环境定义的。

  1. student.xml ```xml <?xml version=”1.0” encoding=”UTF-8” ?>

张三 200 male

  1. <student number="hehe_4567">
  2. <name>张三</name>
  3. <age>200</age>
  4. <sex>male</sex>
  5. </student>

  1. <a name="CAAxV"></a>
  2. # XML 解析
  3. <a name="MmDu2"></a>
  4. ## 解析概述
  5. 当将数据存储在XML后,我们就希望通过程序获得XML的内容。如果我们使用Java基础所学习的IO知识是可以完成的,不过你需要非常繁琐的操作才可以完成,且开发中会遇到不同问题(只读、读写)。 人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作XML。
  6. <a name="7Vovp"></a>
  7. ## XML解析方式
  8. 开发中比较常见的解析方式有两种,如下:
  9. - DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
  10. 优点:元素与元素之间保留结构关系,故可以进行增删改查操作。<br />缺点:XML文档过大,可能出现内存溢出显现。
  11. - SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)
  12. 优点:占用内存少 处理速度快,可以处理大文件<br />缺点:只能读,逐行后将释放资源。<br />![](https://cdn.nlark.com/yuque/0/2021/jpeg/258783/1616305769114-683fa20d-ea0f-43ba-9943-b65b3ca21e90.jpeg#align=left&display=inline&height=704&margin=%5Bobject%20Object%5D&originHeight=704&originWidth=1744&status=done&style=none&width=1744)
  13. <a name="1lxA2"></a>
  14. ## XML常见的解析器
  15. 解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员, 有提供易于操作的解析开发包
  16. - JAXP:sun公司提供的解析器,支持DOM和SAX两种思想
  17. - **DOM4J**:一款非常优秀的解析器 , Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
  18. - Jsoup:jsoup 是一款Java 的HTML解析器 ,也可以解析XML
  19. - PULL:Android内置的XML解析方式,类似SAX。
  20. <a name="VoxZz"></a>
  21. ## dom4j 的使用
  22. <a name="9AZJ8"></a>
  23. ### 导入JAR包
  24. ![](https://cdn.nlark.com/yuque/0/2021/jpeg/258783/1616305769465-d33d2de9-eb67-4fe2-b1e9-ca683cc63ae4.jpeg#align=left&display=inline&height=42&margin=%5Bobject%20Object%5D&originHeight=42&originWidth=1156&status=done&style=none&width=1156)
  25. 1. **API介绍**
  26. 使用核心类SaxReader加载xml文档获得Document,通过Document 对象获得文档的根元素,然后就可以操作了<br />常用API如下:
  27. - SaxReader对象
  28. read(…) 加载执行xml文档
  29. - Document对象
  30. getRootElement() 获得根元素
  31. - Element对象
  32. elements(…) 获得指定名称的所有子元素。可以不指定名称<br />element(…) 获得指定名称的第一个子元素。可以不指定名称<br />getName() 获得当前元素的元素名<br />attributeValue(…) 获得指定属性名的属性值<br />elementText(…) 获得指定名称子元素的文本值<br />getText() 获得当前元素的文本内容
  33. <a name="8pMx5"></a>
  34. ### 准备xml文件
  35. 编写user.xsd schema约束
  36. ```xml
  37. <?xml version="1.0" encoding="UTF-8" ?>
  38. <xsd:schema xmlns="http://www.lagou.com/xml"
  39. xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  40. targetNamespace="http://www.lagou.com/xml" elementFormDefault="qualified">
  41. <xsd:element name="users" type="usersType"/>
  42. <xsd:complexType name="usersType">
  43. <xsd:sequence>
  44. <xsd:element name="user" type="userType" minOccurs="0" maxOccurs="unbounded"/>
  45. </xsd:sequence>
  46. </xsd:complexType>
  47. <xsd:complexType name="userType">
  48. <xsd:sequence>
  49. <xsd:element name="name" type="xsd:string"/>
  50. <xsd:element name="age" type="ageType" />
  51. <xsd:element name="hobby" type="hobbyType" />
  52. </xsd:sequence>
  53. <xsd:attribute name="id" type="numberType" use="required"/>
  54. </xsd:complexType>
  55. <xsd:simpleType name="ageType">
  56. <xsd:restriction base="xsd:integer">
  57. <xsd:minInclusive value="0"/>
  58. <xsd:maxInclusive value="100"/>
  59. </xsd:restriction>
  60. </xsd:simpleType>
  61. <xsd:simpleType name="hobbyType">
  62. <xsd:restriction base="xsd:string">
  63. <xsd:enumeration value="抽烟"/>
  64. <xsd:enumeration value="喝酒"/>
  65. <xsd:enumeration value="烫头"/>
  66. </xsd:restriction>
  67. </xsd:simpleType>
  68. <xsd:simpleType name="numberType">
  69. <xsd:restriction base="xsd:string">
  70. <xsd:pattern value="\d{3}"/>
  71. </xsd:restriction>
  72. </xsd:simpleType>
  73. </xsd:schema>

编写user.xml 引入约束

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <users
  3. xmlns="http://www.lagou.com/xml"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://www.lagou.com/xml user.xsd"
  6. >
  7. <user id="001">
  8. <name>张百万</name>
  9. <age>25</age>
  10. <hobby>抽烟</hobby>
  11. </user>
  12. <user id="002">
  13. <name>于谦</name>
  14. <age>55</age>
  15. <hobby>烫头</hobby>
  16. </user>
  17. <user id="003">
  18. <name>小斌</name>
  19. <age>25</age>
  20. <hobby>喝酒</hobby>
  21. </user>
  22. </users>

读取XML

  1. package com.lagou.xml03;
  2. import org.dom4j.Document;
  3. import org.dom4j.DocumentException;
  4. import org.dom4j.Element;
  5. import org.dom4j.io.SAXReader;
  6. import org.junit.Test;
  7. import java.util.List;
  8. public class TestDOM4j {
  9. //获取XML文件中的 所有的元素名称(标签)
  10. @Test
  11. public void test1() throws DocumentException {
  12. //1.获取XML解析对象
  13. SAXReader reader = new SAXReader();
  14. //2.解析XML 获取 文档对象 document
  15. Document document = reader.read("/Users/pingmao/Desktop/wen/Learn/java/jdbc_work/jdbc_task03/src/com/lagou/xml03/user.xml");
  16. //3.获取根元素
  17. Element rootElement = document.getRootElement();
  18. //获取根元素名称
  19. System.out.println(rootElement.getName());
  20. //获取 根元素下的标签
  21. List<Element> elements = rootElement.elements();
  22. for (Element element : elements) {
  23. System.out.println("根标签下的子节点: " + element.getName());
  24. List<Element> eList = element.elements();
  25. for (Element e : eList) {
  26. System.out.println("user标签下的子节点" + e.getName());
  27. }
  28. break;
  29. }
  30. }
  31. //获取XML中标签的文本信息 和 属性信息
  32. @Test
  33. public void test2() throws DocumentException {
  34. //1.获取解析XML的 SAXReader
  35. SAXReader reader = new SAXReader();
  36. //2.获取文档对象
  37. Document document = reader.read("/Users/pingmao/Desktop/wen/Learn/java/jdbc_work/jdbc_task03/src/com/lagou/xml03/user.xml");
  38. //3.获取根节点
  39. Element rootElement = document.getRootElement();
  40. //4.获取子节点 user
  41. List<Element> elements = rootElement.elements();
  42. //5.获取集合中的第一个 子节点
  43. Element user = elements.get(0);
  44. //6.获取节点中的文本信息
  45. String id = user.attributeValue("id");//获取属性 id的值
  46. String name = user.elementText("name");
  47. String age = user.elementText("age");
  48. String hobby = user.element("hobby").getText();
  49. //打印
  50. System.out.println(id + " " + name +" " + age + " " + hobby);
  51. }
  52. }

xpath方式读取xml

xpath介绍

XPath 是一门在 XML 文档中查找信息的语言。 可以是使用xpath查找xml中的内容。
XPath 的好处
由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便,结合
任务三_XML - 图3XPATH就可以直接获取到某个元素
1)需要再导入 jaxen-1.1-beta-6.jar
任务三_XML - 图4

XPath基本语法介绍

使用dom4j支持xpath的操作的几种主要形式

语法 说明
/AAA/DDD/BBB 表示一层一层的,AAA下面 DDD下面的BBB
//BBB 表示和这个名称相同,表示只要名称是BBB,都得到
//* 所有元素
BBB[1] , BBB[last()] 第一种表示第一个BBB元素, 第二种表示最后一个BBB元素
//BBB[@id] 表示只要BBB元素上面有id属性,都得到
//BBB[@id=’b1’] 表示元素名称是BBB,在BBB上面有id属性,并且id的属性值是b1

API介绍

  1. 常用方法:
  • selectSingleNode(query): 查找和 XPath 查询匹配的一个节点。

参数是Xpath 查询串。

  • selectNodes(query): 得到的是xml根节点下的所有满足 xpath 的节点;

参数是Xpath 查询串。

  • Node: 节点对象

    Xpath读取XML

  1. 数据准备 book.xml

    1. <?xml version="1.0" encoding="UTF-8" ?>
    2. <bookstore>
    3. <book id="book1">
    4. <name>金瓶梅</name>
    5. <author>金圣叹</author>
    6. <price>99</price>
    7. </book>
    8. <book id="book2">
    9. <name>红楼梦</name>
    10. <author>曹雪芹</author>
    11. <price>69</price>
    12. </book>
    13. <book id="book3">
    14. <name>Java编程思想</name>
    15. <author>埃克尔</author>
    16. <price>59</price>
    17. </book>
    18. </bookstore>
  2. 代码示例

使用selectSingleNode方法 查询指定节点中的内容

  1. /*
  2. * 使用selectSingleNode() 方法 查询自定的节点信息
  3. *
  4. * */
  5. @Test
  6. public void test1() throws DocumentException {
  7. //1.创建XML解析对象
  8. SAXReader reader = new SAXReader();
  9. //2.解析XML 获取 文档对象
  10. Document document = reader.read("H:\\jdbc_work\\xml_task03\\src\\com\\lagou\\xml04\\book.xml");
  11. //3.通过selectSingleNode() 方法获取 name节点
  12. Node node1 = document.selectSingleNode("/bookstore/book/name");
  13. System.out.println("节点的名称: " + node1.getName());
  14. System.out.println("书名: " + node1.getText());
  15. //4.获取第二本书的书名
  16. Node node2 = document.selectSingleNode("/bookstore/book[3]/name");
  17. System.out.println("书名: " + node2.getText());
  18. }

使用selectSingleNode方法 获取属性值,或者属性值对应的节点

  1. /*
  2. * 使用 selectSIngleNode() 方法获取 属性值 或者 通过属性值获取到节点信息
  3. *
  4. * */
  5. @Test
  6. public void test2() throws DocumentException {
  7. SAXReader reader = new SAXReader();
  8. Document document = reader.read("H:\\jdbc_work\\xml_task03\\src\\com\\lagou\\xml04\\book.xml");
  9. //1.获取第一个booke节点中的 id属性的值
  10. Node node1 = document.selectSingleNode("/bookstore/book/attribute::id");
  11. System.out.println("第一个book的id属性值: " + node1.getText() );
  12. //2.获取最后一个book节点的 id属性值
  13. Node node2 = document.selectSingleNode("/bookstore/book[last()]/attribute::id");
  14. System.out.println("最后一个book节点中的属性值: " + node2.getText());
  15. //3.通过id的值 获取book2节点 中的书名
  16. Node node3 = document.selectSingleNode("/bookstore/book[@id='book2']");
  17. String name = node3.selectSingleNode("name").getText();
  18. System.out.println("id为book2的 节点的书名是: " + name);
  19. }

使用 selectNodes()方法 获取对应名称的所有节点

  1. /*
  2. * 使用selectNodes() 获取所有指定名称 的节点
  3. *
  4. * */
  5. @Test
  6. public void test3() throws DocumentException {
  7. SAXReader reader = new SAXReader();
  8. Document document = reader.read("H:\\jdbc_work\\xml_task03\\src\\com\\lagou\\xml04\\book.xml");
  9. //1.查询所有的节点
  10. List<Node> list = document.selectNodes("//*");
  11. for (Node node : list) {
  12. System.out.println("节点名: " + node.getName());
  13. }
  14. //2.获取所有的书名
  15. List<Node> list1 = document.selectNodes("//name");
  16. for (Node node : list1) {
  17. System.out.println("书名: " + node.getText());
  18. }
  19. //3.获取 id值为 book1 的节点中的所有内容
  20. List<Node> list2 = document.selectNodes("/bookstore/book[@id='book1']//*");
  21. for (Node node : list2) {
  22. System.out.println(node.getName() + " = " + node.getText());
  23. }
  24. }
  1. package com.lagou.xml04;
  2. import org.dom4j.Document;
  3. import org.dom4j.DocumentException;
  4. import org.dom4j.Node;
  5. import org.dom4j.io.SAXReader;
  6. import org.junit.Test;
  7. import java.util.List;
  8. public class TestXPath {
  9. /*
  10. * 使用selectSingleNode() 方法 查询自定的节点信息
  11. *
  12. * */
  13. @Test
  14. public void test1() throws DocumentException {
  15. //1.创建XML解析对象
  16. SAXReader reader = new SAXReader();
  17. //2.解析XML 获取 文档对象
  18. Document document = reader.read("/Users/pingmao/Desktop/wen/Learn/java/jdbc_work/jdbc_task03/src/com/lagou/xml04/book.xml");
  19. //3.通过selectSingleNode() 方法获取 name节点
  20. Node node1 = document.selectSingleNode("/bookstore/book/name");
  21. System.out.println("节点的名称: " + node1.getName());
  22. System.out.println("书名: " + node1.getText());
  23. //4.获取第二本书的书名
  24. Node node2 = document.selectSingleNode("/bookstore/book[3]/name");
  25. System.out.println("书名: " + node2.getText());
  26. }
  27. /*
  28. * 使用 selectSIngleNode() 方法获取 属性值 或者 通过属性值获取到节点信息
  29. *
  30. * */
  31. @Test
  32. public void test2() throws DocumentException {
  33. SAXReader reader = new SAXReader();
  34. Document document = reader.read("/Users/pingmao/Desktop/wen/Learn/java/jdbc_work/jdbc_task03/src/com/lagou/xml04/book.xml");
  35. //1.获取第一个booke节点中的 id属性的值
  36. Node node1 = document.selectSingleNode("/bookstore/book/attribute::id");
  37. System.out.println("第一个book的id属性值: " + node1.getText() );
  38. //2.获取最后一个book节点的 id属性值
  39. Node node2 = document.selectSingleNode("/bookstore/book[last()]/attribute::id");
  40. System.out.println("最后一个book节点中的属性值: " + node2.getText());
  41. //3.通过id的值 获取book2节点 中的书名
  42. Node node3 = document.selectSingleNode("/bookstore/book[@id='book2']");
  43. String name = node3.selectSingleNode("name").getText();
  44. System.out.println("id为book2的 节点的书名是: " + name);
  45. }
  46. /*
  47. * 使用selectNodes() 获取所有指定名称 的节点
  48. *
  49. * */
  50. @Test
  51. public void test3() throws DocumentException {
  52. SAXReader reader = new SAXReader();
  53. Document document = reader.read("/Users/pingmao/Desktop/wen/Learn/java/jdbc_work/jdbc_task03/src/com/lagou/xml04/book.xml");
  54. //1.查询所有的节点
  55. List<Node> list = document.selectNodes("//*");
  56. for (Node node : list) {
  57. System.out.println("节点名: " + node.getName());
  58. }
  59. //2.获取所有的书名
  60. List<Node> list1 = document.selectNodes("//name");
  61. for (Node node : list1) {
  62. System.out.println("书名: " + node.getText());
  63. }
  64. //3.获取 id值为 book1 的节点中的所有内容
  65. List<Node> list2 = document.selectNodes("/bookstore/book[@id='book1']//*");
  66. for (Node node : list2) {
  67. System.out.println(node.getName() + " = " + node.getText());
  68. }
  69. }
  70. }

JDBC自定义XML

定义配置文件

  1. 创建自定义xml 文件, 保存 数据库连接信息

jdbc-config.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <jdbc>
  3. <property name="driverClass">com.mysql.jdbc.Driver</property>
  4. <property name="jdbcUrl">jdbc:mysql://192.168.197.4:3306/db5?characterEncoding=UTF-8</property>
  5. <property name="user">root</property>
  6. <property name="password">123456</property>
  7. </jdbc>

编写工具类(配置式)

  1. 编写工具类 ,使用xpath 读取数据库信息 ```java package com.lagou.xml05;

import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader;

import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException;

public class JDBCUtils {

  1. //1.定义字符串变量 保存连接信息
  2. public static String DRIVERNAME;
  3. public static String URL;
  4. public static String USER;
  5. public static String PASSWORD;
  6. //2.静态代码块
  7. static{
  8. //使用 XPath语法 对xml中的数据进行读取
  9. SAXReader reader = new SAXReader();
  10. try {
  11. Document document = reader.read("H:\\jdbc_work\\xml_task03\\src\\com\\lagou\\xml05\\jdbc-config.xml");
  12. //1.获取驱动名称
  13. Node driver = document.selectSingleNode("/jdbc/property[@name='driverClass']");
  14. DRIVERNAME = driver.getText();
  15. //2.获取URL
  16. Node url = document.selectSingleNode("/jdbc/property[@name='jdbcUrl']");
  17. URL = url.getText();
  18. //3.获取用户名
  19. Node user = document.selectSingleNode("/jdbc/property[@name='user']");
  20. USER = user.getText();
  21. //4.获取密码
  22. Node password = document.selectSingleNode("/jdbc/property[@name='password']");
  23. PASSWORD = password.getText();
  24. //注册驱动
  25. Class.forName(DRIVERNAME);
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. //获取连接
  31. public static Connection getConnection(){
  32. try {
  33. Connection connection = DriverManager.getConnection(URL, USER, PASSWORD);
  34. return connection;
  35. } catch (SQLException e) {
  36. e.printStackTrace();
  37. return null;
  38. }
  39. }

}

  1. <a name="TYrgI"></a>
  2. ## 测试工具类
  3. 3. 测试 : 获取所有员工的姓名
  4. ```java
  5. package com.lagou.xml05;
  6. import java.sql.Connection;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import java.sql.Statement;
  10. public class TestJDBC {
  11. //查询所有员工信息
  12. public static void main(String[] args) throws SQLException {
  13. //1.获取连接
  14. Connection connection = JDBCUtils.getConnection();
  15. //2.获取Statement 对象 执行SQL
  16. Statement statement = connection.createStatement();
  17. ResultSet resultSet = statement.executeQuery("select * from employee");
  18. //3.处理结果集
  19. while(resultSet.next()){
  20. String name = resultSet.getString("ename");
  21. System.out.println("员工的姓名: " + name);
  22. }
  23. //4.关闭资源
  24. resultSet.close();
  25. statement.close();
  26. connection.close();
  27. }
  28. }