JavaSE进阶(day14,复习自用)

news2024/11/24 7:37:28

XML、XML解析、设计模式等

  • XML
    • XML概述
    • XML的创建、语法规则
    • XML文档约束方式一-DTD约束[了解]
    • XML文档约束方式二-schema约束[了解]
  • XML解析技术
    • XML解析技术概述
    • Dom4J解析XML文件
    • Dom4J解析XML文件-案例实战
  • XML检索技术:Xpath
  • 设计模式:工厂模式
  • 设计模式:装饰模式

)

XML

XML概述

在这里插入图片描述XML是什么?
XML的全称为(EXtensible Markup Language),是一种可扩展的标记语言。
它是是一种数据表示格式,可以用于自定义数据格式。
XML的作用是什么?
用于进行存储数据和传输数据
作为软件的配置文件

XML的创建、语法规则

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

XML文档约束方式一-DTD约束[了解]

文档约束:是用来限定xml文件中的标签以及属性应该怎么写。以此强制约束程序员必须按照文档约束的规定来编写xml文件。
在这里插入图片描述

XML文档约束方式二-schema约束[了解]

在这里插入图片描述

XML解析技术

XML解析技术概述

使用程序读取XML中的数据

两种解析方式
SAX解析
DOM解析
在这里插入图片描述
在这里插入图片描述

Dom4J解析XML文件

在这里插入图片描述
在这里插入图片描述

/*
    目标:学会使用dom4j解析XML文件中的数据。
    1.导入dom4k框架
    2.准备一个XML文件
 */
public class Dom4jHelloWorldDemo1 {
    @Test
    public void parseXMLData() throws Exception {
        //1.创建一个Dmo4j的解析器对象,代表了整个dom4j框架
        SAXReader saxReader = new SAXReader();
        //2.把XML文件加载到内存中成为一个Document文档对象
//        Document document = saxReader.read(new File("day14-xml-app/src/Contacts.xml"));//需要通过模块名去定位

        //注意:getResourceAsStream中的/是直接去src下寻找的文件
        InputStream is = Dom4jHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        //3.获取根元素对象
        Element root = document.getRootElement();
        System.out.println(root.getName());

        //4.拿根元素下的全部子元素对象(一级)
//        List<Element> sonEles = root.elements();
        List<Element> sonEles = root.elements("contact");
        for (Element sonEle : sonEles) {
            System.out.println(sonEle.getName());
        }
        //拿某个子元素
        Element userEle = root.element("user");
        System.out.println(userEle.getName());
        //默认提取第一个子元素对象
        Element contact = root.element("contact");
        //获取子元素文本
        System.out.println(contact.elementText("name"));
        //去掉前后空格
        System.out.println(contact.elementTextTrim("name"));

        //根据元素获取属性值
        Attribute idAttr = contact.attribute("id");
        System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
        //直接提取属性值
        System.out.println(contact.attributeValue("id"));
        System.out.println(contact.attributeValue("vip"));


        //获取当前元素下的子元素对象
        Element email = contact.element("email");
        System.out.println(email.getText());



    }
}

Dom4J解析XML文件-案例实战

在这里插入图片描述

<?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" vip="false">
        <name>武松</name>
        <gender></gender>
        <email>wusong@itcast.cn</email>
    </contact>
    <contact id="3" vip="false">
        <name>武大狼</name>
        <gender></gender>
        <email>wuda@itcast.cn</email>
    </contact>
    <user>
    </user>
</contactList>
public class Contact {
    private String name;
    private int id;
    private boolean vip;
    private char gender;
    private String email;

    public Contact() {
    }

    public Contact(String name, int id, boolean vip, char gender, String email) {
        this.name = name;
        this.id = id;
        this.vip = vip;
        this.gender = gender;
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public boolean isVip() {
        return vip;
    }

    public void setVip(boolean vip) {
        this.vip = vip;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Contact{" +
                "name='" + name + '\'' +
                ", id=" + id +
                ", vip=" + vip +
                ", gender=" + gender +
                ", email='" + email + '\'' +
                '}';
    }
}

public class Dom4jTest2 {

    @Test
    public void parseToList() throws Exception {
        //需求:解析XML中的数据成为一个List集合对象
        //1.导入框架(做过)

        //2.创建SaxReaader对象
        SAXReader saxReader = new SAXReader();
        //3.加载XML文件成为文档对象Document对象。
        Document document =
                saxReader.read(Dom4jTest2.class.getResourceAsStream("/Contacts.xml"));
        //4.先拿根元素
        Element root = document.getRootElement();
        //5.提取contact子元素
        List<Element> contactEles = root.elements("contact");
        //6.准备一个ArrayList集合封装联系人信息
        List<Contact> contacts = new ArrayList<>();
        //7.遍历Contact子元素
        for (Element contactEle : contactEles) {
            //8.每个子元素都是一个联系人对象
            Contact contact = new Contact();
            contact.setId(Integer.valueOf(contactEle.attributeValue("id")));
            contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));
            contact.setName(contactEle.elementTextTrim("name"));
            contact.setGender(contactEle.elementTextTrim("gender").charAt(0));
            contact.setEmail(contactEle.elementText("email"));
            //9.把联系人对象数据加入到List集合
            contacts.add(contact);
        }
        //10.遍历List集合
        for (Contact contact : contacts) {
            System.out.println(contact);
        }


    }

}

XML检索技术:Xpath

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/**
    目标:XPath检索XML中的信息啊。(了解)

    引入:
        Dom4J可以用于解析整个XML的数据。
        但是如果要检索XML中的某些信息,建议使用XPath.(Xpath依赖Dom4j技术)
        Dom4J用于解析数据,Xpath用于检索数据。
    XPath使用步骤:
        1.导入dom4j框架。(XPath依赖于Dom4j技术,必须先导入dom4j框架!)
        2.导入XPath独有的框架包。jaxen-1.1.2.jar
    XPath常用API:
        List<Node> selectNodes(String var1):检索出一批节点集合。
        Node selectSingleNode(String var1):检索出一个节点返回。
    XPath提供的四种检索数据的写法:
        1.绝对路径。
        2.相对路径。
        3.全文搜索。
        4.属性查找。
    小结:
         1.绝对路径: /根元素/子元素/子元素。
         2.相对路径: ./子元素/子元素。 (.代表了当前元素)
         3.全文搜索:
                //元素  在全文找这个元素
                //元素1/元素2  在全文找元素1下面的一级元素2
                //元素1//元素2  在全文找元素1下面的全部元素2
         4.属性查找。
                //@属性名称  在全文检索属性对象。
                //元素[@属性名称]  在全文检索包含该属性的元素对象。
                //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
 */
public class XPathDemo {
    /**
     1.绝对路径: /根元素/子元素/子元素。
     */
    @Test
    public void parse01() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索全部的名称
        List<Node> nameNodes = document.selectNodes("/contactList/contact/name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     2.相对路径: ./子元素/子元素。 (.代表了当前元素)
     */
    @Test
    public void parse02() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        Element root = document.getRootElement();
        // c、检索全部的名称
        List<Node> nameNodes = root.selectNodes("./contact/name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     3.全文搜索:
     //元素  在全文找这个元素
     //元素1/元素2  在全文找元素1下面的一级元素2
     //元素1//元素2  在全文找元素1下面的全部元素2
     */
    @Test
    public void parse03() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索数据
//        List<Node> nameNodes = document.selectNodes("//name");
         List<Node> nameNodes = document.selectNodes("//contact/name");
//        List<Node> nameNodes = document.selectNodes("//contact//name");
        for (Node nameNode : nameNodes) {
            Element  nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }

    /**
     4.属性查找。
     //@属性名称  在全文检索属性对象。
     //元素[@属性名称]  在全文检索包含该属性的元素对象。
     //元素[@属性名称=值]  在全文检索包含该属性的元素且属性值为该值的元素对象。
     */
    @Test
    public void parse04() throws Exception {
        // a、创建解析器对象
        SAXReader saxReader = new SAXReader();
        // b、把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contacts2.xml"));
        // c、检索数据
        List<Node> nodes = document.selectNodes("//@id");
        for (Node node : nodes) {
            Attribute attr = (Attribute) node;
            System.out.println(attr.getName() + "===>" + attr.getValue());
        }

        // 查询name元素(包含id属性的)
//      Node node = document.selectSingleNode("//name[@id]");
        Node node = document.selectSingleNode("//name[@id=888]");
        Element ele = (Element) node;
        System.out.println(ele.getTextTrim());
    }
}

设计模式:工厂模式

在这里插入图片描述

public abstract class Computer {
    private String name;
    private double price;

    public abstract void start();

    public Computer() {
    }

    public Computer(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

public class Huawei extends Computer{
    @Override
    public void start() {
        System.out.println(getName() + "开机了:展示了华为的菊花图标~");
    }
}
public class Mac extends Computer{

    @Override
    public void start() {
        System.out.println(getName() + "以非常优雅的方法启动了,展示了一个苹果logo");
    }
}
public class FactoryPattern {
    /*
        定义一个方法,创建对象返回
     */
    public static Computer createComputer(String info){
        switch (info){
            case "huawei":
                Computer c = new Huawei();
                c.setName("huawei pro 16");
                c.setPrice(5999);
                return c;
            case "mac":
                Computer c2 = new Mac();
                c2.setName("MacBook pro");
                c2.setPrice(11999);
                return c2;
            default:
                return null;

        }
    }


}

/**
 目标:工厂模式。

 什么是工厂设计模式?
 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。
 这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式。
 之前我们创建类对象时, 都是使用new 对象的形式创建, 除new 对象方式以外,
 工厂模式也可以创建对象。

 工厂设计模式的作用:
 1.对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入。
 2.可以实现类与类之间的解耦操作(核心思想,重点)

 小结:
 工厂模式的思想是提供一个工厂方法返回对象!
 */
public class FactoryDemo {
    public static void main(String[] args) {
        Computer c1 = FactoryPattern.createComputer("huawei");
        c1.start();

        Computer c2 = FactoryPattern.createComputer("mac");
        c2.start();

    }
}

设计模式:装饰模式

在这里插入图片描述

/*
    共同父类
 */
public abstract class InputStream {
    public abstract int read();
    public abstract int read(byte[] buffer);
}
/*
    原始类
 */
public class FileInputStream extends InputStream{
    @Override
    public int read() {
        System.out.println("低性能的方式读取了一个字节a");
        return 97;
    }

    @Override
    public int read(byte[] buffer) {
        buffer[0] = 97;
        buffer[1] = 98;
        buffer[2] = 99;
        System.out.println("低性能的方式读取了一个字节数组:"+ Arrays.toString(buffer));
        return 3;
    }
}
/*
    装饰类:继承InputStream 拓展原始类的功能
 */
public class BufferedInputStream extends InputStream{
    private InputStream is;
    public BufferedInputStream(InputStream is){
        this.is = is;
    }

    @Override
    public int read() {
        System.out.println("提供8KB的缓冲区,提高读写性能~~~");
        return is.read();
    }

    @Override
    public int read(byte[] buffer) {
        System.out.println("提供8KB的缓冲区,提高读写性能~~~");
        return is.read(buffer);
    }
}
/**
 装饰模式

 定义父类:InputStream
 定义实现类:FileInputStream 继续父类 定义功能
 定义装饰实现类:BufferedInputStream 继承父类 定义功能 包装原始类,增强功能。
 */
public class DecoratorPattern {
    public static void main(String[] args) {
        InputStream is = new BufferedInputStream(new FileInputStream());
        System.out.println(is.read());
        System.out.println(is.read(new byte[3]));


    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++算法:排序之一(插入、冒泡、快速排序)

C算法&#xff1a;排序 排序之一&#xff08;插入、冒泡、快速排序&#xff09; 文章目录 C算法&#xff1a;排序前言一、十大排序法性能二、各算法实现1、插入排序2、冒泡排序3、快速排序 原创文章&#xff0c;未经许可&#xff0c;严禁转载 前言 排序算法很多&#xff0c;一…

chatgpt赋能python:Python备份一个列表:最简单的方式和最佳实践

Python备份一个列表&#xff1a;最简单的方式和最佳实践 在Python编程中&#xff0c;经常需要将数据存储在列表中。但是&#xff0c;由于数据的重要性&#xff0c;我们需要确保数据不会丢失或损坏。因此&#xff0c;备份列表是我们需要考虑的一件事情。在这篇文章中&#xff0…

chatgpt赋能python:Python实现文件夹备份:让你的数据永不丢失

Python实现文件夹备份&#xff1a;让你的数据永不丢失 数据备份对于每个人都非常重要。如果你有很多个人或工作文件保存在计算机上&#xff0c;那么定期备份可以保证你的数据不会因为计算机出现故障而丢失。Python作为一种强大的编程语言&#xff0c;可以帮助你轻松地实现文件…

Linux开发工具gcc/g++篇

文章目录 &#x1f347;0. 前言&#x1f348;1. 背景知识&#x1f349;2. gcc/g使用&#x1f34a;2.1 预处理操作&#x1f34b;去注释&#x1f34b;头文件展开&#x1f34b;条件编译 & 宏展开 &#x1f34a;2.2 编译操作&#x1f34a;2.3 汇编操作&#x1f34a;2.4 链接 &a…

chatgpt赋能python:Python多段分段函数的介绍

Python多段分段函数的介绍 在Python编程中&#xff0c;有许多种不同类型的函数&#xff0c;其中之一是多段分段函数。多段分段函数的特点在于&#xff0c;在输入域上&#xff0c;函数定义被划分为不同的段&#xff0c;每个段都求值并返回结果。在本文中&#xff0c;我们将深入…

Java性能权威指南-总结5

Java性能权威指南-总结5 垃圾收集入门垃圾收集概述分代垃圾收集器 垃圾收集入门 很多时候没有机会重写代码&#xff0c;又面临需要提高Java应用性能的压力&#xff0c;这种情况下对垃圾收集器的调优就变得至关重要。 现代JVM的类型繁多&#xff0c;最主流的四个垃圾收集器分别…

使用RP2040自制的树莓派pico—— [2/100] HelloWorld! 和 点亮LED

使用RP2040自制的树莓派pico—— [2/100] HelloWorld! 和 点亮LED 开发环境HelloWorld!闪烁 LED 灯代码 由于比较简单就放在一起写了 开发环境 软件&#xff1a;Thonny HelloWorld! 要想使串口打印HelloWorld&#xff01; 只需要一行代码 print("HelloWorld!")保…

c++与c中多组输入的使用

我们现在看看c中多组输入的使用 int main() {int a;//1while (~scanf("%d", &a)){}//2while (scanf("%d", &a) ! EOF){}return 0; } 这两个是等同的 我们需要知道的是scanf的返回值是成功读取的个数&#xff0c;我们来验证一下 我们可以看到&am…

chatgpt赋能python:Python在Mac上的运行方法

Python在Mac上的运行方法 如果你是一名使用Mac系统的Python开发人员&#xff0c;你肯定希望能够尽可能方便地运行Python。幸运的是&#xff0c;Mac系统已经预先安装了Python&#xff0c;但是你可能需要对其进行配置&#xff0c;以便更好地管理Python模块和环境。 检查Python版…

chatgpt赋能python:Python地区分析:如何使用Python进行地理数据分析

Python地区分析&#xff1a;如何使用Python进行地理数据分析 简介 Python是一种广泛使用的编程语言&#xff0c;它提供了许多强大的工具来处理大量数据。其中包括地理数据&#xff0c;地理数据是指地球表面的空间信息。Python中有一些强大的地图库&#xff0c;包括Folium和Ba…

chatgpt赋能python:Python的均值计算公式

Python的均值计算公式 在数据分析和机器学习方面&#xff0c;计算均值是非常常见的操作。Python提供了一些内置函数和库来计算均值。本文将介绍Python中常用的均值计算公式。 1. 算术均值 算术均值&#xff08;Arithmetic Mean&#xff09;是最常见的均值计算方法。Python中…

解决高并发

目录 1.4 对比单体系统、分布式系统和微服务系统 1.4.1 单体系统之痛 1、什么是单体系统 2、单体系统面临的问题 1.4.2 高并发系统之分布式架构 1.4.3 高并发系统之微服务架构 1.4 对比单体系统、分布式系统和微服务系统 接下来从企业真实场景出发&#xff0c;对比单体系统…

ROS:服务端Server的编程实现

目录 一、服务模型二、创建功能包三、创建代码并编译运行&#xff08;C&#xff09;3.1步骤3.2创建服务端Server代码3.3编译3.4运行 一、服务模型 Server端本身是进行模拟海龟运动的命令端&#xff0c;它的实现是通过给海龟发送速度&#xff08;Twist&#xff09;的指令&#x…

【Android Framework系列】第1章 Handler消息传递机制

1 Handler简介 Handler是一套Android的消息传递机制&#xff0c;Handler主要用于同进程的线程间通信。而Binder/Socket用于进程间通信。 2 Handler运行机制 Handler运行主要涉及到四个类&#xff1a;Handler、Looper、Message、MessageQueue Handler&#xff1a;消息处理器&…

chatgpt赋能python:Python文件备份的重要性和应用

Python文件备份的重要性和应用 在现代企业和个人用户中&#xff0c;数据备份是一项至关重要的工作&#xff0c;以防止数据丢失或损坏。当涉及到计算机数据时&#xff0c;文件备份是一项基本需求。文件备份还可以用于保护文件&#xff0c;以防它们被病毒、恶意软件或未经授权的…

法规标准-UN R158标准解读

UN R158是做什么的&#xff1f; UN R158全名为针对驾驶员识别车辆后方弱势道路使用者&#xff0c;联合国对倒车系统和机动车的统一规定&#xff0c;该法规涉及批准倒车和机动车辆的装置&#xff0c;主要为保证倒车时避免碰撞&#xff0c;方便驾驶员观察了解车辆后部人员和物体…

dSPACE一览(暂存)

1. SCALEXIO - dSPACE 2. dSPACE仿真流程介绍&#xff08;dSPACE软件介绍、仿真演示、自动化API接口使用&#xff09;_云溪溪儿的博客-CSDN博客 目录 硬件 板卡 软件 VEOS 应用领域 全面总线仿真 高效集成多种建模方法 硬件 板卡 SCALEXIO FPGA Subsystems DS6601 FPG…

STM32通过esp8266连接WiFi接入MQTT服务器

上文我们讲到如何搭建本地MQTT服务器&#xff0c;现在介绍如何通过stm32连接MQTT 一.首先我们初始化esp8266这里我们使用的是USART4与其通信代码如下 void UART4_Init(uint32_t bound) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;RCC_APB1…

高通 Camera HAL3:添加一条PipeLine

一.概述 添加一条PipeLine实现两路Raw进&#xff0c;一路Raw出 二.简介 要添加的PipeLine&#xff1a;SWMFMergeRawTwo2One 包含1个memcpy node&#xff0c;这个node用于将2个raw buffer input输入 变为 1个raw buffer output输出 三.添加 3.1 在相应的Usecase下添加一个p…

Spring Cloud Alibaba - Nacos源码分析(一)

目录 一、源码 1、为什么要分析源码 2、看源码的方法 二、Nacos服务注册与发现源码剖析 1、Nacos核心功能点 2、Nacos服务端/客户端原理 2.1、nacos-example 2.2、Nacos-Client测试类 3、项目中实例客户端注册 一、源码 1、为什么要分析源码 1. 提升技术功底&#x…