XML解析小坑记录[正则表达式解析]

一、问题描述

在做 SSO 单点登录时( 认证中为CAS服务对接 )。在完成对用户ticket票根校验后,返回了用户信息有关 XML 数据片段,例如下:

<cas:serviceResponse xmlns:cas="http://www.xxx.xx/xx/cas"><cas:authenticationSuccess><cas:user>200161</cas:user><cas:username>张三</cas:username><cas:usertype>TEACHER</cas:usertype></cas:authenticationSuccess>
</cas:serviceResponse>

获取到CAS 认证中心返回的数据后,通过 Java中的 PatternMatcher 对象来获取XML 中的数据!

Pattern 和 Matcher 是用于处理正则表达式的两个主要类。

它们的主要作用和用途如下:

  1. Pattern 类
  • 作用:Pattern类是用于编译正则表达式的类。它代表一个编译后的正则表达式,可以对输入的字符串执行匹配操作。
  • 创建:通过调用静态方法 Pattern.compile() 来创建 Pattern 对象,并传入需要的正则表达式作为参数。
  1. Matcher 类
  • 作用:Matcher 类是对输入字符串进行匹配和搜索的类。它与 Pattern 对象一起使用,用于执行匹配操作。
  • 创建:通过调用 Pattern 对象的 matcher 方法创建 Matcher 对象,并传入需要匹配的字符串。
// 解析XML数据,获取指定信息
Pattern pt = Pattern.compile("<cas:user>(.*)</cas:user>");
Matcher matcher = pt.matcher(resultXml);
while (matcher.find()){group0 = matcher.group(0).trim();group1 = matcher.group(1).trim();
}

​ 上面通过 Pattern 和 **Matcher **来解析出用户信息,但是使用到了 matcher.group(0) 获取的用户信息! 导致后续操作(我的后续操作是拿到的用户信息进行特定的加密后封装一个重定向路径)中使用获取到的用户信息一直失败,也没找到原因!!

  • 后面找到问题所在:使用 group(n) 方法获取匹配的内容:group(0) 返回整个匹配的部分,group(1) 返回第一个括号内的内容 !

这里至于为什么没有发现 通过 matcher.group(0) 和 matcher.group(1) 获取到的值不一样! 是因为我将这两值都直接返回到视图中渲染了,但在视图中展示的内容 他们是一样的!!

二、复现坑

controller 层代码:

package com.example.gsxy_sso_u8cloud.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @ClassName : XmlBugController* @Description : 测试解析XML文件时出现的坑!* @Author : AD*/@RestController
@RequestMapping("/xmlbug")
public class XmlBugController {/*** Description: 模拟解析XML文件的接口*  通过 group(0) / group(1)  对比从XML数据中提取的值!** @param* @return java.lang.String* @date 2024-10-24*/@GetMapping("/getXmlInfo")public String getXmlInfo(HttpServletRequest request, HttpServletResponse response) throws IOException {// 模拟Cas认证校验成功后,返回的用户信息数据 resultXmlString resultXml = "<cas:serviceResponse xmlns:cas=\"http://www.xxx.xxx/xx/cas\"> "+" <cas:authenticationSuccess> "+" <cas:user>200161</cas:user> "+" <cas:username>张三</cas:username> "+" <cas:usertype>TEACHER</cas:usertype> "+" </cas:authenticationSuccess> "+" </cas:serviceResponse> ";/*** 定于两个接收解析数据的对象 分别接收 group(0) 和 group(1)* */String group0 = "";String group1 = "";// 解析XML数据,获取指定信息Pattern pt = Pattern.compile("<cas:user>(.*)</cas:user>");Matcher matcher = pt.matcher(resultXml);while (matcher.find()){group0 = matcher.group(0).trim();group1 = matcher.group(1).trim();}System.out.println("从XML中解析出来的 group0 = " + group0);System.out.println("从XML中解析出来的 group1 = " + group1);/*// 设置响应内容类型为 XMLresponse.setContentType("application/xml;charset=UTF-8");// 创建 XML 内容String xmlContent = "<cas:user>200161</cas:user>";// 输出 XML 内容response.getWriter().write(xmlContent);*/return "group0 = "+ group0+" \t\n"+"group1 = "+ group1+" \t\n";}
}

访问controller 接口查看响应数据:

可以看出在浏览器中渲染出来的数据,显式的结果是一样的!!!~~ 所以这里就导致我没发现端倪( 因为远程服务器的配置特殊 )!!!

但是我们可以通过 页面元素 和 网络响应中看出他们的不同之处!

  • 页面元素:

  • 网络响应:

为什么是使用 group(1) 而不是 group(0) 呢?

在使用正则表达式时,group(0) 和 group(1) 的含义是不同的:

  1. group(0):

○ 返回整个匹配的字符串。这是正则表达式匹配结果的完整文本,包括所有的匹配内容。

○ 在你的例子中,group(0) 将返回整个匹配的内容,例如:“cas:user200161</cas:user>”。

  1. group(1):

○ 返回第一个捕获组中的内容。当你在正则表达式中使用括号 () 来创建捕获组时,你可以通过 group(1) 访问第一个捕获组所匹配的内容。

○ 在你的例子中,group(1) 将返回被 cas:user 标签包围的内容,即实际的用户 ID,例如 “200161”。

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

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

相关文章

ffmpeg视频滤镜:网格-drawgrid

滤镜介绍 drawgrid 官网链接 》 FFmpeg Filters Documentation drawgrid会在视频上画一个网格。 滤镜使用 参数 x <string> ..FV.....T. set horizontal offset (default "0")y <string> ..FV.....T. set…

(50)MATLAB最优延迟迫零均衡器仿真测试与评估

文章目录 前言一、最优延迟迫零均衡器评估模型二、最优延迟迫零均衡器仿真代码1.代码如下&#xff1a;2.迫零均衡器函数zf_equalizer()的MATLAB源码 三、仿真结果画图1.不同权系数长度和延迟的迫零均衡器性能2. 不同权系数长度的迫零均衡器的最佳延迟 前言 对于预设均衡器延时…

用AI绘画工具提升创作效率,这款神器你一定不能错过!

在如今的创作领域&#xff0c;无论是插画师、设计师&#xff0c;还是内容创作者&#xff0c;都在寻找能够提升效率的工具&#xff0c;而AI绘画工具的诞生无疑是一场创意革命。通过AI技术的支持&#xff0c;我们不再需要耗费大量时间在绘制基础草图或反复调整细节上&#xff0c;…

为什么要使用Golang以及如何入门

什么是golang&#xff1f; Go是一种开放源代码的编程语言&#xff0c;于2009年首次发布&#xff0c;由Google的Rob Pike&#xff0c;Robert Griesemer和Ken Thompson开发。基于C的语法&#xff0c;它进行了一些更改和改进&#xff0c;以安全地管理内存使用&#xff0c;管理对象…

Oracle故障诊断(一线DBA必备技能)之ADRCI(四)

1. 题记&#xff1a; 本篇博文继续详细介绍一线DBA必备技能—Oracle DB故障诊断工具ADRCI。 2. 使用 ADRCI 进行故障诊断的步骤 1. 查看警报日志 警报日志是故障诊断的重要信息源&#xff0c;它记录了数据库启动、关闭、错误消息等关键事件。 首先启动 ADRCI。在操作系统命…

基于SpringBoot的项目工时统计成本核算管理源码带教程

该系统是基于若依前后端分离的架构&#xff0c;前端使用vue2&#xff0c;后端使用SpringBoot2。 技术框架&#xff1a;SpringBoot2.0.0 Mybatis1.3.2 Shiro swagger-ui jpa lombok Vue2 Mysql5.7 运行环境&#xff1a;jdk8 IntelliJ IDEA maven 宝塔面板 系统与功…

嵌入式学习-网络-Day04

嵌入式学习-网络-Day04 1.IO多路复用 1.1poll poll同时检测键盘和鼠标事件 1.2epoll 2.服务器模型 2.1循环服务器模型 2.2并发服务器模型 多进程模型 多线程模型 IO多路复用模型 网络聊天室 项目要求 问题思考 程序流程图 1.IO多路复用 1.1poll int poll(struct pollfd *fds, n…

Java 面向对象基础

目录 1. 面向对象2. 类与对象3. 面向对象在内存中的执行原理4. 类和对象注意事项5. this 关键字6. 构造器6.1 什么是构造器?6.2 构造器作用6.3 构造器应用场景 7. 封装性7.1 什么是封装&#xff1f;7.2 封装的设计规范7.3 封装的书写 8. 实体JavaBean 正文开始 1. 面向对象 …

《华为云主机:1024的惊喜馈赠》

《华为云主机&#xff1a;1024的惊喜馈赠》 一、1024 华为送云主机之缘起&#xff08;一&#xff09;特殊日子的馈赠意义&#xff08;二&#xff09;华为云主机活动初衷 二、华为云主机领取攻略&#xff08;一&#xff09;领取条件全解析&#xff08;二&#xff09;具体领取步骤…

第10章 自定义控件

第 10 章 自定义控件 bilibili学习地址 github代码地址 本章介绍App开发中的一些自定义控件技术&#xff0c;主要包括&#xff1a;视图是如何从无到有构建出来的、如何改造已有的控件变出新控件、如何通过持续绘制实现简单动画。然后结合本章所学的知识&#xff0c;演示了一个…

开始使用HBuilderX开发网页

1 给我一个用hbuilderx的理由 首先看一个截图&#xff1a; 现在技术更新太快了&#xff0c;大家伙儿也都用windows10甚至了11了&#xff0c;而我们还在使用熟悉的windows7&#xff0c;这对于编程桌面端没问题的&#xff0c;但是网络编程真实够费劲的了&#xff0c;或者用pytho…

ffmpeg视频滤镜:添加边框-drawbox

滤镜介绍 drawbox 官网链接 > FFmpeg Filters Documentation 这个滤镜会给视频添加一个边框。 滤镜使用 参数 x <string> ..FV.....T. set horizontal position of the left box edge (default "0")y <string&…

单向数据流在 React 中的作用

文章目录 单向数据流在 React 中的作用什么是单向数据流&#xff1f;单向数据流的优势如何实现单向数据流1. 父组件传递 props2. 状态提升 结论 单向数据流在 React 中的作用 什么是单向数据流&#xff1f; 单向数据流是指数据在应用程序中只按照一个方向流动。在 React 中&a…

uniapp学习(008-2 图片模块和分享模块)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第93p-第p103的内容 文章目录 详情页图片问题storage缓存图片网络消耗问题使用计算属性获取详细信息 保存壁纸到…

双十一宠物空气净化器决胜局,希喂、安德迈哪款性价比更高?

秋天到了&#xff0c;新一轮的猫咪换毛季又来了。尽管每天下班很累&#xff0c;但也不得不花上不少时间清理。有时候想偷懒&#xff0c;但身体是第一个反对的。要知道&#xff0c;长期堆积的猫毛除了会破坏家中的干净整洁外&#xff0c;浮毛还会随呼吸进入我们体内&#xff0c;…

工程项目智能化管理平台,SpringBoot框架智慧工地源码,实现工程建设施工可视化、智能化的全过程闭环管理。

智慧工地管理系统的建设以“1个可扩展性平台2个应用端3方数据融合N个智能设备”为原则。以“智、保、安、全”为导向&#xff0c;与工程建设管理信息系统、综合安防平台深度集成&#xff0c;构建统一的标准化工地平台&#xff0c;实现现场人员、车辆、项目、安全、进度等方面的…

springboot 自定义错误页面

自定义错误页面 背景&#xff1a;当我们访问应用程序不存在的接口路径或者参数传递不规范时&#xff0c;springboot 默认提示 如下页面 该页面对用户不友好&#xff0c;我们可以自定义展示错误页来改善。 优化后的简洁效果&#xff0c;可对 html 页面进一步美化&#xff0c;…

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能

文章目录 一、RabbitMq 下载安装二、开发步骤&#xff1a;1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网&#xff1a;https://www.rabbitmq.com/docs 二、开发步骤&#xff1a;…

低代码统一待办:提升任务管理效率的新模式

低代码平台的魔力 低代码平台通过图形化用户界面和简化开发流程&#xff0c;让用户无需具备深厚的编程知识也能快速构建应用程序。这种技术不仅加速了应用开发速度&#xff0c;还大幅降低了开发成本和复杂度&#xff0c;适合各种规模的企业。 构建统一待办系统的优势 集中化管…

itertools模块的combinations很牛

在 Python 中&#xff0c;combinations 是 itertools 模块提供的一个非常有用的函数&#xff0c;用于生成给定序列的所有可能的组合&#xff08;不考虑顺序&#xff09;。combinations 函数可以生成从长度为 r 的所有子集&#xff0c;其中 r 是一个指定的正整数&#xff0c;表示…