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认证校验成功后,返回的用户信息数据 resultXml
        String 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);

        /*
        // 设置响应内容类型为 XML
        response.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”。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

人工智能与伦理:我们应该如何平衡科技与人性?

内容概要 在这个瞬息万变的时代&#xff0c;人工智能的迅猛发展让我们面对前所未有的伦理困境。科技进步带来了便利&#xff0c;但同时也亟需我们反思如何对待人性。尤其是在实现算法透明性时&#xff0c;我们要确保每一个决策背后都能被理解与追溯&#xff0c;这不仅是对技术…

electron展示下载进度条

我们使用electron下载文件时&#xff0c;会发现不像浏览器一样会有地方展示下载进度&#xff0c;这导致下载一些大文件时不知道下载进度到哪里了 下面我们通过electron提供的will-download监听和element-plus中的ElNotification和ElProgress组件实现这一功能 实现逻辑 触发…

【算法】(Python)回溯算法

回溯算法&#xff1a; 回溯算法是一种算法思想。采用“深度优先搜索&#xff08;dfs&#xff0c;depth first search&#xff09;”。采用“尝试”和“回溯”的策略。尝试搜索所有可能的解决方案&#xff0c;遇到不满足条件的撤销选择、回退到回溯点&#xff08;满足回溯条件的…

音视频入门基础:FLV专题(18)——Audio Tag简介

一、引言 根据《video_file_format_spec_v10_1.pdf》第75页&#xff0c;如果某个Tag的Tag header中的TagType值为8&#xff0c;表示该Tag为Audio Tag&#xff1a; 这时StreamID之后紧接着的就是AudioTagHeader&#xff0c;也就是说这时Tag header之后的就是AudioTagHeader&…

探索Python终端美化的终极利器:Rich库

文章目录 &#x1f680; 探索Python终端美化的终极利器&#xff1a;Rich库第一部分&#xff1a;背景介绍第二部分&#xff1a;Rich库是什么&#xff1f;第三部分&#xff1a;如何安装Rich库&#xff1f;第四部分&#xff1a;Rich库的简单函数使用方法第五部分&#xff1a;结合场…

【Java笔记】1-JDK/JRE/JVM是个啥?

JDK、JRE、JVM可以说是入门必须了解的三个词汇 先说全称 JDK&#xff1a;Java Development Kit&#xff0c;Java开发工具包 JRE&#xff1a;Java Runtime Environment&#xff0c;Java运行环境 JVM&#xff1a;Java Virtual Machine&#xff0c;Java虚拟机 再说关系 JVM⊆J…

视觉目标检测标注xml格式文件解析可视化 - python 实现

视觉目标检测任务&#xff0c;通常用 labelimage标注&#xff0c;对应的标注文件为xml。 该示例来源于开源项目&#xff1a;https://gitcode.com/DataBall/DataBall-detections-100s/overview 读取 xml 标注文件&#xff0c;并进行可视化示例如下&#xff1a; #-*-coding:ut…

金和OA-C6 ApproveRemindSetExec.aspx XXE漏洞复现(CNVD-2024-40568)

0x01 产品描述&#xff1a; 金和C6协同管理平台是以"精确管理思想"为灵魂&#xff0c;围绕“企业协同四层次理论”模型&#xff0c;并紧紧抓住现代企业管理的六个核心要素&#xff1a;文化 Culture、 沟通Communication 、 协作Collaboration 、创新 Creation、 控制…

ETL集成工具丨如何运用ETLCloud单步调试断点功能

在现代数据处理领域&#xff0c;ETLCloud 的单步调试断点功能正成为数据管理的重要工具。ETLCloud 是一个强大的云端数据处理平台&#xff0c;它提供了灵活的单步调试功能&#xff0c;使得用户能够逐步跟踪和分析数据处理流程。本文将探讨如何运用 ETLCloud 的单步调试断点功能…

GB/T 28046.2-2019 道路车辆 电气及电子设备的环境条件和试验 第2部分:电气负荷(3)

写在前面 本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T 28046标准的相关知识&#xff0c;希望能帮助更多的同学认识和了解GB/T 28046标准。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) 第2部分&#xff1a;电气负荷 4.9 抛负载…

开源陪玩系统平台源码-支持游戏线上陪玩家政线下预约等多场景应用支持H5+小程序+APP

陪玩平台的流行可以归因于多个因素&#xff0c;包括现代生活的快节奏和压力、电竞行业的带动、孤独经济的兴起&#xff0c;以及技术的进步等。这些因素共同推动了陪玩平台的发展&#xff0c;使其成为人们寻求社交互动和休闲娱乐的重要途径。 现代生活的快节奏和压力 现代生活…

1:基本电路专题:R(电阻)的介绍

说实话这个其实我不想写的&#xff0c;因为这个是初中的知识&#xff0c;并没有很难&#xff0c;但是为了保持整齐性&#xff0c;我还是写了一下关于这个的知识点。是电子学中三大基本无源元件之一。&#xff08;R&#xff08;电阻&#xff09;,L&#xff08;电感&#xff09;,…

解决注册Kaggle出现的“Captcha must be filled out”问题

首先&#xff0c;出现这个问题后&#xff0c;就搜索了一下别的博主的方法。 使用header editor 插件 首先&#xff0c;下载扩建&#xff1a; 然后进行重定向&#xff1a; 管理之后&#xff0c;输入下面的地址&#xff0c;然后下载-保存&#xff1a; 但是&#xff0c;这条显然…

大模型面试题持续更新_Moe(2024-10-30)

扫一扫下方&#xff0c;获取更多面试真题的集合 Moe和集成学习方法有什么异同&#xff1f; MoE和集成学习的思想异曲同工&#xff0c;都是集成了多个模型的方法&#xff0c;Moe主要是将预测任务分为多个子任务&#xff0c;然后通过路由网络的形式决定对于当前的数据该使用哪个…

Vue-$el属性

原博客地址&#xff1a;深入 Vue.js 的心脏&#xff1a;全面剖析 $el 属性_vue $el-CSDN博客 目录 1 $el是什么 1.1 $el本质 1.2 访问$el时机 1.3 $el与模板的关系 2 $el使用场景 2.1 集成第三方库 2.2 操作DOM元素样式 2.3 处理焦点和事件 2.4 实现自定义指令 3 $e…

小满OKKICRM与钉钉数据集成方案解析

小满-宜搭产品同步&#xff1a;小满OKKICRM数据集成到钉钉的技术实现 在企业信息化建设中&#xff0c;系统间的数据集成是提升业务效率和数据一致性的关键环节。本文将聚焦于“小满-宜搭产品同步”方案&#xff0c;详细探讨如何将小满OKKICRM的数据高效、可靠地集成到钉钉平台…

【prefect】Prefect二:python任务调度工具 Prefect 基础使用教程 | work pool | Deployment | flow

一、Work Pool 1、什么是 Work Pool 白话解释&#xff1a;集中管理部署脚本的开关 Work pools allow you to switch between different types of infrastructure and to create a template for deployments. Data platform teams find work pools especially useful for mana…

蓝海创意云入选中国夏衍电影学会工业与科技影视专业委员会成员单位

党的二十届三中全会指出&#xff0c;科技自立自强是中国式现代化的有力保障。科技兴则民族兴&#xff0c;科技强则国家强。为深入的贯彻落实这一重要部署&#xff0c;推动工业与科技领域的融合发展充分发挥电影艺术在传播科技创新精神、展现工业发展成就方面的独特作用&#xf…

基于SpringBoot的“CSGO赛事管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“CSGO赛事管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统首页界面图 赛事信息界面图 赛事通知界面…

WPF+MVVM案例实战(十三)- 封装一个自定义消息弹窗控件(上)

文章目录 1、案例效果2、功能实现1、创建文件2、资源文件获取3、枚举实现3、弹窗实现1、界面样式实现2、功能代码实现4、总结1、案例效果 2、功能实现 1、创建文件 打开 Wpf_Examples 项目,我们在用户控件类库中创建一个窗体文件 SMessageBox.xaml,同时创建枚举文件夹 Enum…