首页 > 其他分享 >sax - 解析

sax - 解析

时间:2024-06-13 21:44:37浏览次数:9  
标签:return Element List ret element sax 解析 节点

maven 依赖

    <!-- Xml解析 -->
    <dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.3</version>
        <scope>compile</scope>
    </dependency>

工具类

这些函数是日常开发中比较常用的,一些老旧系统,数据会以 xml 格式返回。

除此之外能用到的,估计就是分析 mybatis 配置文件了,可以实现一些代码解析工作。

下列代码中,转 java 对象的代码的函数,会出现依赖缺失,可以用 java 反射技术完善这些函数。

详见:https://gitee.com/seaboot/commons

import cn.seaboot.commons.core.Converter;
import cn.seaboot.commons.reflect.FieldAccess;
import cn.seaboot.commons.reflect.ObjectField;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

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

/**
 * 包含一些常见的 xml 数据解析
 *
 * @author Mr.css
 * @version 2022-08-24 16:57
 */
public class SaxUtils {

    /**
     * 将文件转换为 ListMap 格式
     * <p>
     * 通常用于简单的数据报文解析,IO 流中只包含格式简单的数据。
     *
     * <root>
     * <person><name>ming</name><age>33</age></person>
     * <person><name>ming</name><age>33</age></person>
     * </root>
     *
     * @param is 输入流
     * @return 数据
     */
    public static List<Map<String, Object>> toListMapByElement(InputStream is) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(is);

        // 获取根节点
        Element root = document.getRootElement();
        return SaxUtils.toListMapByElement(root);
    }

    /**
     * 将文件转换为 ListMap 格式
     * <p>
     * 通常用于简单的数据报文解析,IO 流中只包含格式简单的数据。
     *
     * <root>
     * <person name = "min" age = "33">
     * <person name = "min" age = "33">
     * </root>
     *
     * @param is 输入流
     * @return 数据
     */
    public static List<Map<String, Object>> toListMapByAttribute(InputStream is) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(is);

        // 获取根节点
        Element root = document.getRootElement();
        return SaxUtils.toListMapByAttribute(root);
    }

    /**
     * 将某个节点下的所有子节点转换为 ListMap 格式,数据取自节点的 attribute 属性
     *
     * <list>
     * <person name = "min" age = "33">
     * <person name = "min" age = "33">
     * </list>
     *
     * @param element 节点
     * @return 数据
     */
    public static List<Map<String, Object>> toListMapByAttribute(Element element) {
        List<Element> elements = element.elements();
        List<Map<String, Object>> res = new ArrayList<>(elements.size());
        for (Element ele : elements) {
            res.add(toMapByAttribute(ele));
        }
        return res;
    }


    /**
     * 将某个节点下的所有子节点转换为 ListMap 格式,数据取自节点的 text 属性
     *
     * <list>
     * <person><name>ming</name><age>33</age></person>
     * <person><name>ming</name><age>33</age></person>
     * </list>
     *
     * @param element 节点
     * @return 数据
     */
    public static List<Map<String, Object>> toListMapByElement(Element element) {
        List<Element> elements = element.elements();
        List<Map<String, Object>> res = new ArrayList<>(elements.size());
        for (Element ele : elements) {
            res.add(toMapByElement(ele));
        }
        return res;
    }


    /**
     * 将节点的属性转换为 Map
     *
     * <person name = "min" age = "33">
     *
     * @param element 节点
     * @return ret
     */
    public static Map<String, Object> toMapByAttribute(Element element) {
        Map<String, Object> ret = new HashMap<>();
        List<Attribute> attributes = element.attributes();
        for (Attribute attribute : attributes) {
            ret.put(attribute.getName(), attribute.getValue());
        }
        return ret;
    }


    /**
     * 将某个节点的所有子节点转换为 Map
     *
     * <person><name>ming</name><age>33</age></person>
     *
     * @param element 节点
     * @return ret
     */
    public static Map<String, Object> toMapByElement(Element element) {
        Map<String, Object> ret = new HashMap<>();
        List<Element> list = element.elements();
        for (Element ele : list) {
            ret.put(ele.getName(), ele.getText());
        }
        return ret;
    }


    /**
     * 将某个节点的所有子节点转换为 Map
     *
     * <property name="name">ming</person>
     * <property name="age">33</person>
     *
     * @param element 节点
     * @return ret
     */
    public static Map<String, Object> toMapByProperty(Element element) {
        Map<String, Object> ret = new HashMap<>();
        List<Element> list = element.elements();
        for (Element ele : list) {
            ret.put(ele.attribute("name").getValue(), ele.getText());
        }
        return ret;
    }

    /**
     * 将节点的属性转换为 Object
     *
     * <person name = "min" age = "33">
     *
     * @param element 节点
     * @return ret
     */
    public static <T> T toObjectByAttribute(Element element, Class<T> clazz) {
        FieldAccess access = FieldAccess.create(clazz);
        T ret = access.newInstance();
        List<Attribute> attributes = element.attributes();
        for (Attribute attribute : attributes) {
            ObjectField field = access.getField(attribute.getName());
            field.setValue(ret, Converter.convert(attribute.getValue(), field.getFieldType()));
        }
        return ret;
    }

    /**
     * 将某个节点的所有子节点转换为 Object
     *
     * <person><name>ming</name><age>33</age></person>
     *
     * @param element 节点
     * @return ret
     */
    public static <T> T toObjectByElement(Element element, Class<T> clazz) {
        FieldAccess access = FieldAccess.create(clazz);
        T ret = access.newInstance();
        List<Element> list = element.elements();
        for (Element ele : list) {
            ObjectField field = access.getField(ele.getName());
            field.setValue(ret, Converter.convert(ele.getText(), field.getFieldType()));
        }
        return ret;
    }
}

标签:return,Element,List,ret,element,sax,解析,节点
From: https://www.cnblogs.com/chenss15060100790/p/18246812

相关文章

  • RSS 解析:全球内容分发的利器及使用技巧
    使用RSS可以将最新的网络内容从一个网站分发到全球数千个其他网站。RSS允许快速浏览新闻和更新。RSS文档示例<?xmlversion="1.0"encoding="UTF-8"?><rssversion="2.0"><channel><item></item><item></item></channe......
  • RTMP解析音频AAC
    我们知道AAC如果带ADTS头一般是FFF1或者FFF9,开头的,但是有些网络协议在传输AAC的时候是不带ADTS头的譬如:RTSP传输的媒体流中的AAC是被封装在RTP中的,此时的AAC是不带ADTS头的,而ADTS头里有音频参数信息;所以此时解析音频是依赖RTSP协议的SDP中的音频参数信息解码的;先介绍下AAC的AD......
  • vue代办事件案例实战练习,配有答案解析
    代办事件案例该案例,综合了前面所学的知识,列入点击事件绑定,双向绑定,v-for循环语句,v-model双向绑定,以及input标签的不同type形式。演示代码如下:<template><divid="kuagjia"><div><divclass="top"><spanstyle="margin-left:-700px;">学习计划表......
  • iOS界面设计要点:四大模块解析
    UI设计不是艺术设计,这限制了我们从设备和现有技术开始设计。因此,熟悉每个平台的设计规则已经成为每个设计师的第一课,也是每个设计师必要的专业知识。今天小边给您带来了iOS设计规范,希望帮助您快速熟悉iOS平台设计规范,帮助您提高工作效率,避免设计初期的一些细节错误。iphone15......
  • mysql中group by 的用法解析
    1.groupby的常规用法groupby的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤。假设现有数据库表如下:表user_info,id主键,user_id唯一键CREATETABLE`user_info`(`id`INT(11)NOTNULLAUTO......
  • 【AI原理解析】— Gemma2模型
    目录一、模型概述二、模型设计结构上下文大小参数优化参数规模性能优化开放式模型跨平台兼容性三、技术细节Multi-QueryAttentionRoPEEmbeddingsGeGLUActivationsNormalizerLocation模型结构训练数据优化方法四、训练与优化训练硬件训练策略模型评估......
  • AlertManager解析:构建高效告警系统
    本文深入探讨了AlertManager的技术细节和实际应用,从基本概念、核心组件、工作流程,到与Prometheus的集成和实战案例,旨在为专业人士提供一个全面的AlertManager技术和应用指南。关注作者,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、......
  • 利用Wireshark抓包分析DNS域名解析过程
    一、DNS协议概述  DNS协议也可以称为DNS服务,全称是DomainNameSystem,即域名系统,和HTTP协议一样,也是一个位于应用层的协议(服务),它是基于运输层的UDP协议的。从DNS的名字我们就可以知道,它提供域名映射到IP地址的服务。二、实验目的掌握DNS域名解析过程熟悉DNS报文格式三......
  • AudioFlinger构造函数解析
    AudioFlinger::AudioFlinger():mMediaLogNotifier(newAudioFlinger::MediaLogNotifier()),mPrimaryHardwareDev(NULL),mAudioHwDevs(NULL),mHardwareStatus(AUDIO_HW_IDLE),mMasterVolume(1.0f),mMasterMute(false),//mNex......
  • 从源码到市场:数字人技术源头厂商全解析
    随着数字人直播的热度持续上涨,应用场景日益丰富,数字人系统OEM源码(源码部署:ai6ai69)模式作为最常见的入局方式之一,备受瞩目。本文将深入探讨数字人技术源头厂商的技术原理和应用优势,以及如何选择合适的数字人源码公司。一、数字人技术原理数字人技术基于人工智能和计算机图形......