微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

7.XML

7.XML

1.XML基本介绍

1.概述

  • XML可扩展标记语言,W3C于1998年发布1.0版本。
  • 特点:
    1. 可扩展的,标签自定义
    2. 语法十分严格

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约束:
    1. DTD
    2. Schema
  • 程序员需掌握两点:
    1. 会阅读
    2. 会引入
    3. 不用自己编写(框架已写好)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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中,有本地与网络两种方式
  1. 本地dtd:<! DOCTYPE 根标签名 SYstem “dtd文件的位置”>
  2. 网络dtd:<! DOCTYPE 根标签名 PUBLIC “dtd文件名称” “dtd文件的URL”>
  • 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

  1. 作为新的XML约束文档,比DTD强大很多,是DTD的替代者(后缀:xsd)
  2. 功能更为强大,内置多种数据内型。
  3. 支持命名空间(一个xml可以引入多个约束文档)

<!--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

  1. 写出根(students)元素
  2. 使用xmlns指定根元素来自哪个命名空间
  3. 引入W3C的标准命名空间(直接复制)
  4. 引入的命名空间与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解析方式

  • 有两种常见的解析方式:

    1. DOM解析器:把整个XML文档加载到内存中,并解析为成一个Document对象

      • 优点:元素间保留结构关系,可以进行增删改查操作
      • 缺点:XML文件过大时,可能会发生内存溢出

    2. SAX:一种速度更快,更有效的方法,一边扫描(逐行)一边解析,每执行一行触发相应的时间。

      • 优点:占用内存少,处理速度快,可以处理大文件
      • 缺点:只读,逐行后释放资源

2.dom4j解析器

  • 一款非常优秀的解析器 , Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。 它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。
  • 导入相关jar包

1.API介绍

  • 使用核心类SaxReader加载xml文档获得Document,通过Document 对象获得文档的根元素

  • SaxReader对象

    • read(…) 加载执行xml文档
  • Document对象

    • getRootElement() 获得根元素
  • Element对象

    • elements([…]) 获得指定名称的所有子元素。可不指定
    • element(…) 获得指定名称的第一个子元素。可不指定
    • getName() 获得当前元素的元素名
    • attributeValue(…) 获得指定属性名的属性
    • elementText(…) 获得指定名称子元素的文本值
    • getText() 获得当前元素的文本内容

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);
}
}


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。