Java 进阶day14XML Dom4j 工厂模式 Base64

目录

知识点1、XML

概念

XML的全称为(eXtensible Markup Language),是一种可扩展的标记语言。

XML的作用(保存数据)

不同软件之间进行数据传输。

各种框架的配置文件。
XML文件的后缀名为:xml
文档声明必须是XML第一行

version: 版本号,该属性是必须存在的
encoding: 文件编码,该属性不是必须的(一般取值都是UTF-8)

文档声明告诉别人这个一个XML文件

标签也称为元素

xml标签名字都是小写的

标签必须成对出现

特殊的标签可以不成对,但是必须有结束标记

标签中可以定义属性,属性和标签名空格隔开

属性值必须用引号引起来

在一个XML文档中,只允许有一个根标签
在XML中注释不能嵌套(Ctrl + / )

复制代码
<?xml version="1.0" encoding="utf-8" ?>
<student>
    <!--    这是第一个学生-->
    <name>小一</name>
    <age>18</age>
    <score>100</score>
    <address/>
    <note>
        <![CDATA[
            <1>
        ]]>
        2 &lt; 3
    </note>
    <!--    这是第二个学生-->
    <name>小二</name>
    <age>20</age>
    <score>99</score>
    <address/>
    <note>
        <![CDATA[
            <2>
        ]]>
    </note>

</student>
XML约束

因为XML文件的标签和属性可以随意扩展,通过XML约束来限定XML文件中可使用的标签以及属性。

XML的两种约束

DTD约束,比较简单,功能相对弱

Schema,比较复杂,功能相对强

DTD约束


复制代码
<!ELEMENT books (book+)>
<!ELEMENT book (name,price,author)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE books SYSTEM "book.dtd">
<books>
    <book>
        <name>Java</name>
        <price>12</price>
        <author>Au</author>
    </book>
</books>

DTD的不足

不能验证数据类型 (比如,可以在price中写入"呵呵",这是不正确的)

因为DTD是一个文本文件,本身不能验证是否正确。

Schema约束

Schema约束介绍

Schema约束文件扩展名(XML Schema Definition)

XML模式定义:xsd

Schema 功能更强大,数据类型约束更完善

Schema文件本身也是XML文件,所以也有根元素,根元素的名字叫:schema

一个XML中可以引用多个Schema约束文件
<根标签

xmlns="命名空间"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="命名空间 schema约束文件名">

< !-- 编写XML元素 -->

</根标签>

复制代码
<?xml version="1.0" encoding="UTF-8" ?>

<书架
        xmlns="http://www.itcast.cn/"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.itcast.cn/ books.xsd">
    <!-- 编写XML元素 -->
    <书>
        <书名>Java</书名>
        <作者>呵呵</作者>
        <售价>88</售价>
    </书>
</书架>

知识点2、XML解析

什么是XML的解析

使用程序读取XML中的数据

两种解析方式

Dom4j解析

XPath解析

Dom4j(Dom for java)

复制代码
public class Contact {
    private String id;
    private boolean vip;
    private String name;
    private String gender;
    private String email;
	\默认无参、有参、getset
}


<?xml version="1.0" encoding="UTF-8"?>
<contactList>
    <contact id="1" vip="true">
        <name>潘金莲</name>
        <gender>女</gender>
        <email>panpan@itcast.cn</email>
    </contact>
    <contact id="2">
        <name>武松</name>
        <gender id="1000">男</gender>
        <email>wusong@itcast.cn</email>
    </contact>
    <contact id="3">
        <name>武大狼</name>
        <gender>男</gender>
        <email>wuda@itcast.cn</email>
    </contact>
</contactList>

获取XML文件中的元素

复制代码
public class Test {
    public static void main(String[] args) throws DocumentException {
        //1、创建解析器
        SAXReader reader = new SAXReader();
        //2、解析XML
        Document doc = reader.read("day14\src\Contact.xml");
        //3、获得根标签
        Element rootElement = doc.getRootElement();
        //4、创建集合保存元素
        ArrayList<Contact> list = new ArrayList<>();
        //5、获得所有子标签
        List<Element> elements = rootElement.elements();
        for (Element element : elements) {
            //6、获取数据
            String id = element.attributeValue("id");
            String vips = element.attributeValue("vip");
            boolean vip = Boolean.parseBoolean(vips);
            String name = element.elementText("name");
            String gender = element.elementText("gender");
            String email = element.elementText("email");
            // 7、创建对象
            Contact c = new Contact(id, vip, name, gender, email);
            // 8、保存数据
            list.add(c);
        }
        // 9、打印数据
        for (Contact c : list) {
            System.out.println(c);
        }

    }
}
XPath

需要导入两个包(XPath是对dom4j的加强)

导入jar包 ( dom4j 和 jaxen-1.1.2.jar )

绝对路径:/根元素/子元素/孙元素

相对路径:./子元素/孙元素 ( 注意:前面有个 . )

全文搜索
属性查找

复制代码
public class Test2 {
    private static Document document;
    static{
        try {
            SAXReader reader = new SAXReader();
            document = reader.read("day14\src\Contact.xml");
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) {
        test1();
        System.out.println("----------------------");
        test2();
        test3();
        test4();
    }
    
    //绝对路径
    public static void test1(){
        List<Node> nodes = document.selectNodes("contactList/contact/name");
        for (Node node : nodes) {
            System.out.println( node.getName() + " : " + node.getText());
        }
    }
    
    //相对路径
    public static void test2(){
        Element rootElement = document.getRootElement();
        List<Node> nodes = rootElement.selectNodes("./contact/email");
        for (Node node : nodes) {
            System.out.println(node.getName() + " : " + node.getText());
        }
    }
    
    //全文搜索
    public static void test3(){
        List<Node> nodes = document.selectNodes("//contact/name");
        for (Node node : nodes) {
            System.out.println(node.getName());
        }
    }
    
    //属性查找
    public static void test4(){
        List<Node> nodes = document.selectNodes("//contact[@id = '1']");

        for (Node node : nodes) {
            System.out.println(node.getName());
        }
    }
}

注意:

1、xml文件一般放在src下

2、和所有写代码的路径不能有中文或空格

知识点3、工厂模式

简单工厂模式用于创建对象的。通过专门定义一个类来负责创建其他类的实例。
工厂模式作用

解决类与类之间的耦合问题,屏蔽了外界对具体类的依赖,让类的创建更加简单。

复制代码
interface Car {
    void run();
}


class Bmw implements Car{
    @Override
    public void run() {
        System.out.println("Bmw");
    }
}

class Benz implements Car{
    @Override
    public void run() {
        System.out.println("Benz");
    }
}

class Company {
    public static Car Creatcar(String car){
        if (car.equals("b1")){
            return new Benz();
        }if( car.equals("b2")){
            return new Bmw();
        }else {
            return null;
        }
    }
}


public class Test {
    public static void main(String[] args) {
        Car b1 = Company.Creatcar("b1");
        b1.run();
        Car b2 = Company.Creatcar("b2");
        b2.run();
    }
}

知识点4、Base64

在Java 8中,Base64编码已经成为Java类库的标准。Java 8 内置了 Base64 编码的编码器和解码器。
编码: 文字变成特殊的64字符

解码: 特殊的64字符变成文字
基本的Base64: 输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。
URL的Base64: 输出映射到一组字符A-Za-z0-9-_,输出是URL和文件。
MIME的Base64: 输出映射到MIME友好格式。输出每行不超过76字符。(超过会换行)

相关推荐
陈小桔9 分钟前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!10 分钟前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg367821 分钟前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July38 分钟前
Hikari连接池
java
微风粼粼1 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad1 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud
立志成为大牛的小牛1 小时前
数据结构——二十六、邻接表(王道408)
开发语言·数据结构·c++·学习·程序人生
天若有情6731 小时前
Spring MVC文件上传与下载全面详解:从原理到实战
java·spring·mvc·springmvc·javaee·multipart
祈祷苍天赐我java之术1 小时前
Redis 数据类型与使用场景
java·开发语言·前端·redis·分布式·spring·bootstrap
Gitpchy1 小时前
Day 20 奇异值SVD分解
python·机器学习