学习日记(XML 文件解析、检索、工厂设计模式、装饰设计模式)

news2025/1/11 12:48:13

文章目录

  • 学习日记(XML 文件解析、检索、工厂设计模式、装饰设计模式)
  • 一、XML 概述
    • 1. 概念
    • 2. XML 的创建及语法规则
    • 3. XML 文档约束方式
  • 二、XML 文件的解析技术
    • 1. 使用 Dom4j 解析 XML 文件
    • 2. XML 解析案例
  • 三、XML 文件的数据检索技术:XPath
  • 四、工厂设计模式
  • 五、装饰设计模式
  • 注意:

学习日记(XML 文件解析、检索、工厂设计模式、装饰设计模式)

一、XML 概述

1. 概念

XML:可扩展标记语言 eXtensible Markup Language 的缩写,是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。如果把 XML 内容存为文件,那么该文件就是 XML 文件。

特点:纯文本,默认使用 UTF-8 编码;可嵌套。

作用:用于进行存储数据和传输数据;作为配置文件用于存储系统的信息。

2. XML 的创建及语法规则

创建:创建一个 XML 类型的文件,文件的后缀名为 .xml,如:hello_world.xml

XML 的标签(元素)语法规则

  • 文档声明必须是第一行;
  • 标签由一对尖括号和合法标识符组成,必须存在一个根标签,有且只能有一个
  • 标签必须成对出现,有开始,有结束,结束的标签有 / 标记;
  • 特殊的标签可以不成对,但是必须有结束标记,如:<br/>
  • 标签中可以定义属性,属性和标签名空格分开,属性值必须用引号引起来;
  • 标签需要正确的嵌套
  • 定义注释信息可以用:<!-- 注释内容 -->
  • 可以存在 CDATA 区:<![CDATA[ 内容 ]]>,其中可以写任何内容,快捷键CD
  • 如果存在特殊字符可以用以下替代
替代特殊字符
&lt;< 小于
&gt;> 大于
&amp;& 和号
&apos;‘ 单引号
&quot;“ 引号

右键点击文件选择 Open in Browser,用浏览器打开显示如下

3. XML 文档约束方式

文档约束:用来限定 XML 文件中的标签以及属性应该怎么写,程序员必须依照文档约束的规定来编写 XML 文件。

XML 文档约束方式分为:DTD 约束和 schema 约束。

依据文档约束来编写 XML 文档的步骤

  • 在需要编写的 XML 文件中导入 DTD 或 schema 约束文档;
  • 按照约束的规定编写 XML 文件的内容。

注意

  • DTD 约束文档后缀为 .dtd;schema 约束文档也是一个 XML 文件,后缀为 .xsd

  • DTD 不能约束具体的数据类型;schema 可以约束具体的数据类型。


二、XML 文件的解析技术

XML 文件解析:使用程序读取 XML 文件中的数据。

两种解析方式:SAX 解析和 DOM 解析(解析常用的技术框架:Dom4j)。

DOM 解析文档对象模型:

  • Document 对象代表整个 XML 文档;
  • Element 对象代表标签(元素);
  • Attribute 对象代表属性;
  • Text 对象代表文本内容。

注意Element 对象、Attribute 对象以及 Text 对象都实现了 Node 接口,都是节点类型(最高类型)。


1. 使用 Dom4j 解析 XML 文件

首先需要在官网下载 Dom4j 框架,然后导入 jar 包。

解析的步骤

  • 导入 Dom4j 框架;
  • 通过构造器创建一个 Dom4j 的解析器对象,代表整个 Dom4j 框架,如:SAXReader saxReader = new SAXReader();
  • 利用解析器对象调用 read 方法把 XML 文件加载到内存中成为一个 Document 文档对象;
  • 通过 Document 文档对象调用 getRootElement 方法来获取根元素对象;
  • 通过根元素对象调用以下各种方法获取子元素对象、属性对象、文本等。

方法名说明
List elements()得到当前元素下所有子元素对象
Element element(String var1)得到当前元素下指定名字子元素对象返回集合
List attributes()得到当前元素下的所有属性对象
Attribute attribute(String var1)得到当前元素下指定属性名属性对象
String getText()得到当前元素下的文本,返回值为 String 类型
String getTextTrim()得到当前元素下的文本(去掉前后空格),返回值为 String 类型

注意

  • 在第二个方法中,若参数中指定的名字对应不止一个子元素对象,则默认提取第一个子元素对象。
  • 获取到子元素对象后,可以继续调用 getName 方法和 getText 方法获取元素的名字和文本。
  • 获取到属性对象后,可以继续调用 getName 方法和 getValue 方法获取属性的名称和对应的值。
  • 获取子元素对象后可以继续调用 elements 方法,进一步获取子元素的子元素对象。
  • API 很灵活,用到时再去查

解析结果

注意

  • 最好使用 Class 对象调用 getResourceAsStream 来产生字节输入流,这样可以避免后续模块名发生改变而可能出现的错误。
  • getResourceAsStream 方法中的 / 可以直接去 src 下寻找文件,而且必须是正斜杠
  • 先获取元素对象或属性对象,然后再进行进一步操作。

2. XML 解析案例

需求:将指定 XML 文件中的数据封装为 List 集合,其中每个元素是实体类 Contact

实现

运行结果

注意:获取属性值或子元素对象文本有两种方法:先获取属性对象或子元素对象,然后调用方法;也可以直接调用以下方法获取。

方法名说明
String attributeValue(String var1)直接获取元素的属性值
String elementTextTrim(String var1)直接获取该元素下子元素的文本(去掉前后空格)

代码

package com.dom4j;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class Demo02 {

    public static void main(String[] args) throws Exception {

        SAXReader saxReader = new SAXReader();

        InputStream is = Demo02.class.getResourceAsStream("/XMLdata/data01.xml");
        Document document = saxReader.read(is);

        List<Contact> list = Demo02.praseToList(document);
        System.out.println(list);

    }


    public static List<Contact> praseToList(Document document) {
        // 定义一个 list 集合用于存储 Contact 对象
        List<Contact> list = new ArrayList<>();

        Element root = document.getRootElement();

        // 根元素的子元素
        List<Element> elements = root.elements("contact");

        // 遍历根元素的子元素
        for (Element element : elements) {
            // 每有一个子元素,就创建一个 Contact 对象
            Contact con = new Contact();

            // 子元素的属性对象值
            con.setId(Integer.valueOf(element.attributeValue("id")));
            con.setVip(Boolean.valueOf(element.attributeValue("vip")));

            con.setName(element.elementTextTrim("name"));
            con.setAge(Integer.valueOf(element.elementTextTrim("age")));
            con.setHobby(element.elementTextTrim("hobby"));
//            // 取子元素的子元素对象
//            List<Element> elems = element.elements();
//            for (Element elem : elems) {
//                switch (elem.getName()) {
//                    case "name":
//                        con.setName(elem.getTextTrim());
//                        break;
//                    case "age":
//                        con.setAge(Integer.valueOf(elem.getTextTrim()));
//                        break;
//                    case "hobby":
//                        con.setHobby(elem.getTextTrim());
//                        break;
//                    default:
//                        break;
//                }
//            }
            list.add(con);
        }
        return list;
    }
}

三、XML 文件的数据检索技术:XPath

XPath 作用:检索 XML 文件中的信息。

XPath 使用路径表达式来定位 XML 文档中的元素节点或属性节点。

检索的步骤

  • 导入 Dom4j 框架和 XPath 的 jar 包(XPath 技术依赖于 Dom4j 技术);
  • 通过构造器创建一个 Dom4j 的解析器对象,如:SAXReader saxReader = new SAXReader();
  • 利用解析器对象调用 read 方法把 XML 文件加载到内存中成为一个 Document 文档对象;
  • 利用 XPath 提供的以下 API,结合路径表达式来完成检索 XML 文档中的元素节点属性节点
方法名说明
Node selectSingleNode(String var1)获取符合路径表达式的唯一元素
List selectNodes(String var1)获取符合路径表达式的元素集合
元素查找的路径表达式说明
/根元素/子元素/子元素绝对路径
./子元素/子元素相对路径,其中 . 表示当前元素
//元素在全文搜索全部这个元素
//元素1/元素2在全文元素 1 下找一级元素 2
//元素1//元素2在全文元素 1 下找全部元素 2

注意/ 表示一级元素// 表示全部元素

根据属性查找属性对象或元素对象的路径表达式说明
//@属性名查找所有属性对象
//元素[@属性名]查找带有指定属性名的元素对象
//元素//[@属性名 = '值']查找带有指定属性名,并且属性值相等的元素对象

注意:路径表达式都是正斜杠 /

元素查找

属性查找或元素查找


四、工厂设计模式

工厂设计模式:Factory Pattern 是 Java 中常用的设计模式之一,属于创建型模式,提供了一种获取对象的方式。

作用

  • 对象通过工厂的方法创建返回,工厂的方法可以为该对象进行加工和数据注入,封装了对象的创建细节
  • 可以实现类与类之间的解耦操作(核心思想)。


五、装饰设计模式

装饰设计模式:创建一个新类,包装原始类,从而在新类中提升原来类的功能。

步骤

  • 定义父类;
  • 定义原始类,继承父类,定义功能;
  • 定义装饰类,继承父类包装原始类,增强功能。

作用:在不改变原类的基础上,动态地扩展一个类的功能。

如:InputStream 是抽象父类,FileInputStream 是实现子类、BufferedInputStream 是实现子类,是装饰类,读写性能提高。

实践:模拟 IO 流。

注意:在 main 方法中,is 的实际类型为 FileInputStream,所以在使用构造器创建 bis 对象时,传入的参数实际类型为 FileInputStream,之后在装饰类调用 read 方法时,调用的是原始类(实现类)中的 read 方法(多态特点)。


注意:

  1. Dom4j 框架和 XPath 的 jar 包下载链接:点此下载,提取码:3285。

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

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

相关文章

Nacos 注册中心、配置文件中心的常用配置(springcloud)

Nacos Discovery Starter 更多的配置项 1.服务端地址 spring.cloud.nacos.discovery.server-addr 无 Nacos Server 启动监听的 ip 地址和端口2.服务名 spring.cloud.nacos.discovery.s ervice ${spring.application.name} 给当前的服务命名3.服务分组spring.cloud.nacos.disc…

Nuttx系统学习笔记(三)——使用Nuttx操作STM32F429外设

在上一篇&#xff0c;我们已经学会了如何将Nuttx进行烧录&#xff0c;以及学会了如何部署这个操作系统&#xff0c;接下来我们就要使用这个操作系统来实现我们对嵌入式设备的控制&#xff0c;当然也是从点灯开始的。这个基于Posix架构的操作系统使用起来是跟FreeRTOS那些操作系…

【微信开发第五章】SpringBoot实现微信分享

前言 在进行微信公众号业务开发的时候&#xff0c;有些时候需要用到微信分享&#xff0c;以卡片的形式分享出去&#xff0c;例如订单信息&#xff0c;用户信息。该篇文章每一步都有记录&#xff0c;力争理解的同时各位小伙伴也能够实现功能 效果图如下&#xff1a; 文章目录前…

centos 7.9 部署 harbor 镜像仓库实践

centos 7.9 harbor 部署镜像仓库 文章目录centos 7.9 harbor 部署镜像仓库1. 安装 docker1.1 配置 docker2. 安装 docker-compose3. 下载 harbor4. 定制配置文件 harbor.yml5. 配置证书5.1 生成证书颁发机构证书5.2 生成服务器证书5.3 向 Harbor 和 Docker 提供证书6. 部署 har…

【软件测试】一线大厂的测试开发基本技能,我不再想庸庸碌碌......

目录&#xff1a;导读一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结能在一线大厂工作是大多数人的目标&#xff0c;不仅薪酬高&#xf…

[Git] 系列四Push Pull —— Git 远程仓库和高级操作

[Git] 系列四Push & Pull —— Git 远程仓库和高级操作 Author: Xin Pan Date: 2022.11.06 git fetch git fetch 完成了仅有的但是很重要的两步: 从远程仓库下载本地仓库中缺失的提交记录更新远程分支指针(如 o/main) git fetch 并不会改变你本地仓库的状态。它不会更…

Github 注册

Github 注册 https://github.com/ 1. 简介 初始 Github 注册 填写注册信息 一开始注册github发现了这个问题&#xff0c;多试几次。或者换个浏览器&#xff0c;或者对octocaptcha做一个域名映射。 140.82.112.4 http://octocaptcha.com填写验证码 当注册成功后&#xff0…

【小专题】正交试验法设计测试用例

正交试验法设计测试用例 正交试验法设计工具&#xff1a; 1、正交设计助手 2、AllPairs 3、python&#xff08;本质是使用AllPairs&#xff09; 先看一个案例&#xff1a; 假设一个web系统&#xff0c;需要做兼容性测试&#xff0c;该系统兼容不同操作系统、数据库和web服…

【ESP8266与ESP12E 电机拓展板握手】

【ESP8266与ESP12E 电机拓展板握手】 1. 前言2. 材料3. 工作原理3.1 板载功能3.2 引脚接口定义图3.3 产品技术规格4. 方案4.1 普通马达接线图4.2 42步进电机接线图5. 相关代码5.1 直流电机的管理代码5.2 步进电机管理代码6. 应用7. 来源1. 前言 ESP12E Motor Shield 是一块扩展…

代码改成多线程,竟有 这些问题

文章目录CPU 使用率飙高事务问题导致服务挂掉CPU 使用率飙高 每条数据都有些业务逻辑&#xff0c;如果单线程导入所有的数据&#xff0c;导入效率会非常低。于是改成了多线程导入。 如果 excel 中有大量的数据&#xff0c;很可能会出现 CPU 使用率飙高的问题。 我们都知道&am…

公众号免费查题系统

公众号免费查题系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…

8.for循环

循环控制语句 1.for循环 for (表达式1&#xff1b;表达式2&#xff1b;表达式3) { //复合语句&#xff0c;循环体 } 第一次进入循环的时候执行表达式1&#xff0c;表达式1只执行一次 表达式2是循环的条件&#xff0c;只有表达式2为真了&#xff0c;才执行循环体&#xff0c;也…

Android 应用模块的构建

Google文档说明&#xff1a;https://developer.android.com/studio/build?hlzh-cn Android 构建系统会编译应用资源和源代码&#xff0c;然后将它们打包成 APK 或 Android App Bundle 文件&#xff0c;供您测试、部署、签名和分发。Android Studio 使用高级构建工具包 Gradle …

Python学习----面向对象

面向对象思想就不说了&#xff0c;和java一样。这是为了自己能够一直看教程不走神做得笔记。 类的定义和赋初值 成员变量和成员方法&#xff0c;含义和java一样。 成员变量的申明没啥好记得 需要关注得是成员方法&#xff0c;在定义成员方法得时候&#xff0c;需要传入self关…

设计模式学习笔记 - 组合模式

设计模式学习笔记 - 组合模式一、学校院系展示问题二、传统方案解决学校院系展示问题三、组合模式介绍1、基本介绍2、组合模式原理四、组合模式解决学校院系展示问题五、组合模式在JDK集合的源码分析六、组合模式的注意事项和细节一、学校院系展示问题 展示一个学校院系结构&am…

机器学习可视化技术(Towards Data Science)

介绍 作为任何数据科学项目的一部分&#xff0c;数据可视化在了解更多可用数据和识别任何主要模式方面发挥着重要作用。 如果能够使分析中的机器学习部分尽可能直观&#xff0c;那不是很好吗&#xff1f; 在本文中&#xff0c;我们将探讨一些可以帮助我们应对这一挑战的技术&am…

HCIA 链路聚合与LACP

一、前言 虽然很多文章在介绍链路聚合时会从链路备份的角度来介绍链路聚合的作用&#xff0c;然后再说其有提升链路带宽的作用&#xff0c;但我感觉链路聚合主要还是提升链路带宽的作用&#xff0c;链路备份只是顺带的不是主要目标。 二、链路聚合 考虑下面的网络&#xff0…

Windows 环境下的 Socket 编程 3 - 基于 TCP 的服务器/客户端

基于 TCP 的服务器端/客户端 绝大多数 TCP 服务器端都按照如下顺序调用&#xff1a; 在 Windows 环境下&#xff0c;代码表示为&#xff1a; WSADATA wsaData;SOCKET hServSock, hClntSock;SOCKADDR_IN servAddr, clntAddr;int szClntAddr;/*Windows 环境 Socket 编程必须*/i…

leetcode:6243. 到达首都的最少油耗【变种子树大小统计 + 从边的角度出发 + 思维转换】

目录题目截图题目分析ac code总结题目截图 题目分析 0作为root从边的角度出发每个点都向0的方向聚集比如大家已经由四面八方聚集到了x&#xff0c;x的fa固定的&#xff0c;假设为y那么x到y要多少辆车&#xff1f;设size&#xff08;x&#xff09;为x子树大小x到y需要ceil&…

2022年第十三届蓝桥杯大赛湖南中医药大学第2场选拔赛(部分总结)

文章目录2008: 简单整数问题2005: 飞行棋2074: 几乎回文串2101: 通行密令2089: 密码1867: X星救援站2085: 千里走单骑2093: 最长等比子序列2087: 跳水比赛总结2008: 简单整数问题 [命题人 : admin] 时间限制 : 1.000 sec 内存限制 : 128 MB 题目描述 小明最近经常会思考一些关…