Java 进阶day14XML Dom4j 工厂模式 Base64

news/2025/2/6 15:18:35 标签: java, python, 开发语言
目录
    • 知识点1、XML
      • 概念
      • XML约束
    • 知识点2、XML解析
      • Dom4j(Dom for java
      • XPath
    • 知识点3、工厂模式
    • 知识点4、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解析

java_169">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字符。(超过会换行)

在这里插入图片描述


http://www.niftyadmin.cn/n/5843119.html

相关文章

实现一个 LRU 风格的缓存类

实现一个缓存类 需求描述豆包解决思路&#xff1a;实现代码&#xff1a;优化11. std::list::remove 的时间复杂度问题2. 代码复用优化后的代码优化说明 优化21. 边界条件检查2. 异常处理3. 代码封装性4. 线程安全优化后的代码示例优化说明 DeepSeek&#xff08;深度思考R1&…

三维空间全局光照 | 及各种扫盲

Lecture 6 SH for diffuse transport Lecture 7关于 SH for glossy transport 三维空间全局光照 diffuse case和glossy case的区别 在Lambertian模型中&#xff0c;BRDF是一个常数 diffuse case 跟outgoing point无关 glossy case 跟outgoing point有关 &#xff08;Gloss…

【分布式架构理论3】分布式调用(1):负载均衡

文章目录 零、三种不同的负载均衡一、常见行业负载均衡方案1. 电商与互联网服务2. 金融与支付系统3. 云计算与分布式存储 二、负载均衡策略概述1. 无状态负载均衡&#xff08;强调公平性&#xff09;2. 有状态的负载均衡&#xff08;强调正确性&#xff09; 三、 总结 零、三种…

前端开发中的“原生模块化”——深入解析ES模块(ESM)的使用与优化

随着前端开发技术的不断演进&#xff0c;模块化的概念已不再是新鲜话题。然而&#xff0c;前端开发者仍然面临如何选择和使用模块化工具和规范的问题。近年来&#xff0c;ES模块&#xff08;ESM&#xff0c;ECMAScript Modules&#xff09;作为一种原生支持的模块化机制&#x…

DRGDIP 2.0时代下基于PostgreSQL的成本管理实践与探索(上)

一、引言 1.1 研究背景与意义 在医疗领域的改革进程中&#xff0c; DRG/DIP 2.0 时代&#xff0c;医院成本管理的重要性愈发凸显。新的医保支付方式下&#xff0c;医院的收入不再单纯取决于医疗服务项目的数量&#xff0c;而是与病种的分组、费用标准以及成本控制紧密相关。这…

防孤岛保护装置在分布式光伏并网中的应用

什么是光伏的“孤岛效应” 孤岛islanding 包含负荷和电源的部分电网&#xff0c;从主网脱离后继续孤立运行的状态。孤岛可分为非计划性孤岛和计划性孤岛。 孤岛效应的危害 当电网侧停电检修&#xff0c;若并网光伏电站的逆变器仍在继续供电&#xff0c;维修人员不一定…

2024年Web前端最新Java进阶(五十五)-Java Lambda表达式入门_eclipse lambda(1),面试必备

对象篇 模块化编程-自研模块加载器 开源分享&#xff1a;【大厂前端面试题解析核心总结学习笔记真实项目实战最新讲解视频】 Arrays.sort(players, sortByName); // 1.3 也可以采用如下形式: Arrays.sort(players, (String s1, String s2) -> (s1.compareTo(s2))); ??其…

华水967数据结构2024真题(回忆版)

一、 选择[10道) (20分). 1、数据结构中&#xff0c;从逻辑结构上可以把数据结构分为() 答案&#xff1a;线性结构和非线性结构 2、给了一个二叉树的中序遍历&#xff0c;求二叉树的后序遍历 解析&#xff1a; 要根据中序遍历的结果来推导后序遍历&#xff0c;需要知道二叉…