动态代理,XML,Dom4j

news/2024/5/17 14:03:44

文章目录

  • 动态代理
  • 概述
    • 特点
    • 代码实现
    • 实现的关键步骤
    • 优点
  • XML
    • 概述
    • 作用
    • 编写第一个XML文件
    • 组成
      • 声明
      • 元素(标签、标记)
      • 属性
      • 注释
      • 转义字符[实体字符
      • 字符区(了解)
    • 约束
      • DTD约束
      • Schema约束
      • 名称空间
  • Dom4j
    • XML解析
    • 解析方式和解析器
      • 解析方式
      • 解析器
      • Snipaste_2024-04-17_21-22-44.png
      • <br />解析器开发包
    • 基本使用
      • DOM解析原理及结构模型
      • 常用的方法
    • 使用xpath解析xml文件
      • 介绍
      • 使用步骤
      • Node接口中存在的方法
      • 路径表达式

动态代理

概述

提供一个代理的对象,有了代理对象后,当访问某个方法时,会被代理对象拦截(拦截后可以对方法进行前增强,后增强)[代理对象不会破坏原有方法的代码]

特点

  • 动态的创建.class文件(创建一个和被代理类实现相同父接口的子类[代理类])
  • 动态的加载.class文件到内存中(创建Class对象)
    • Proxy类需要一个类加载器
  • 对程序员来讲,不需要书写代理类

代码实现

代理对象 = Proxy.newProxyInstance(累加载器,父接口,处理器);
类加载器:动态的加载.class文件
父接口:代理类和被代理类共同的父接口
处理器:代理对象拦截了方法后,对方法进行前增强,后增强,是由处理器来书写逻辑代理对象 = Proxy.newProxyInstance(.class.getClassLoader(),被代理类.class.getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {proxy:代理对象method:被拦截的方法对象args:被拦截的方法中的实参return method.invoke("代理对象",args);}});

实现的关键步骤

  1. 被代理类:必须有实现接口
  2. 创建被代理类对象:交给代理对象使用

优点

  • 非常的灵活,支持任意接口类型的实现对象做代理,也可以直接为接口本身做代理
  • 可以为被代理对象的所有方法做代理
  • 可以在不改变方法源码的情况下,实现对方法功能的增强
  • 不仅简化了编程工作,提高了软件系统的可扩展性,同时也提高了开发效率

XML

概述

Extensible Markup Language 可扩展的标记语言,由各种(标记,元素)组成
可扩展:所有的标签都是自定义的,可以随意扩展的
标记语言:整个文档由各种标签组成,清晰,数据结构化

作用

  1. 数据交换:不同计算机之间,不同操作系统之间,不同数据库之间,进行数据交换
  2. 配置文件:主要用于各种框架的配置文件

编写第一个XML文件

  1. 先创建文件

Snipaste_2024-04-17_20-06-00.png

  1. 编写person.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<peopel><person><id>1</id><name>张三</name><age>18</age><sex></sex></person><person><id>2</id><name>李四</name><age>20</age><sex></sex></person></peopel>
  1. 通过浏览器解析xml的内容

** 注**:XML以后通过Java来进行解析,很少直接在浏览器上显示

组成

声明

<?xml version="1.0" encoding="utf-8" ?> 固定格式

文档声明必须为<?xml开头,以?>结束
必须在xml文档中的首行首列
常见的俩个属性:

  • version:指定XML文档版本,必须属性,这里选择1.0
  • encoding:指定当前文档的编码,可选属性,默认值为utf-8

元素(标签、标记)

格式1: 标签体 有标签体的标签(双标签)
格式2: 没有标签体的标签(空标签) (单标签)
元素体:可以是元素,也可以是文本
元素命名:和Java命名标识符保持一致
一个XML中有且仅有一个根元素

属性

  1. 是元素的一部分,必须出现在元素的开始标签中
  2. 定义格式: 属性名 = “属性值”
  3. 一个元素可以有0~N个属性,但一个元素中不能同名出现
  4. 属性名建议以Java的标识符定义规则做参考

注释

ctrl+/

转义字符[实体字符

字符预定义的转义字符说明
<<小于(less than)
>>大于(greater than)
""双引号(quotation)
'单引号(apostrophe)
&&和号(ampersand )

字符区(了解)

当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时候使用CDATA段会好一些
CDATA(Character Data)字符数据区,格式如下
:::tips

<![CDATA[
文本数据 < > & ; " "
]]>

:::
特点:原样显示(书写的内容不会被xml解析器解析)
CD+enter

约束

DTD约束

<!ELEMENT 书架 (+)> <!-- 声明了根元素,并指定了根元素下必须有的一个子元素 --><!-- 声明子元素 书 -->
<!ELEMENT(书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价--><!-- , 表示必须按照元素的顺序出现  --><!ELEMENT 书名 (#PCDATA)> <!-- #PCDATA  : 表示文本内容 -->
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

:::tips
引用
:::

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "bookshelf.dtd"><!--指定使用bookshelf.dtd文件约束当前xml文档-->
<书架><><书名>JavaWeb开发教程</书名><作者>张孝祥</作者><售价>100.00</售价></><><书名>三国演义</书名><作者>罗贯中</作者><售价>100.00</售价><测试>hello</测试><!--不符合约束,书的子元素必须为书名、作者、售价--></>
</书架>

Schema约束

概念:Schema语言也叫做XSD(XML Schema Definition)
其本身也是xml格式文档,但Schema文档扩展名为xsd,而不是xml,它功能强大,数据类型约束更完善

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.itcast.cn"elementFormDefault="qualified"><xs:element name='书架' ><!--  complexType : 复杂元素 xml文档中的某个标签,有子标签或有属性,该标签就为:复杂元素例: <书架>   <>简单元素: 没有子标签、没有属性。   例:书名、作者、售价--><xs:complexType><xs:sequence maxOccurs='unbounded' ><xs:element name='书' ><xs:complexType><xs:sequence><xs:element name='书名' type='xs:string' /><xs:element name='作者' type='xs:string' /><xs:element name='售价' type='xs:double' /></xs:sequence></xs:complexType></xs:element></xs:sequence></xs:complexType></xs:element>
</xs:schema>
<?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 bookshelf.xsd"
><!--指定schema文档约束当前XML文档--><><书名>JavaScript网页开发</书名><作者>张孝祥</作者><售价>abc</售价></>
</书架>

引入步骤
:::tips
<根元素 xmlns=“命名空间”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“命名空间 文件路径”
</根元素>
命名空间为约束文件中的targetNamespace中
:::

名称空间

一个XML文档最多可以使用一个DTD文件,但一个XML文档中使用多个Schema文件,若这些Schema文件中定义了相同名称的元素时,使用的时候就会出现名字冲突。
同理 , 在XML文档中就需要通过名称空间(namespace)来区分元素和属性是来源于哪个约束中的。
名称空间就在在根元素后面的内容 , 使用xmlns到引入约束 。
当一个XML文档中需要使用多个Schema文件的时候 , 有且仅有一个使用缺省的 , 其他的名称空间都需要起别名 。
:::tips
xmlns="http://www.itcast.cn"


xmlns:aa="http://java.sun.com"

:::

Dom4j

XML解析

当数据存储在xml中,我们希望通过程序获取xml的内容,使用io的话会比较繁琐,所有后来创造了解析器,方便开发人员操作xml

解析方式和解析器

解析方式

  1. DOM:将整个xml文件装入内存,并解析成一个Document对象
  2. SAX:边扫描边分析,只能读
  3. PULL:Android内置的xml解析方式,类似sax

解析器

就是根据不同的解析方式提供具体实现

Snipaste_2024-04-17_21-22-44.png


解析器开发包

Snipaste_2024-04-17_21-23-28.png

基本使用

DOM解析原理及结构模型

解析原理
将整个xml文档加载到内存中,生成一个DOM树,并获得Document对象,通过Document对象就可以对DOM数进行操作

<?xml version="1.0" encoding="UTF-8"?>
<books><book id="0001"> <name>JavaWeb开发教程</name><author>张孝祥</author><sale>100.00</sale></book><book id="0002"><name>三国演义</name><author>罗贯中</author><sale>100.00</sale></book>
</books>

结构模型
DOM中的核心概念就是节点,在xml文档中的元素、属性、文本,在DOM中都是节点!所有的节点都封装到了Document对象中
Snipaste_2024-04-17_21-28-01.png
使用Document对象,就可以去访问DOM树中的每个节点

常用的方法

  1. SAXReader对象
    | 方法 | 作用 |
    | — | — |
    | SAXReader sr = new SAXReader(); | 构造器 |
    | Document read(String url) | 加载执行xml文档 |

  2. Document对象
    | 方法 | 作用 |
    | — | — |
    | Element getRootElement() | 获得根元素 |

  3. Element对象
    | 方法 | 作用 |
    | — | — |
    | List elements(String ele ) | 获得指定名称的所有子元素。可以不指定名称 |
    | Element element(String ele) | 获得指定名称第一个子元素。 |
    | String getName() | 获得当前元素的元素名 |
    | String attributeValue(String attrName) | 获得指定属性名的属性值 |
    | String elementText(Sting ele) | 获得指定名称子元素的文本值 |
    | String getText() | 获得当前元素的文本内容 |

使用xpath解析xml文件

介绍

XPath使用路径表达式来选取XML/HTML 文档中的元素节点或属性节点。节点是通过沿着路径 (path) 来选取的。XPath在解析XML/HTML文档方面提供了一独树一帜的路径思想。

使用步骤

  1. 导入jar包(dom4j和jaxen-1.1-beta-6.jar)
  2. 通过dom4j的SaxReader获取Document对象
  3. 利用Xpath提供的api,结合xpath的语法完成选取XML文档元素节点进行解析操作

Node接口中存在的方法

方法作用
List<Element> selectNodes("路径表达式")获取符合表达式的元素集合
Element selectSingleNode("路径表达式")获取符合表达式的唯一元素

Document,Element都是Node的子类型,也可以使用上述的方法

路径表达式

  1. 绝对路径表达式

例如: /元素/子元素/子子元素…

  1. 相对路径表达式

例如: 子元素/子子元素… 或者 ./子元素/子子元素…

  1. 全文搜索路径表达式

例如: //子元素//子子元素或者//子子元素

  1. 条件筛选表达式

例如: //元素[@属性名]或者//元素[@属性名=value]


http://www.mrgr.cn/p/14480004

相关文章

初学HOOK(hook xhr实践)

先了解xhr底层原理: 网页在创建XHR的时候,是通过XMLhttpRequest发起网页请求用的方法:XMLhttpRequest.open。因此我们在HOOK XHR的时候要重写open方法。 练手开始啦: https://www.qimai.cn/rank/marketRank 七麦数据-->榜单-->安卓市场实时榜单 右击-->检查,重新…

【GUI软件】小红书关键词搜索笔记批量采集,支持多关键词同时抓取,爬取了1024w条笔记!

用python开发的小红书关键词搜索软件,采集字段包含:关键词, 页码, 笔记id, 笔记链接, 笔记标题, 笔记类型, 点赞数, 用户id, 用户主页链接, 用户昵称。目录一、背景介绍1.1 爬取目标1.2 演示视频1.3 软件说明二、代码讲解2.1 爬虫采集模块2.2 软件界面模块2.3 日志模块三、获…

你的第一款开源视频分析框架

现在,刷视频已经成为我们生活中的一部分,而且很容易一看就停不下来。你有没有好奇过,它是如何在海量的视频里,找到让你感兴趣的视频?又是如何让你可以通过关键字,搜索到与之相关的视频内容的呢?这一切都离不开计算机对视频内容的分析和理解。计算机是如何“看懂”海量视…

OpenCV实战(33)——OpenCV与深度学习的碰撞

OpenCV实战&#xff08;33&#xff09;——OpenCV与深度学习的碰撞 0. 前言1. 深度学习和卷积神经网络2. 使用深度学习进行人脸检测2.1 SSD 简介2.2 使用 SSD 执行人脸检测 3. 完整代码小结系列链接 0. 前言 深度学习是机器学习的一个子领域&#xff0c;基于传统的神经网络和卷…

Docker安装(一)

一、安装Docker 服务器系统&#xff1a;centos 7 1.本地有docker的首先卸载本机docker yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \dock…

2024-4-17 周三 麻辣烫日渐无味

上午上课,中午麻辣烫,(最近应该是麻辣烫吃的太多了,感觉越来越不好吃了),下午睡觉,晚上学会习,学了电路,侯宾老师真的很好,问问题秒回并且很耐心,高数鞠红杰老师也是,半夜十点多回我,不像张某威,明天还有他的课

仿真科普|从设计到研发,CAE仿真技术为汽车智造保驾护航

2024年3月28日&#xff0c;对于汽车产业来说&#xff0c;是历史性的一天&#xff0c;作为近年汽车行业发布会流量最大的一次&#xff0c;小米SU7的发布让整个汽车圈为之沸腾&#xff0c;成功收割全平台热搜。时至今日&#xff0c;小米汽车依然热度不减。 随着“蔚、小、理、特…

传统大数据架构与现代数据平台的期望——Lakehouse 架构(二)

文章目录 前言数据仓库数仓基础好处和优势限制和挑战 数据湖数据湖基础好处和优势限制和挑战 现代数据平台云数据湖与云数仓组合架构现代数据平台的期望Lakehouse 架构的出现未来数据平台的默认选择&#xff1f; 总结 前言 本文概述了传统数据架构&#xff1a;数据仓库和数据湖…

.net9 AOT编绎生成标准DLL,输出API函数教程-中国首创

1&#xff0c;安装VS2022预览版&#xff08;Visual Studio Preview&#xff09; https://visualstudio.microsoft.com/zh-hans/vs/preview/#download-preview 2&#xff0c;选择安装组件&#xff1a;使用C的桌面开发 和 .NET桌面开发 ------------------------------------- …

.NET开源强大、易于使用的缓存框架 - FusionCache

前言 缓存在程序中扮演着提升性能、降低资源消耗、改善用户体验等重要角色,是构建高效、可伸缩、稳定的系统不可或缺的重要组成部分。今天大姚给大家分享一款.NET开源(基于MIT license)、强大、易于使用的缓存框架:FusionCache。框架介绍 FusionCache是一个用于构建高效缓存…

20240329-1-SVM面试题

SVM面试题 1. SVM直观解释 SVM&#xff0c;Support Vector Machine&#xff0c;它是一种二分类模型&#xff0c;其基本模型定义为特征空间上的间隔最大的线性分类器&#xff0c;间隔最大使它有别于感知机&#xff1b;其还包括核技巧&#xff0c;这使它成为实质上的非线性分类…

neo4j-01

Neo4j是&#xff1a; 开源的&#xff08;社区版开源免费&#xff09;无模式&#xff08;不用预设数据的格式&#xff0c;数据更加灵活&#xff09;noSQL&#xff08;非关系型数据库&#xff0c;数据更易拓展&#xff09;图数据库&#xff08;使用图这种数据结构作为数据存储方…

vue简单使用五(组件的使用)

目录 如何定义组件&#xff1a; 组件的命名&#xff1a; 父组件向子组件传值&#xff1a; 子组件向父组件传值&#xff1a; 如何定义组件&#xff1a; 全局组件定义&#xff1a; 局部组件定义&#xff1a; 组件的基本使用&#xff1a; 打印结果&#xff1a; 组件的命名&#xf…

MySQL复合查询

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容介绍了MySQL中的复合查询 文章目录 MySQL复合查询1.子查…

4-云原生监控体系-Grafana-基本使用

1. 介绍 使用Grafana&#xff0c;您可以通过漂亮、灵活的仪表板创建、探索和共享所有数据。查询、可视化、提醒和理解您的数据&#xff0c;无论数据存储在何处。 图片出处&#xff1a; https://grafana.com/grafana/ 官方网站 2. 界面介绍 Connections 可以配置数据源&#x…

【云计算】云数据中心网络(六):私网连接

云数据中心网络&#xff08;六&#xff09;&#xff1a;私网连接 1.什么是私网连接2.私网连接的组成3.私网连接的优势4.私网连接的主要应用场景 前面讲到 VPC 网络具有隔离性&#xff0c;VPC 之间无法通信。当一个 VPC 中的终端需要访问部署在另一个 VPC 中的服务时&#xff0c…

【Git】git命令大全(持续更新)

本文架构 0.描述git简介术语 1.常用命令2. 信息管理新建git库命令更改存在库设置获取当前库信息 3.工作空间相关将工作空间文件添加到缓存区&#xff08;增&#xff09;从工作空间中移除文件&#xff08;删&#xff09;撤销提交 4.远程仓库相关同步远程仓库分支 &#xff08;持…

站立会议和燃尽图01

站立会议和燃尽图01 一、小组情况 组长:李宏威 组员:董泽豪 队名:隐约类名 二、Scrum例会 时间:2024年4月17日 出席人员:李宏威,董泽豪 要求1 工作照片要求2 时间跨度 2024年4月16日 7:00 至 2024年4月16日 7:20 共计 20 分钟 要求3 地点 石家庄铁道大学 要求4 立会内容包…

HarmonyOS开发实例:【分布式手写板】

介绍 本篇Codelab使用设备管理及分布式键值数据库能力&#xff0c;实现多设备之间手写板应用拉起及同步书写内容的功能。操作流程&#xff1a; 设备连接同一无线网络&#xff0c;安装分布式手写板应用。进入应用&#xff0c;点击允许使用多设备协同&#xff0c;点击主页上查询…

java项目实战之图书管理系统(1)

✅作者简介&#xff1a;大家好&#xff0c;我是再无B&#xff5e;U&#xff5e;G&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1.背景 图书管理系统是一种用于管理图书…