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.②…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...