告别996-SAXReader读取xml配置文件

article/2025/10/11 8:10:09

在公司某一模块开发中,可以获取全部字段,但是需要取出某些不需要的字段,于是采取动态方法结合xml,将不需要的字段写在xml里面.或者根据下拉框中的值动态的获取某一个筛选条件集合sql筛选出需要的条件

前提准备

文件名:xxxxxxx.xml

<?xml version="1.0" encoding="UTF-8"?>
<events><alter-table><column string="255" number="bigint" ip="26"/></alter-table><index-fields><field name="DEVID" display="设备ID"/><field name="DEVIP" display="设备IP"/><field name="RESOURCEID" display="资源ID"/><field name="ALTERGROUP" display="告警分组名称"/></index-fields><noAssign-fields><field name="EVENTID"/><field name="DEVIP"/><field name="KPI"/><field name="TYPE"/></noAssign-fields><!--快速过滤--><filters><param id="11" text="全部"><where><![CDATA[ and TENANTID = 11]]></where></param><param id="12" text="确认"><where><![CDATA[ and TENANTID = 12]]></where></param><param id="13" text="未确认"><where><![CDATA[ and TENANTID = 13]]></where></param><param id="14" text="处于维护期"><where><![CDATA[ and TENANTID = 14]]></where></param><param id="15" text="未处于维护期"><where><![CDATA[ and TENANTID = 15]]></where></param><param id="16" text="最近1小时"><where><![CDATA[ and TENANTID = 16]]></where></param><param id="17" text="最近4小时"><where><![CDATA[ and TENANTID = 17]]></where></param><param id="18" text="最近8小时"><where><![CDATA[ and TENANTID = 18]]></where></param></filters><dataType-groups><!--数据类型分组--><!--与基础信息保持一致,例如:1.字符串,2.数字,100.日期类型,110.IP--><dataType-group type="1"><groupItems size="500"></groupItems><!--不参与聚合的字段--><unableFields><field name="EVENTID"/><field name="OPTLOG"/><field name="SUMMARY"/><field name="FALUTIMPACT"/></unableFields></dataType-group><dataType-group type="2"><groupItems size="500"></groupItems><!--不参与聚合的字段--><unableFields><field name="DEVID"/><field name="TALLY"/></unableFields></dataType-group><dataType-group type="100"><groupItems><item name="最近1小时"><content><![CDATA[AND TIMESTAMPDOFF(SEDCOND,%S,NOW()) <= (1*60*60)]]></content></item><item name="最近4小时"><content><![CDATA[AND TIMESTAMPDOFF(SEDCOND,%S,NOW()) <= (4*60*60)]]></content></item><item name="最近8小时"><content><![CDATA[AND TIMESTAMPDOFF(SEDCOND,%S,NOW()) <= (8*60*60)]]></content></item></groupItems><!--不参与聚合的字段--><unableFields><field name="DEVID"/><field name="TALLY"/></unableFields></dataType-group><dataType-group type="110"><!--不参与聚合的字段--><groupItems></groupItems><unableFields><field name="DEVID"/><field name="TALLY"/></unableFields></dataType-group></dataType-groups>
</events>

结合filters及完整代码实例分析流程流程

public class EventConfiguration{private  List<FilterData>        filterDatas;private static EventConfiguration _instance  =  null;private int                            stringFieldLength    = 255;private String                         numberFieldType    ="bigint";private int                            ipFieldLength       =255;private Map<String,String>             indexField;private Set<String>                    noAssignFields;private List<EvtDataTypeGroupEntity>   evtDataTypeGroups;public EventConfiguration() {}/*** 获取事件配置的实例* @return 事件配置的实例*/public static final EventConfiguration getInstance(){if (_instance == null){synchronized (EventConfiguration.class){if (_instance == null){_instance = new EventConfiguration();_instance.loadXML();}}}return _instance;}public void loadXML() {//创建SAXReader对象SAXReader reader = new SAXReader();Document doc = null;try {//读取配置文件doc = reader.read(new File("C:\\Users\\Ausware01\\Desktop\\spring-course\\spring-beanInjection\\src\\main\\resources\\iSmartOne-events.xml"));} catch (DocumentException e) {e.printStackTrace();}/***      * 为什么能将Node转为Element:  interface Element extends Branch extends Node 父类转        * 为子类**/Element column = (Element) doc.selectSingleNode("events/alter-table/column");Element indexFields = (Element) doc.selectSingleNode("events/index-fields");Element nodeAssingFields = (Element) doc.selectSingleNode("events/noAssign-fields");//读取的内容见下面图形1Element filters = (Element) doc.selectSingleNode("events/filters");Element dataTypeGroups = (Element) doc.selectSingleNode("events/dataType-groups");parseFilters(filters);parseColumn(column);parseIndexFields(indexFields);parseNodeAssingFields(nodeAssingFields);parseDataTypeGroups(dataTypeGroups);}private void parseDataTypeGroups(Element dataTypeGroups) {evtDataTypeGroups = new ArrayList<>();List<Element> elements = dataTypeGroups.elements("dataType-group");System.out.println(elements);elements.forEach( ele ->{EvtDataTypeGroupEntity evtDataTypeGroupEntity = new EvtDataTypeGroupEntity();//获取Type属性if (org.apache.commons.lang3.StringUtils.isNumeric(ele.attributeValue("type"))) {evtDataTypeGroupEntity.setType(ele.attributeValue("type"));}//获取size属性Element groupItems = ele.element("groupItems");if (org.apache.commons.lang3.StringUtils.isNumeric(groupItems.attributeValue("size"))) {evtDataTypeGroupEntity.setSize(Integer.valueOf(groupItems.attributeValue("size")));}//获取item属性List<Element> items = groupItems.elements("item");if (!ObjectUtils.isEmpty(items)) {ArrayList<Map<String, String>> gorupItems = new ArrayList<>();items.forEach(item ->{HashMap<String, String> map = new HashMap<>();String name = item.attributeValue("name");map.put("name",name);Node content = item.selectSingleNode("content");if (content == null){map.put("content", org.apache.commons.lang3.StringUtils.EMPTY);}else {String textTrim = ((Element) content).getTextTrim();map.put("content",textTrim);}gorupItems.add(map);});evtDataTypeGroupEntity.setGroupItems(gorupItems);}//获取unableFields属性Element unableField = ele.element("unableFields");List<Element> unableFields = unableField.elements("field");if (!ObjectUtils.isEmpty(unableFields)){List<String> unableList = new ArrayList<>();unableFields.forEach(item ->{String name = item.attributeValue("name");unableList.add(name);});evtDataTypeGroupEntity.setUnableFields(unableList);}evtDataTypeGroups.add(evtDataTypeGroupEntity);});}private void parseNodeAssingFields(Element nodeAssingFields) {List<Element> elements = nodeAssingFields.elements("field");noAssignFields = new HashSet<>();elements.forEach(item->{noAssignFields.add(item.attributeValue("name"));});}private void parseIndexFields(Element indexFields) {List<Element> elements = indexFields.elements("field");indexField = new HashMap<>();for (Element element : elements) {String name = element.attributeValue("name");String value = element.attributeValue("value");indexField.put(name,value);}}private void parseColumn(Element column) {stringFieldLength = Integer.parseInt(column.attributeValue("string"));numberFieldType = column.attributeValue("number");ipFieldLength = Integer.parseInt(column.attributeValue("ip"));}public void parseFilters(Element filters){//读取的内容见下面的图形2List<Element> params = filters.elements("param");filterDatas = new ArrayList<>();params.forEach(element->{Node whereNode = element.selectSingleNode("where");filterDatas.add(new FilterData(element.attributeValue("id"), //读取的内容见下面的图形3
element.attributeValue("text"), ((Element)whereNode).getTextTrim()));});}public String getWhereStringById(String id){if (StringUtils.isEmpty(id)){return new String("");}return filterDatas.parallelStream().filter(f -> id.equals(f.getId())).findAny().orElseGet(FilterData::new).getWhere();}public List<FilterData> getFilterDatas() {return filterDatas;}public void setFilterDatas(List<FilterData> filterDatas) {this.filterDatas = filterDatas;}public Map<String, String> getIndexField() {return indexField;}public void setIndexField(Map<String, String> indexField) {this.indexField = indexField;}public int getStringFieldLength() {return stringFieldLength;}public void setStringFieldLength(int stringFieldLength) {this.stringFieldLength = stringFieldLength;}public String getNumberFieldType() {return numberFieldType;}public void setNumberFieldType(String numberFieldType) {this.numberFieldType = numberFieldType;}public int getIpFieldLength() {return ipFieldLength;}public void setIpFieldLength(int ipFieldLength) {this.ipFieldLength = ipFieldLength;}public Set<String> getNoAssignFields() {return noAssignFields;}public void setNoAssignFields(Set<String> noAssignFields) {this.noAssignFields = noAssignFields;}public List<EvtDataTypeGroupEntity> getEvtDataTypeGroups() {return evtDataTypeGroups;}public void setEvtDataTypeGroups(List<EvtDataTypeGroupEntity> evtDataTypeGroups) {this.evtDataTypeGroups = evtDataTypeGroups;}
}
  •  图形1:

  •  图形2

  •   图形3

 

 


http://chatgpt.dhexx.cn/article/9Q0aE6a9.shtml

相关文章

Java 应用SAXReader 解析网络地址 XML

xml格式&#xff1a; 依赖于dom4j 框架自带该依赖包springboot框架中 工具类如下&#xff1a; import com.alibaba.fastjson.JSONObject; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader;import java.net.URL;/*** SAXReader 解析 xml 工…

XML学习总结(三)——SAXReader解析xml文件数据

第一种方式&#xff1a; 1. 加入jar包 注意 1.1 xml文件解析时编码要一致&#xff08;默认UTF-8&#xff09;&#xff0c;出现报错可以在记事本中另存为来更改编码格式。 2.2 jar包两个都需要。 2.gao.xml数据如下&#xff1a; <?xml version"1.0" encoding&qu…

SAXReader解析xml

SAXReader解析xml文件 要使用SAXReader解析xml文件&#xff0c;就需要导入两个架包&#xff1a;版本自己选择。 &#xff08;1&#xff09;dom4j-1.6.1.jar dom4j下载地址 &#xff08;2&#xff09;jaxen-1.1-beta-6.jar jaxen下载地址 项目的搭建如下&#xff1a; 项目的配置…

SAXReader的使用

一&#xff1a;导入依赖 <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version> </dependency>假设xml文件内容如下 <?xml version"1.0" encoding"utf-8"?…

SAXReader解析xml文件

dom4j是Java的XML API&#xff0c;作用是读写XML文件 第1步&#xff1a;导入maven依赖 <!--测试SaxReader解析xml文件--> <dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version> &l…

AWS 创建 pem 文件

创建后会根据你输入的名字创建一个pem文件&#xff0c;并根据提示下载到本地&#xff0c;然后上传到 Linux 服务器上&#xff0c; 用 pscp 命令&#xff1a; 1. 下载 pscp.exe, 存放在 windows/system32 目录下, 下载地址&#xff1a;https://www.chiark.greenend.org.uk/~sgta…

openssl cer文件转pem文件

在windows机器上安装openssl工具&#xff0c;如果已经安装Loadrunner工具&#xff0c;则可以直接使用。因为在Loadrunner的安装目录bin下&#xff0c;已经有openssl工具直接点击运行即可 如果没装LR,在windows中&#xff0c;点击【开始】&#xff0c;在输入框输入【cmd】&#…

使用pem文件进行ssh登录

一、简介 在这篇文章中,我们将详细的介绍如何使用pem文件实现ssh登录。 ssh作为基础服务,与我们每天的工作息息相关,其登录方式也多种多样,在这篇文章中我们将讲解安全性比较高的pem登录方式如何配置。 从ssh客户端来看,大致可以分为windows客户端,比如Putty,SecureC…

使用Java代码生成RSA公私钥的.pem文件

大家好&#xff0c;我是神韵&#xff0c;是一个技术&生活博主。出文章目的主要是两个&#xff0c;一是好记忆不如烂笔头&#xff0c;记录总结中提高自己。二是希望我的文章可以帮到大家。欢迎大家留言讨论&#xff0c;你们的行动将是我无限的动力。 本篇主题是&#xff1a;…

妙借Git自带的OpenSSL生成RSA公私钥的.pem 文件

大家好&#xff0c;我是神韵&#xff0c;是一个技术&生活博主。出文章目的主要是两个&#xff0c;一是好记忆不如烂笔头&#xff0c;记录总结中提高自己。二是希望我的文章可以帮到大家。欢迎来点赞打卡&#xff0c;你们的行动将是我无限的动力。 本篇主题是&#xff1a;妙…

Windows Terminal 使用 pem 文件连接服务器

示例: ssh -i C:\Users\dev\key.pem root18.18.18.18

linux ssh pem 登陆,Linux 生成pem文件 用于免密登录

1.在远程机器生成.pem文件 生成密钥对&#xff1a; $ ssh-keygen -t rsa -b 2048 -v 直接确认下一步 查看生成的密钥对&#xff1a; $ ls ~/.ssh/ 将私钥重命名至id_rsa.pem&#xff1a; $ mv ~/.ssh/id_rsa ~/.ssh/id_rsa.pem 修改~/.ssh/目录权限&#xff1a; $ chmod 700 ~/…

vscode 使用pem文件免密连接服务器

操作步骤和vscode 配置免密连接服务器很相似&#xff0c;不过使用的是 pem 文件。步骤如下&#xff1a; 将 pem 文件放在 ~/.ssh/ 文件夹下&#xff08;可选&#xff09;&#xff1b; 配置 ~/.ssh/config &#xff0c;填写需要连接的主机信息&#xff1a; Host my_server_name…

php生成pem文件怎么打开,iOS推送证书生成pem文件(详细步骤)

1、pem文件概述 pem文件是服务器向苹果服务器做推送时候需要的文件&#xff0c;主要是给php向苹果服务器验证时使用&#xff0c;下面介绍一下pem文件的生成。 2、生成pem文件步骤 1、打开钥匙串&#xff0c;选择需要生成的推送证书 选择相应证书 2、将Certificate和Private key…

从openssl rsa pem文件中提取公私钥数据实现

RSA为非对称加密算法&#xff0c;关于其介绍可以参考&#xff1a;https://blog.csdn.net/fengbingchun/article/details/43638013。 OpenSSL最新版为 1.1.1g&#xff0c;在Windows上和Linux上编译源码时均可以生成可执行文件openssl。通过此执行文件即可产生rsa公钥-私钥对&am…

搞懂 PEM、ANS、PFX、P12、p8、CER、X509 等证书相关文件格式 后缀

文章目录 结论ASN.1PEM.pfx介绍应用 .p12.p8.cer.crtX.509参考 http证书相关的文件格式、编码、概念比较偏多。这里对文件的各种文件后缀和格式做了统一的整理和解释说明 我在国密实验室申请下载了一个证书&#xff0c;解压后如下图&#xff0c;起初我是比较懵的&#xff0c;各…

vs2017下载

1.官网下载 由于网络日益发达&#xff0c;我相信大家可以从各种渠道得到下载地址&#xff0c;vs2017已与之前版本不同的是已经采用了下载器下载&#xff0c;下面是我使用的下载地址 Visual Studio 较旧的下载 - 2017、2015 和以前的版本 进入登录即可获得下载地址&#xff0c…

Visual Studio 2015官方社区版/专业版/专业版下载地址

Visual Studio 2015官方社区版/专业版/专业版下载地址 以下 Visual Studio 2015 社区版/专业版/专业版资源都是官方MSDN原版下载资源&#xff0c;统一为ISO格式镜像&#xff0c;使用解压软件解压之后点击主程序安装即可。 Visual Studio 2015 官方简体中文专业版ISO镜像下载地址…

vs2017支持所有版本VC

版权归属&#xff1a; https://blog.csdn.net/halchanchanhaloutlook.com 更多关注&#xff1a; https://github.com/chanhalhttps://www.zhihu.com/people/chanhal 前言 研究目标&#xff1a;VS2017作为目前最新的IDE&#xff0c;让其支持所有版本的VC编译环境 必要性&am…

VS2017社区版Community 许可证过期解决方法

之前过期可以登录自己的github账号再认证一下就OK了&#xff0c;但是这次就是登录不上会有脚本错误的弹窗&#xff0c;搜到一个方法亲测有效&#xff0c;也非常简单&#xff0c;找一个同等开发环境&#xff0c;把对应路径下的许可证文件夹拷贝放到自己的文件夹下即可。 感谢各…