Java中操作Xml使用备忘
- List item
文章目录
- Java中操作Xml使用备忘
- 1. Hutool中XmlUtil的使用简介
- 2. Hutool中XmlUtil快速读取Xml字符串某个节点值 [简单取值时,推荐使用]
- 2-1 Hutool工具包Maven依赖和测试Xml字符串如下
- 2-2 读取Xml中的节点<message>的值
- 3. Hutool中XmlUtil详细操作示例
- 3-1 Xml示例字符串如下
- 3-2 查询标签内的属性
- 3-3 查询一对标签中的文本
- 3-4 查询Xml后,再新增一个标签并赋值
- 3-5 修改一个标签数据
- 4 依赖Hutool再次封装的工具类XmlUtil,实现xml-map、map-xml、xml-json功能
- 4-1 需要添加的依赖
- 4-2 工具类XmlUtil代码
- 4-2-1 用到的一个枚举XmlSort如下:
- 4-2-2 XmlUtil.java如下
- 5 JavaBean与Xml互转_使用XStream实现,很实用 [强烈推荐使用]
- 5-1 引入XStream依赖
- 5-2 工具类XStreamXmlBeanUtil
- 5-3 使用实例
Java中操作Xml使用备忘
1. Hutool中XmlUtil的使用简介
# 说明1: XmlUtil只是w3c dom的简单工具化封装,减少操作dom的难度,
# 如果项目对XML依赖较大,依旧推荐Dom4j框架
# 说明2:JDK已经封装有XML解析和构建工具:w3c dom
# Hutool中XmlUtil简化XML的创建、读、写
1. 读取XML读取XML分为两个方法:XmlUtil.readXML 读取XML文件XmlUtil.parseXml 解析XML字符串为Document对象2. 写XMLXmlUtil.toStr 将XML文档转换为StringXmlUtil.toFile 将XML文档写入到文件3. 创建XMLXmlUtil.createXml 创建XML文档, 创建的XML默认是utf8编码,修改编码的过程是在toStr和toFile方法里,既XML在转为文本的时候才定义编码。4. XML读取操作通过以下工具方法,可以完成基本的节点读取操作。XmlUtil.cleanInvalid 除XML文本中的无效字符XmlUtil.getElements 根据节点名获得子节点列表XmlUtil.getElement 根据节点名获得第一个子节点XmlUtil.elementText 根据节点名获得第一个子节点XmlUtil.transElements 将NodeList转换为Element列表5. XML与对象转换writeObjectAsXml 将可序列化的对象转换为XML写入文件,已经存在的文件将被覆盖。readObjectFromXml 从XML中读取对象。注意 这两个方法严重依赖JDK的XMLEncoder和XMLDecoder,生成和解析必须成对存在(遵循固定格式),普通的XML转Bean会报错。6. Xpath操作createXPath 创建XPathgetByXPath 通过XPath方式读取XML节点等信息
2. Hutool中XmlUtil快速读取Xml字符串某个节点值 [简单取值时,推荐使用]
2-1 Hutool工具包Maven依赖和测试Xml字符串如下
<!-- 引入Hutool的Maven依赖 -->
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version>
</dependency>
<!-- 下方测试用的Xml字符串 -->
<?xml version="1.0" encoding="utf-8"?>
<returnsms> <returnstatus>Success(成功)</returnstatus> <message>ok</message> <remainpoint>1490</remainpoint> <taskID>885</taskID> <successCounts>1</successCounts>
</returnsms>
2-2 读取Xml中的节点的值
Document docResult=XmlUtil.readXML(xmlFile);
// 结果为“ok”
Object value = XmlUtil.getByXPath("//returnsms/message", docResult, XPathConstants.STRING);// 说明:Element对象目前仅能支持一层一层的向下解析,所以请不要跳级去做查询,
// 否则会报null。如果想直接获取到某个标签的文本,在有准确定位的情况下
// 可以直接写出路径获取,
// 但是如果该层级存在相同的标签则只获取第一个标签的数据。
String xmlData="xml字符串";
Document document= XmlUtil.parseXml(xmlData);
//获得XML文档根节点
Element elementG=XmlUtil.getRootElement(document);
//通过固定路径获取到数据
Object bString = XmlUtil.getByXPath("//root/base/message/event_no", document, XPathConstants.STRING);
System.out.println("event_no元素节点值:"+bString);
3. Hutool中XmlUtil详细操作示例
3-1 Xml示例字符串如下
<forms version="2.1"><formExport><summary id="1132755668421070367" name="formmain_0031"/><definitions><column id="field0001" type="0" name="field1" length="255"/><column id="field0002" type="0" name="field2" length="256"/></definitions><values><column name="field1"><value>建行一世</value></column><column name="field2"><value>中国人民</value></column></values><subForms/></formExport>
</forms>
3-2 查询标签内的属性
// 例: 获取<definitions>标签中第一个标签<column >属性length的值String xmlData="上面规定的xml字符串"; // 测试时自己替换下
Document document= XmlUtil.parseXml(xmlData);
//获得XML文档根节点
Element elementG=XmlUtil.getRootElement(document);
//打印节点名称
System.out.println(elementG.getTagName());
//获取下层节点(该方法默认取第一个)
Element elementZ=XmlUtil.getElement(elementG,"formExport");
System.out.println(elementZ.getTagName());
//获取下层节点(该方法默认取第一个)
Element elementZ1=XmlUtil.getElement(elementZ,"definitions");
System.out.println(elementZ1.getTagName());
//获取下层节点(该方法默认取第一个)
Element elementZ2=XmlUtil.getElement(elementZ1,"column");
System.out.println(elementZ2.getTagName());//读取属性length
System.out.println(elementZ2.getAttribute("length"));
3-3 查询一对标签中的文本
// 例:获取<values>标签中第一个标签<column>下的<value>所包含的文本,可直接看最后一行// =======以下内容同3-2,内容开始========================================
String xmlData="上面规定的xml字符串";
Document document= XmlUtil.parseXml(xmlData);
//获得XML文档根节点
Element elementG=XmlUtil.getRootElement(document);
//获取下层节点(该方法默认取第一个)
Element elementZ=XmlUtil.getElement(elementG,"formExport");
//获取下层节点(该方法默认取第一个)
Element elementZ_1=XmlUtil.getElement(elementZ,"values");
//获取下层节点(该方法默认取第一个)
Element elementZ_2=XmlUtil.getElement(elementZ_1,"column");
// =======以上内容同3-2,内容结束========================================//获取到所有子标签 // Value返回的时NodeList,遍历获取即可
NodeList nodeList=elementZ_2.getElementsByTagName("value");
for (int i = 0; i <nodeList.getLength() ; i++) {//打印标签的文本System.out.println(nodeList.item(i).getTextContent());
}
3-4 查询Xml后,再新增一个标签并赋值
// 例:给<values>标签中第一个标签<column>下再度添加一个<value>标签,所包含的文本为:从零开始// =======以下内容同3-2,内容开始========================================
String xmlData="上面规定的xml字符串";
Document document= XmlUtil.parseXml(xmlData);
//获得XML文档根节点
Element elementG=XmlUtil.getRootElement(document);
//获取下层节点(该方法默认取第一个)
Element elementZ=XmlUtil.getElement(elementG,"formExport");
//获取下层节点(该方法默认取第一个)
Element elementZ_1=XmlUtil.getElement(elementZ,"values");
//获取下层节点(该方法默认取第一个)
Element elementZ_2=XmlUtil.getElement(elementZ_1,"column");
// =======以上内容同3-2,内容结束========================================//创建一个标签
Element elementItem = document.createElement("value");
//赋值
elementItem.setTextContent("从零开始");
//放到某个标签下面
elementZ_2.appendChild(elementItem);
//获取到所有子标签
NodeList nodeList=elementZ_2.getElementsByTagName("value");
for (int i = 0; i <nodeList.getLength() ; i++) {//打印标签的文本System.out.println(nodeList.item(i).getTextContent());
}
System.out.println(XmlUtil.toStr(document));// 打印的结果: 在<value>建行一世</value>后,新增了一个<value>从零开始</value>
3-5 修改一个标签数据
// 例:给<values>标签中第一个标签<column>下的第一个<value>标签修改成:张三丰// =======以下内容同3-2,内容开始========================================
String xmlData="上面规定的xml字符串";
Document document= XmlUtil.parseXml(xmlData);
//获得XML文档根节点
Element elementG=XmlUtil.getRootElement(document);
//获取下层节点(该方法默认取第一个)
Element elementZ=XmlUtil.getElement(elementG,"formExport");
//获取下层节点(该方法默认取第一个)
Element elementZ_1=XmlUtil.getElement(elementZ,"values");
//获取下层节点(该方法默认取第一个)
Element elementZ_2=XmlUtil.getElement(elementZ_1,"column");
// =======以上内容同3-2,内容结束========================================//获取到所有子标签
NodeList nodeList=elementZ_2.getElementsByTagName("value");
//第一次打印
for (int i = 0; i <nodeList.getLength() ; i++) {//打印标签的文本System.out.println(nodeList.item(i).getTextContent());
}
//修改
for (int i = 0; i <nodeList.getLength() ; i++) {// ******************* 这里进行修改 ********************nodeList.item(i).setTextContent("张三丰");
}
//第二次打印
for (int i = 0; i <nodeList.getLength() ; i++) {//打印标签的文本System.out.println(nodeList.item(i).getTextContent());
}
// 打印输出结果:
// 第一次打印输出为: 建行一世
// 第二次打印输出为: 张三丰
4 依赖Hutool再次封装的工具类XmlUtil,实现xml-map、map-xml、xml-json功能
// 作用:
// 1.xml转map
// 2.xml转json
// 3.map转xml
4-1 需要添加的依赖
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.15</version>
</dependency><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version>
</dependency>
4-2 工具类XmlUtil代码
4-2-1 用到的一个枚举XmlSort如下:
import java.util.HashMap;
import java.util.LinkedHashMap;/*** xml解析顺序是否有序* @author ASen*/public enum XmlSort{/*** 有序*/SORT(LinkedHashMap.class,"有序"),/*** 无序*/NO_SORT(HashMap.class,"无序");/*** 创建的map字节码对象*/private final Class<?> mapClass;/*** 顺序名称*/private final String message ;XmlSort(Class<?> mapClass, String message) {this.mapClass = mapClass;this.message = message;}public Class<?> getMapClass() {return mapClass;}public String getMessage() {return message;}
}
4-2-2 XmlUtil.java如下
package com.asen.demo.util;import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.asen.demo.constant.XmlSort;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.tree.DefaultDocument;
import org.dom4j.tree.DefaultElement;import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;/*** xml解析帮组类* @author asen* @date 2022/1/10 15:17*/
public class XmlUtil {/*** 标签属性*/private final static String TAG_ATTR = "attr";/*** 创建的map类型*/private XmlSort xmlSort = XmlSort.NO_SORT;/*** map to xml* @param map map对象* @return xml 字符串*/public String mapToXml(Map<String,Object> map) {if(map.size() != 1){throw new RuntimeException("map根节点长度不为1");}String key = "";for (String str : map.keySet()) {key = str ;}// 创建根节点Element rootElement = new DefaultElement(key);Document document = new DefaultDocument(rootElement);Element node = document.getRootElement();Object obj = map.get(key);// 断言Assert.isAssignable(Map.class,obj.getClass());mapNodes(node,(Map<String, Object>)obj);return document.asXML();}/*** 父类节点已经创建, map 包含父类* @param node node* @param map map*/public void mapNodes(Element node, Map<String, Object> map) {map.forEach((k,v)->{Object obj = map.get(k);// 给当前父类添加属性if(TAG_ATTR.equals(k)){Assert.isAssignable(Map.class,obj.getClass());Map<String,Object> tagMap = (Map<String,Object>) obj;tagMap.forEach((tagKey,tagValue)->{node.addAttribute(tagKey, (String) tagValue);});return ;}if(obj instanceof Map){Element newElement = node.addElement(k);// map 处理Map<String,Object> childMap = (Map<String,Object>) obj;mapNodes(newElement,childMap);}else if (obj instanceof String){Element newElement = node.addElement(k);newElement.setText((String) v);} else if (obj instanceof List) {List<Map<String, Object>> list = (List<Map<String, Object>>) obj;list.forEach(itemMap->{Element newElement = node.addElement(k);mapNodes(newElement,itemMap);});}});}/*** 读取xml文件,返回json字符串** @param fileName 文件路径* @return json字符串* @throws DocumentException 异常*/public String xmlToJson(String fileName) throws DocumentException {Map<String, Object> xmlMap = xmlToMap(fileName);return JSONUtil.toJsonStr(xmlMap);}/*** 读取xml文件,返回map对象** @param fileName 文件路径* @return map对象* @throws DocumentException 异常*/public Map<String, Object> xmlToMap(String fileName) throws DocumentException {// 创建saxReader对象SAXReader reader = new SAXReader();// 通过read方法读取一个文件 转换成Document对象Document document = reader.read(new File(fileName));//获取根节点元素对象Element node = document.getRootElement();//遍历所有的元素节点Map<String, Object> map = getNewMap();// 处理节点listNodes(node, map);return map;}/*** 遍历当前节点元素下面的所有(元素的)子节点** @param node node*/public void listNodes(Element node, Map<String, Object> map) {Map<String, Object> xiaoMap = getNewMap();String nodeKey = node.getName();// 获取当前节点的所有属性节点List<Attribute> list = node.attributes();// 遍历属性节点Map<String, Object> attrMap = getNewMap();for (Attribute attr : list) {attrMap.put(attr.getName(), attr.getValue());}if (ObjectUtil.isNotEmpty(attrMap)) {xiaoMap.put(TAG_ATTR, attrMap);}// 当前节点下面子节点迭代器Iterator<Element> it = node.elementIterator();if (!("".equals(node.getTextTrim())) || !it.hasNext()) {map.put(nodeKey, node.getTextTrim());}else{// 不为空if (ObjectUtil.isEmpty(map.get(nodeKey))) {map.put(nodeKey, xiaoMap);} else {List<Map<String, Object>> childList = null;// 获取原来的Object obj = map.get(nodeKey);if (obj instanceof Iterable) {// 非第一个childList = (List<Map<String, Object>>) obj;childList.add(xiaoMap);} else if (obj instanceof Map) {// 第一个Map<String, Object> childMap = (Map<String, Object>) obj;childList = new ArrayList<>();childList.add(childMap);childList.add(xiaoMap);}// 添加新的map.put(nodeKey, childList);}}// 遍历while (it.hasNext()) {// 获取某个子节点对象Element e = it.next();// 对子节点进行遍历listNodes(e, xiaoMap);}}/*** 获取一个新的map对象** @return map对象*/private Map<String, Object> getNewMap() {Object obj = null;try {obj = xmlSort.getMapClass().newInstance();if (obj instanceof Map) {return (Map<String, Object>) obj;}} catch (InstantiationException | IllegalAccessException e) {e.printStackTrace();}return null;}/*** 设置是否排序** @param xmlSort 是否排序对象*/public void setXmlSort(XmlSort xmlSort) {this.xmlSort = xmlSort;}
}
5 JavaBean与Xml互转_使用XStream实现,很实用 [强烈推荐使用]
说明:
相对于JAXB,XStream更简洁一些。
常用注解:
@XStreamAlias:定义xml节点名
5-1 引入XStream依赖
<dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.19</version>
</dependency>
5-2 工具类XStreamXmlBeanUtil
import com.thoughtworks.xstream.XStream;/*** XStream 实现bean与xml之间相互转换*/
public class XStreamXmlBeanUtil {/*** JavaBean转XML* @param bean - JavaBean* @return - XML*/public static String toXml(Object bean) {return initXStream(bean.getClass()).toXML(bean);}/*** XML转JavaBean* @param xml - XML* @param beanClazz - JavaBean Class* @param <T>* @return - JavaBean*/@SuppressWarnings("unchecked")public static <T> T fromXml(String xml, Class<T> beanClazz) {return (T) initXStream(beanClazz).fromXML(xml);}private static XStream initXStream(Class<?> beanClazz) {XStream x = new XStream();x.registerConverter(new DateConverter("yyyy-MM-dd HH:mm:ss", null,TimeZone.getTimeZone("GMT+8")));//不使用默认的类加载器,需要手动设置类加载器x.setClassLoader(beanClazz.getClassLoader());x.processAnnotations(beanClazz);x.allowTypesByRegExp(new String[]{".*"});// 开起注解功能x.autodetectAnnotations(true);// 忽律未知字段x.ignoreUnknownElements();return x;}
}
5-3 使用实例
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;public class Test {public static void main(String[] args) {// 1. 普通bean与Xml互转User user = new User("貂蝉", 18, "女");System.out.println("============普通bean转Xml===============");String xml = XStreamXmlBeanUtil.toXml(user);System.out.println(xml);System.out.println("============Xml转普通bean===============");System.out.println(XStreamXmlBeanUtil.fromXml(xml, User.class));// 2. 继承bean与Xml互转Child child = new Child("吃糖葫芦");child.setName("葫芦娃");child.setAge(2);child.setGender("男");child.setHobby("打游戏");System.out.println("============继承bean转Xml===============");xml = XStreamXmlBeanUtil.toXml(child);System.out.println(xml);System.out.println("============Xml转继承bean====");// 生成的Xml仅有Child的属性hobby,但转后后的Child对象,父属性都是有值的;System.out.println(XStreamXmlBeanUtil.fromXml(xml, Child.class)); System.out.println("============Xml转继承bean,测试转换后,父属性、自身属性是否有值====");Child c2 = XStreamXmlBeanUtil.fromXml(xml, Child.class);System.out.println( "11111==" + c2.getName() + c2.getGender() + c2.getHobby());// 输出内容如下:// ============普通bean转Xml===============// <Women>// <name>貂蝉</name>// <age>18</age>// <gender>女</gender>// </Women>// ============Xml转普通bean===============// XmlTest.User(name=貂蝉, age=18, gender=女)// ============继承bean转Xml===============// <User>// <name>葫芦娃</name>// <age>2</age>// <gender>男</gender>// <hobby>打游戏</hobby>// </User>// ============Xml转继承bean====// XmlTest.Child(hobby=打游戏)// 11111==葫芦娃男打游戏 }
}@Data
@NoArgsConstructor
@AllArgsConstructor
@XStreamAlias("Women")
class User {private String name;private int age;private String gender;
}@NoArgsConstructor
@AllArgsConstructor
@Data
@XStreamAlias("User")
class Child extends User {private String hobby;
}
相关文章:

Java中操作Xml使用备忘
List item 文章目录 Java中操作Xml使用备忘1. Hutool中XmlUtil的使用简介2. Hutool中XmlUtil快速读取Xml字符串某个节点值 [简单取值时,推荐使用]2-1 Hutool工具包Maven依赖和测试Xml字符串如下2-2 读取Xml中的节点<message>的值 3. Hutool中XmlUtil详细操作示…...

【Java|基础篇】内部类
文章目录 1.什么是内部类?2.实例内部类3.静态内部类4.局部内部类5.匿名内部类6.结语 1.什么是内部类? 内部类就是在一个类中再定义一个类,内部类也是封装的体现.它可以被声明为 public、protected、private 或默认访问控制符。内部类可以访问外部类的所有成员变量和方法&…...

七牛云图床设置
文章目录 七牛云图床设置下面是用picgo配置图床SSL证书申请https网站显示http图片解决方案 原文链接图床设置,免费SSL证书申请,https网站显示http链接的图片 七牛云图床设置 登录七牛云官网并进行个人注册,然后找到对象存储 点击空间管理&a…...

Android 12.0下拉状态栏录屏去掉弹窗直接录屏
1.概述 在12.0的系统rom开发中,在systemui的下拉状态栏中有个录屏的快捷按钮,可以通过点击录屏实现录屏功能,但是在录屏的时候发现需要先弹出 dialog,然后点击开始实现录屏,这有的麻烦,所以需要去掉弹窗直接开始录屏,就需要弹窗的相关代码来实现功能 2.下拉状态栏录屏…...

MySql基础学习(1)
MySql基础学习 一、数据库1.1 什么是数据库1.2 MySql的启动与停止1.3 MySql数据模型 二、SQL2.1 SQL通用语法2.2 SQL分类2.2.1 数据类型2.2.2 DDL使用方法2.2.3 、表操作-修改&删除DDL总结 2.3 DML2.3.1 DML添加数据2.3.2 DML---修改数据2.3.3 DML---删除数据DML总结 2.4 D…...

18- 弹幕系统设计
1、弹幕系统设计 场景分析:客户端针对某一视频创建了弹幕,发送后端进行处理,后端需要对所有正在观看该视频的用户推送该弹幕。 1.1、实现方式 使用短连接进行通信或使用长连接进行通信。 1.1.1、短连接实现方案 所有观看视频的客户端不断…...

字节软测划水四年,内容过于真实......
先简单交代一下吧,潇潇是某不知名211的本硕,18年毕业加入一个小厂,之后跳槽到了字节跳动,一直从事测试开发相关的工作。之前没有实习经历,算是四年半的工作经验吧。 这四年半之间他完成了一次晋升,换了一家…...

Mybatis介绍
1. Mybatis中#和$的区别? #相当于对数据 加上 双引号,$相当于直接显示数据 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为orde…...

Docker理论基础
初识Docker 1.什么是Docker 微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署,环境不一定一致&…...

MySQL数据库之存储引擎
一、存储引擎的概念 1.1 什么是存储引擎 MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是MySQL将数据存…...

中介效应分析全流程汇总
一、中介效应说明 中介效应主要研究自变量对因变量影响的过程中,自变量是否通过中介变量再对因变量产生影响,那什么情况表明中介效应存在呢?如果自变量对因变量影响过程中,中介变量在模型中有着桥梁般的作用,那说明中…...

论文阅读:Multimodal Graph Transformer for Multimodal Question Answering
文章目录 论文链接摘要1 contribution3 Multimodal Graph Transformer3.1 Background on Transformers3.2 Framework overview 框架概述3.3 Multimodal graph construction多模态图的构建Text graphSemantic graphDense region graph Graph-involved quasi-attention 总结 论文…...

关于compile() 函数简单实用示例
compile() 函数是什么 compile() 函数将一个字符串编译为字节代码。 compile将代码编译为代码对象,应用在代码中可以提高效率。 语法 compile(source, filename, mode, flags0, dont_inheritFalse, optimize-1) 参数 source:表示要编译的源代码字符串、…...

Deep Frequency Filtering for Domain Generalization论文阅读笔记
这是CVPR2023的一篇论文,讲的是在频域做domain generalization,找到频域中generalizable的分量enhance它,suppress那些影响generalization的分量 DG是一个研究模型泛化性的领域,尝试通过各自方法使得模型在未见过的测试集上有良好…...

视频里的声音怎么转换成音频?
视频里的声音怎么转换成音频?这样我们就能把视频里的想要的声音在其他音频平台播放或是用于其他视频。其实视频提取音频是一种将视频文件中的音频数据分离出来的技术。该技术可以将视频中的音频转换为不同的格式,让我们可以在无需视频的情况下使用音频文…...

1.1. Java简介与安装
Java简介 Java是一种广泛使用的计算机编程语言,由James Gosling和他的团队在Sun Microsystems公司开发,于1995年首次发布。Java的设计理念是“一次编写,到处运行”,这意味着Java应用程序可以在任何支持Java运行时环境(…...

Elasticsearch 8.X 性能优化参考 —— 筑梦之路
Elasticsearch 是实现用户无缝搜索体验的关键工具。它通过提供快速、准确和相关的搜索结果,彻底改变了用户与应用程序的互动方式。然而,要确保 Elasticsearch 部署达到最佳性能,就必须关注关键指标,并对诸如索引、缓存、查询、搜索…...

通过强化学习走直线理解基本概念
摘要: 一条线上包含起点和终点共有6个格子,起点在左终点在右。假设智能体已经学到了最优的策略,并且在每一步行动时,以 0.9 0.9 0.9 的概率选择最优策略(也就是往右),以 0.1 0.1 0.1 的概率选…...

Java字符流
5 字符流 5.1 为什么出现字符流 由于字节流操作中文不是特别的方便,所以Java就提供字符流字符流=字节流+编码表用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢? 汉字在存储的时候, 无论选择哪…...

2023年上半年信息系统项目管理师上午真题及答案解析
1.“新型基础设施”主要包括信息技术设施、融合基础设施和创新基础设施三个方面。其中信息基础设施包括( )。 ①通信基础设施 ②智能交通基础设施 ③新技术基础设施 ④科教基础设施 ⑤算力基础设施 A.①③⑤ B.①④⑤ C.②③④ D.②…...

LeetCode 739 每日温度
题目: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 示例 1…...

介绍几种常见的运维发布策略
随着Devops的发展,为了提高运维发布的成功率,探索出了多种发布策略。本文简单介绍几种常见发布策略, 以及它们适用的场景和优缺点。 第一种,停机发布 这是最早的一种发布策略,停机发布会在发布以前关闭服务,停止用户…...

C++ QT QDBus进阶用法。
以下是使用QDBus的高级用法示例代码: 1. 使用DBus的异步调用机制: #include <QCoreApplication> #include <QDebug> #include <QDBusConnection> #include <QDBusPendingCallWatcher> class MyDBusObject : public QObject …...

2023-5-26 LeetCode每日一题(二进制矩阵中的最短路径)
2023-05-29每日一题 一、题目编号 1091. 二进制矩阵中的最短路径二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。 二进制矩阵中的 畅通路径…...

博客系统后端设计(七) - 实现显示用户信息与注销功能
文章目录 1. 显示用户信息1.1 约定前后端交互接口1.2 修改列表页的前段代码1.3 实现详情页的后端代码1.4 实现详情页的前端代码 2. 注销2.1 确定前后端交互接口2.2 实现后端代码2.3 修改前端代码 1. 显示用户信息 此处的用户名是写死的,我们希望的是此处是能够动态生…...

Spring5 学习笔记
前置知识: 掌握Java基础知识(特别是反射)掌握Java注解掌握XML掌握Maven Spring5学习笔记 1、Spring概述1.1、简介1.2、优点1.3、组成1.4、拓展 2、IOC理论推导2.1、分析实现2.2、IOC本质 3、HelloSpring3.1、导入jar包3.2、编写代码3.3、思考…...

leetcode--分隔链表(java)
分割链表 leetcode 86 分割链表 (中等)解题思路:链表专题 leetcode 86 分割链表 (中等) leetcode 86 分割链表 原题链接,可以直接测试 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进…...

使用 AD8232 ECG 传感器和 ESP32 进行基于物联网的 ECG 监测
这篇文章是使用 AD8232 ECG 传感器和 ESP32 进行基于物联网的 ECG 监测。可以从世界任何地方在线观察来自患者心脏的心电图信号。 目录 概述 什么是心电图? 心电图的医疗用途 AD8232 心电图传感器...

【Linux初阶】基础IO - 文件操作(使用系统接口实现) | vim批量注释代码
🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【Linux初阶】 ✒️✒️本篇内容:重新理解文件和文件操作,C语言实现的简单文件操作,文本初始权限,系统接口介…...

网络安全之信息收集
第一部分:被动信息收集 1、简介 在信息收集这块区域,我将其分为两部分:第一部分即被动信息收集,第二部分即主动信息收集。 对于标准的渗透测试人员来说,当明确目标做好规划之后首先应当进行的便是信息收…...