当前位置: 首页 > news >正文

java中XML的使用

文章目录

    • 什么是XML
    • 特点
    • XML作用
    • XML的编写语法
      • 基本语法
      • 特殊字符编写
    • 约束XML的书写格式
      • DTD文档
      • schema文档
        • 属性命名空间
        • XML命名空间的作用
    • 解析XML的方法
      • ​​DOM解析XML
        • DOM介绍
        • DOM解析包:org.w3c.dom
        • 常用接口
        • DOM解析包的使用
        • 保存XML文件
        • 添加DOM节点
        • 修改/删除DOM节点
      • SAX
      • DOM4J
        • 优点
        • DOM4J下载和导入项目
        • DOM4j代码编写
          • 获取所有值
          • 修改值和删除值
          • 添加值并保存文件
    • 综合案例
      • 解析
      • citys.xml
      • Server.java
      • ServerTest.java
      • Client.java
      • ClientTest.java
      • XmlServise.java
      • Utils.java
      • 运行结果

什么是XML

XML(EXtensible Markup Language),可扩展标记语言,是一种简单的基于文本的语言,旨在以村文本格式存储和传输数据,他代表可扩展标记语言。
1、作为系统的配置文件
2、作为一种特殊的数据结构,在网络中进行传输

特点

XML与操作系统、编程语言的开发平台无关
实现不同系统之间的数据交换

XML作用

  1. 数据交互
  2. 配置应用程序和网站
  3. Ajax基石

XML的编写语法

基本语法

所有XML元素都必须有结束标签
XML标签对大小写敏感
XML必须正确的嵌套
同级标签以缩进对齐
元素名称可以包含字母、数字或其他的字符
元素名称不能以数字或者标点符号开始
元素名称中不能含空格

<?xml version="1.0" encoding="UTF-8"?>
<books><!--图书信息  这是注释--><book id="bk101"><author>王珊</author><title>.NET高级编程</title><description>包含C#框架和网络编程等</description></book><book id="bk102"><author>李明明</author><title>XML基础编程</title><description>包含XML基础概念和基本作用</description></book>
</books>

注意一:<?xml version="1.0" encoding="utf-8" ?>这行是必须要写的,且必须放在首行(前面有注释都不行)。表示版本为1.0,以utf-8字符集来编码
注意二:根标签只能有一个,子标签可以有多个
注意三:标签是成对存在的,记得嵌套正确

XML文件可以在浏览器中查看,我们打开浏览器看到,我们写的特殊字符的格式是我们所预期的
在这里插入图片描述
在这里插入图片描述

特殊字符编写

1、 指定字符替代特殊字符
XML中书写”<’
“&”等,可能会出现冲突,导致报错,此时可以用如下特殊字符替代。

指定字符特殊字符含义
&lt;<小于
&gt;>大于
&amp;&小于
&apos;单引号
&quot;"双引号

2、CDATA的数据区
XML中可以写一个叫CDATA的数据区:<![CDATA[..内容... ]]>,里面的内容可以随便写

<Users><user id="1"><name>张三</name><age>18</age><address>广州</address></user><userAttribute>都是爱学习的人</userAttribute><user id="2"><name>李四</name><age>25</age><address>哈尔滨</address></user><!--以下是带有大于号小于号等特殊字符的写法--><special><![CDATA[5 > 2 && 3 < 5]]></special><!--特殊字符用法二--><special>  5 &gt; 2 &amp;&amp; 3 &lt; 5 </special>
</Users>

在这里插入图片描述

约束XML的书写格式

DTD文档

特点
可以约束XML文件的编写
不能约束具体的数据类型

DTD文档的使用
①:编写DTD约束文档,后缀必须是.dtd
data.dtd
根目录只能叫做书并且可以有多个书的子元素
书只能由书名作者售价构成

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

②:在需要编写的XML文件中导入该DTD约束文档
<!DOCTYPE 书架 SYSTEM "data.dtd">
③:然后XML文件,就必须按照DTD约束文档指定的格式进行编写,否则报错

<?xml version="1.0" encoding="UTF-8"?>
<!-- 导入约束格式 -->
<!DOCTYPE 书架 SYSTEM "data.dtd">
<书架><!-- 只能这么写否则报错 --><><书名>哈利波特</书名><作者>J.K.罗琳</作者><!-- 售价的类型可以是浮点型,字符串,也可以是任何数据类型 --><售价>49.9</售价></><><书名>西游记</书名><作者>吴承恩</作者><售价>49.9</售价></>
</书架>

schema文档

特点
可以约束XML文件的编写
可以约束具体的数据类型

schema文档的使用
1、编写schema约束文档,后缀必须是.xsd,具体的形式到代码中观看。
2、在需要编写的XML文件中导入该schema约束文档
3、按照约束内容编写XML文件的标签

<?xml version="1.0" encoding="UTF-8"?>
<!-- xmlns: 核心命名空间声明 -->
<!-- xmlns="http://www.w3.org/2001/XMLSchema:
声明使用W3C XML Schema规范作为默认命名空间,所有未加前缀的标签均属于该规范。 -->
<!-- targetNamespace(目标命名空间): 申明约束文档的地址(命名空间) 这里的data.xsd也是被约束的 -->
<!-- elementFormDefault(元素命名空间规则): 先不用管,这是关于局部元素的命名空间归属的属性-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.itcast.cn"elementFormDefault="qualified" >
<!--全局元素定义,作为根元素,该元素直接属于targetNamespace命名空间--><element name="书架"><complexType><!-- maxOccurs="unbounded" 书架下的子元素可以有无穷多个 --><sequence maxOccurs="unbounded"><element name=""><!--  写子元素  --><complexType><sequence><element name="书名" type="string"/><element name="作者" type="string"/><element name="价格" type="double"/></sequence></complexType></element></sequence></complexType></element>
</schema>

在这里插入图片描述

属性命名空间
<?xml version="1.0" encoding="UTF-8"?>
<batchCompany xmlns="http://www.Aptech_edu.ac"xmlns:tea="http://www.tea.org"><batch-list><!-- 下面这个命名空间属于xmlns:tea="http://www.Aptech_edu.ac" --><batch type="thirdbatch">第三批次</batch><!-- 下面这个命名空间属于xmlns:tea="http://www.tea.org" --><batch tea:type="thirdbatch">第三批茶</batch><!-- 下面这个命名空间属于xmlns:tea="http://www.Aptech_edu.ac" --><batch>午班批次</batch></batch-list>
</batchCompany>

除非带有前缀,否则属性属于所属的元素的命名空间

XML命名空间的作用

解决在复杂、大型XML文件中,出现名称相同,但是含义不同的元素

<?xml version="1.0" encoding="UTF-8"?><!-- 两个厂家(佳能相机和尼康相机)的地址 -->
<cameras xmlns:canon="http://www.canon"xmlns:nikon="http://www.nikon.com"><!-- 虽然都是相机camera  但是第一个是canon(佳能牌)的相机 第二个是nikon(尼康牌)的相机 --><canon:camera prodID="P663" name="Camera傻瓜相机"/><nikon:camera prodID=“K29B3” name=“Camera超级35毫米相机"/>
</cameras>

解析XML的方法

本节分三块

DOM(内置解析XML)

  1. 基于XML文档树结构的解析
  2. 适用于多次访问的XML文档
  3. 特点:比较消耗资源

SAX(内置解析XML)

  1. 基于事件的解析
  2. 适用于大数据量的XML文档
  3. 特点:占用资源少,内存消耗小

DOM4J

  1. 非常优秀的Java XML API
  2. 性能优异、功能强大
  3. 开放源代码

​​DOM解析XML

基于XML文档树结构的解析
适用于多次访问的XML文档
特点:比较消耗资源

DOM介绍

文档对象模型(Document Object Model)
DOM把XML文档映射成一个倒挂的树
在这里插入图片描述

DOM解析包:org.w3c.dom

org.w3c.dom​​ 是 Java 中用于处理 ​​文档对象模型(DOM)​​ 的核心包,由 ​​万维网联盟(W3C)​​ 制定并维护。它是 W3C DOM 标准的 Java 语言绑定实现,主要用于解析、访问和操作 XML/HTML 文档的结构化内容。(jdk自带的用于解析xml文件的API)

常用接口
常用接口常用方法说明
Document:表示整个 XML 文档NodeList getElementsByTagName(String Tag)按文档顺序返回文档中指定标记名称的所有元素集合
Element createElement(String tagName)创建指定标记名称的元素
Node:该文档树中的单个节点NodeList getChildNodes()获取该元素的所有子节点,返回节点集合
Element:XML 文档中的一个元素String getTagName()获取元素名称
DOM解析包的使用

DOM解析XML文件步骤

  1. 创建解析器工厂对象
  2. 解析器工厂对象创建解析器对象
  3. 解析器对象指定XML文件创建Document对象
  4. 以Document对象为起点操作DOM树
<?xml version="1.0" encoding="utf-8"?>
<PhoneInfo><Brand name="华为"><Type name="U8650"/><Type name="HW123"/><Type name="HW321"/></Brand><Brand name="苹果"><Type name="iPhone4"/></Brand>
</PhoneInfo>

显示phoneinfo.xml文件中收藏的手机品牌和型号

package com.hsh.exercise2;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;public class Main {public static void main(String[] args) throws Exception {// 创建解析器工厂对象DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();// 解析器工厂对象创建解析器对象DocumentBuilder db = factory.newDocumentBuilder();// 解析 XML 文件Document document = db.parse("./src/com/hsh/exercise2/phoneinfo.xml");// 获取根元素Element root = document.getDocumentElement();// 获取所有 Brand 元素NodeList brandList = root.getElementsByTagName("Brand");// 遍历每个 Brand 节点并打印 name 属性for (int i = 0; i < brandList.getLength(); i++) {// 获取 Brand 元素Element brand = (Element) brandList.item(i);// 获取节点名称System.out.print(brand.getNodeName()+":  ");// 获取 name 属性System.out.print(brand.getAttribute("name")+",");// 获取节点文本内容  由于是单标签所以为空。// System.out.println(brand.getTextContent());// 获取Brand 元素下面的 Type 元素NodeList typeLists = brand.getElementsByTagName("Type");for (int j = 0; j < typeLists.getLength(); j++) {// 获取 Type 元素Element type = (Element) typeLists.item(j);// 获取节点名称System.out.print(type.getNodeName()+":  ");// 获取 name 属性System.out.print(type.getAttribute("name")+" ");}System.out.println();}// 输出结果// Brand:  华为,Type:  U8650 Type:  HW123 Type:  HW321 // Brand:  苹果,Type:  iPhone4}
}
保存XML文件

步骤

  1. 获得TransformerFactory对象
  2. 创建Transformer对象
  3. 创建DOMSource对象:包含XML信息
  4. 设置输出属性:编码格式
  5. 创建StreamResult对象:包含保存文件的信息
  6. 将XML保存到指定文件中
package com.hsh.exercise3;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.DOMImplementationLS;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;public class Main {public static void main(String[] args) throws Exception {//1. 创建工厂TransformerFactory对象TransformerFactory factory = TransformerFactory.newInstance();//2. 创建Transformer对象Transformer  transformer = factory.newTransformer();// 3. 创建Document对象来创建新的XML文件,给XML文件设置内容,并将DOM结构添加到DOMsource对象// 3.1 创建Document对象DocumentBuilderFactory documentFactory = DocumentBuilderFactory.newInstance();DocumentBuilder  builder = documentFactory.newDocumentBuilder();Document document = builder.newDocument();// 3.2 创建XML结构(即给XML文件设置内容)// 创建根元素Element root = document.createElement("root");// 加入到document中document.appendChild(root);// 创建子元素Element child = document.createElement("child");// 设置属性名和属性值child.setAttribute("name", "hsh");// 设置元素内容child.appendChild(document.createTextNode("Text Content"));//加入根节点树中root.appendChild(child);// 3.3 将文件添加到DOMsource对象中DOMSource source = new DOMSource(document);// 4. 给第二步 的Transformer对象设置输出属性// 4.1设置是否再XML中添加缩进transformer.setOutputProperty(OutputKeys.INDENT,"yes");// 4.2指定输出方法transformer.setOutputProperty(OutputKeys.METHOD, "xml");// 4.3指定输出文件编码transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");// 5. 创建StreamResult对象,指定输出文件 StreamResult对象包含了文件信息StreamResult result = new StreamResult("./src/com/hsh/exercise3/collection.xml");// 6. 将DOMsource对象和StreamResult对象作为参数传递给Transformer对象的transform方法进行保存transformer.transform(source, result);System.out.println("保存成功!");}
}

保存后的文件如下

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root><child name="hsh">Text Content</child>
</root>
添加DOM节点

添加手机收藏

  1. 添加新的Brand:三星
  2. 给Brand节点添加新的子标签Type:Note4
  3. 将Brand添加到DOM树中

练习:给手机收藏信息XML中添加新的手机信息,并将手机收藏信息保存到新文件中
添加新的Brand:三星
给Brand节点添加新的子标签Type:Note4
将Brand添加到DOM树中

package com.hsh.exercise3;import org.w3c.dom.Document;
import org.w3c.dom.Element;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;public class Main {public static void main(String[] args) throws Exception {// 创建解析器工厂对象DocumentBuilderFactory  factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse("./src/com/hsh/exercise3/收藏信息.xml");// 获取根元素Element root = document.getDocumentElement();System.out.println(root.getNodeName());// 给根元素添加子元素BrandElement brand = document.createElement("Brand");brand.setAttribute("name","三星");// 给Brand 元素添加子元素TypeElement type = document.createElement("Type");// 设置Type的属性type.setAttribute("name","Note4");// 将Type添加到Brand中brand.appendChild(type);root.appendChild(brand);// 创建工厂进行保存TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();// 设置格式化// 缩进transformer.setOutputProperty(OutputKeys.INDENT, "yes");// 指定输出transformer.setOutputProperty(OutputKeys.METHOD, "xml");// 指定编码transformer.setOutputProperty(OutputKeys.ENCODING, "GB2312");DOMSource domSource = new DOMSource(document);StreamResult streamResult = new StreamResult("./src/com/hsh/exercise3/收藏信息.xml");transformer.transform(domSource, streamResult);System.out.println("保存成功");}
}
修改/删除DOM节点
  1. 给所有的Brand标签添加id属性
    • 获取Brand标签
    • 调用setAttribute()方法添加属性
  2. 删除Brand值为“华为”的标签
    • getElementsByTagName()方法获取Brand标签列表
    • 获得Brand值为“华为”的标签对象
    • 通过getParentNode()方法获得父节点对象
    • 调用父节点的removeChild()方法删除节点
<?xml version="1.0" encoding="GB2312"?>
<PhoneInfo><Brand name="华为"><Type name="U8650"/><Type name="HW123"/>  <Type name="HW321"/></Brand><Brand name="苹果">   <Type name="iPhone4"/></Brand><Brand name="三星">         <Type name="Note4"/>  </Brand>
</PhoneInfo>
package com.hsh.exercise4;import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;public class Main {public static void main(String[] args) throws Exception {// 创建解析器工厂对象DocumentBuilderFactory  factory = DocumentBuilderFactory.newInstance();DocumentBuilder db = factory.newDocumentBuilder();Document document = db.parse("./src/com/hsh/exercise4/收藏信息.xml");// 获取根元素Element root = document.getDocumentElement();System.out.println(root.getNodeName());//  获取root所有Brand子级标签NodeList nodeList = root.getElementsByTagName("Brand");for (int i = 0; i < nodeList.getLength(); i++) {// 给每一个Brand标签加属性Element brand = (Element) nodeList.item(i);brand.setAttribute("id", (i+1)+"");}// 遍历子级标签删除 Brand的属性为华为的标签for (int i = 0; i < nodeList.getLength(); i++) {Element brand = (Element) nodeList.item(i);if (brand.getAttribute("name").equals("华为")) {// 得到父元素Element parent = (Element) brand.getParentNode();// 删除parent.removeChild(brand);}}// 创建工厂进行保存TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transformer = transformerFactory.newTransformer();// 设置格式化// 缩进transformer.setOutputProperty(OutputKeys.INDENT, "yes");// 指定输出transformer.setOutputProperty(OutputKeys.METHOD, "xml");// 指定编码transformer.setOutputProperty(OutputKeys.ENCODING, "GB2312");DOMSource domSource = new DOMSource(document);StreamResult streamResult = new StreamResult("./src/com/hsh/exercise4/收藏信息.xml");transformer.transform(domSource, streamResult);System.out.println("保存成功");}
}

结果如下。

<?xml version="1.0" encoding="GB2312" standalone="no"?>
<PhoneInfo><Brand id="2" name="苹果"><Type name="iPhone4"/></Brand><Brand id="3" name="三星"><Type name="Note4"/></Brand></PhoneInfo>

SAX

基于事件的解析
适用于大数据量的XML文档
特点:占用资源少,内存消耗小

DOM4J

优点

非常优秀的Java XML API
性能优异、功能强大
开放源代码

Document:定义XML文档
Element:定义XML元素
Text:定义XML文本节点
Attribute:定义了XML 的属性

DOM4J下载和导入项目

1、下载相关jar包
方法一:去DOM4j官网
在这里插入图片描述

方法二:我的百度网盘提取
这官网有限制,有的同学访问不了可以通过百度网盘获取jar包。

通过网盘分享的文件:dom4j
链接: https://pan.baidu.com/s/1301CPh5h7yv1wa1ddvUqtQ?pwd=dsvj
提取码: dsvj

2、将下载的jar包导入到idea项目中去
在这里插入图片描述
在这里插入图片描述

3、将jar包添加到库中
在这里插入图片描述
点击确定,打开lib出现如下界面就说明添加成功。
在这里插入图片描述

DOM4j代码编写
获取所有值

解析器的构造方法

构造方法说明
public SAXReader()xml解析器对象

解析器对象中的方法

方法说明
public Document read(String systemId)读取Xml文件

Document类中的方法

方法说明
Element getRootElement();获取根元素对象
public String getName()获取元素标签名
public String attributeValue(QName qName)获取元素的属性名
public String getText()获取元素的内容
public List<Element> elements()获取所有一级子标签
public List elements(String name)获取所有一级子标签中的指定标签
public Element element(String name)获取一级子标签中的指定标签,若该标签有多个则获取第一个
<?xml version="1.0" encoding="GB2312"?>
<PhoneInfo><Brand name="华为"><Type name="U8650"/><Type name="HW123"/><Type name="HW321"/></Brand><Brand name="苹果"><Type name="iPhone4"/></Brand>
</PhoneInfo>
package com.hsh.exercise5;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.util.List;public class Main {public static void main(String[] args) throws Exception {
//创建一个dom4j提供的解析器对象SAXReader saxReader = new SAXReader();//将xml文件读取到我们的内存当中,获取到这个Document 对象之后就可以读取里面的数据了Document document = saxReader.read("./src/com/hsh/exercise5/收藏信息.xml");System.out.println("---获取根元素---");//1、获取根元素对象里面的所有信息,下面根据这个根元素对象去获取想要的数据Element rootElement = document.getRootElement();System.out.println(rootElement.getName());// PhoneInfoSystem.out.println("---获取所有一级子标签---");//2、获取根元素里面的一级子元素List<Element> elements = rootElement.elements();for (Element element : elements){// 获取标签名System.out.println(element.getName());// 获取属性值System.out.println(element.attributeValue("name"));// 获取标签内容 这是空,因为没有设置内容。System.out.println(element.getText());}// Brand// 华为// Brand// 苹果System.out.println("---获取所有一级子标签中的指定标签---");//获取节点名称为books下所有子节点List<Element> Elist = rootElement.elements("Brand");for (Element element : Elist){System.out.println(element.getName());}// Brand// BrandSystem.out.println("---获取一级子标签中的指定标签---");// 如果重复,则获取第一个Element element = rootElement.element("Brand");System.out.println(element.getName());// Brand}
}
修改值和删除值
方法说明
public Node detach()删除dom元素(标签)
public void setAttributeValue(String name, String value)修改属性值

原文件

<?xml version="1.0" encoding="GB2312"?>
<PhoneInfo> <Brand name="华为"> <Type name="U8650"/>  <Type name="HW123"/>  <Type name="HW321"/> </Brand>  <Brand name="苹果"> <Type name="iPhone4"/> </Brand> 
</PhoneInfo>

修改

package com.hsh.exercise5;import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.FileWriter;
import java.util.List;public class DelUpdXml {public static void main(String[] args) throws Exception {//创建一个dom4j提供的解析器对象SAXReader saxReader = new SAXReader();//将xml文件读取到我们的内存当中,获取到这个Document 对象之后就可以读取里面的数据了Document document = saxReader.read("./src/com/hsh/exercise5/收藏信息.xml");// 获取根元素对象Element rootElement = document.getRootElement();System.out.println(rootElement.getName());// 获取所有一级子标签List<Element> elements = rootElement.elements();for (int i = 0; i < elements.size(); i++){if(elements.get(i).attributeValue("name").equals("苹果")){// 删除elements.get(i).detach();}else {// 修改elements.get(i).setAttributeValue("name", "华为手机");}}// 设置XML文件的格式OutputFormat outputFormat = OutputFormat.createPrettyPrint();outputFormat.setEncoding("GB2312");   // 设置编码格式// 写入XML文件的位置 以及指定的格式XMLWriter xmlWriter=new XMLWriter(new FileWriter("./src/com/hsh/exercise5/exercise.xml"),outputFormat);// 开始写入XML文件   写入Document对象xmlWriter.write(document);xmlWriter.close();}
}

结果

<?xml version="1.0" encoding="GB2312"?><PhoneInfo> <Brand name="华为手机"> <Type name="U8650"/>  <Type name="HW123"/>  <Type name="HW321"/> </Brand> 
</PhoneInfo>
添加值并保存文件

添加相关方法

方法说明
public static Element createElement(String name)创建元素(标签)
Element addAttribute(String var1, String var2);设置元素的属性
public void add(Element element)添加元素()中是传入的子元素

保存文件相关方法

方法说明
public static OutputFormat createPrettyPrint()创建xml格式
public XMLWriter(Writer writer, OutputFormat format)参数分别是java的输出流和创建xml格式
public void write(Document doc)写入Document对象
public void close()关闭流
package com.hsh.exercise5;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;import java.io.FileWriter;public class WriteXML {public static void main(String[] args) throws Exception {// 创建根元素对象Element rootElement = DocumentHelper.createElement("PhoneInfo");// 创建子元素Element Brand = DocumentHelper.createElement("Brand");Brand.addAttribute("name","华为");Element Type  = DocumentHelper.createElement("Type");// 设置子元素的属性Type.addAttribute("name","P10");Brand.add(Type);rootElement.add(Brand);// 创建Document对象Document document = DocumentHelper.createDocument(rootElement);// 设置XML文件的格式OutputFormat outputFormat = OutputFormat.createPrettyPrint();outputFormat.setEncoding("GB2312");   // 设置编码格式// 写入XML文件的位置 以及指定的格式XMLWriter xmlWriter=new XMLWriter(new FileWriter("./src/com/hsh/exercise5/exercise.xml"),outputFormat);// 开始写入XML文件   写入Document对象xmlWriter.write(document);xmlWriter.close();}
}

// 输出结果

<?xml version="1.0" encoding="GB2312"?><PhoneInfo><Brand name="华为"><Type name="P10"/></Brand>
</PhoneInfo>

案例:使用DOM4J解析XML文件

  1. 显示手机收藏信息
  2. 保存手机收藏信息
  3. 为手机收藏信息添加新的节点
  4. 修改/删除手机收藏信息节点
package com.hsh.exercise5;public class Test {public static void main(String[] args) throws Exception {XmlServise xmlServise = new XmlServise("./src/com/hsh/exercise5/收藏信息.xml");xmlServise.addElemnet("小米","小米15");xmlServise.addElemnet("小米","小米14");xmlServise.addElemnet("三星","酸14");xmlServise.addElemnet("三星","三星14");xmlServise.addElemnet("三星","小米14");xmlServise.delType("三星","小米14");xmlServise.delBrand("三星");xmlServise.updateType("小米","小米14","小米13");xmlServise.updateBrand("小米","三星");xmlServise.updateBrand("三星","小米");xmlServise.save();xmlServise.print();}
}
package com.hsh.exercise5;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.FileWriter;
import java.util.List;public class XmlServise {public Document document;public String url;SAXReader saxReader = new SAXReader();public XmlServise(String url) throws Exception {this.url = url;this.document =saxReader.read(url);}public void print(){// 获取根节点Element rootElement = document.getRootElement();// 获取根节点的所有子标签List<Element> elements = rootElement.elements();for (int i = 0; i < elements.size(); i++){System.out.print("手机品牌:");//  获取属性值System.out.print(elements.get(i).attributeValue("name")+",");System.out.print("手机型号:");for (int j = 0; j < elements.get(i).elements().size(); j++){//  获取属性System.out.print(elements.get(i).elements().get(j).attributeValue("name")+"  ");}System.out.println();}}public void save() throws Exception {// 设置XML文件的格式OutputFormat outputFormat = OutputFormat.createPrettyPrint();outputFormat.setEncoding("UTF-8");XMLWriter  xmlWriter=new XMLWriter(new FileWriter(url),outputFormat);xmlWriter.write(document);xmlWriter.close();}public void addElemnet(String brand, String type) throws Exception{// 获取根节点Element rootElement = document.getRootElement();boolean isBrandExist = false;boolean isTypeExist = false;// 遍历查找是否有brand的name属性的名字相同的List<Element> elements = rootElement.elements();for (int i = 0; i < elements.size(); i++){if(elements.get(i).attributeValue("name").equals(brand)){isBrandExist = true;List<Element> elements1 = elements.get(i).elements();for (int j = 0; j < elements1.size(); j++){if(elements1.get(j).attributeValue("name").equals(type)){isTypeExist = true;}}}}if(isBrandExist){if(isTypeExist){// 不添加}else {// 遍历找到该品牌并添加for (int i = 0; i < elements.size(); i++){if(elements.get(i).attributeValue("name").equals(brand)){Element element = DocumentHelper.createElement("type");element.addAttribute("name",type);elements.get(i).add(element);}}}}else {Element element = DocumentHelper.createElement("brand");element.addAttribute("name",brand);Element element1 = DocumentHelper.createElement("type");element1.addAttribute("name",type);element.add(element1);rootElement.add(element);}}public void delType(String brand, String type) {// 获取根节点Element rootElement = document.getRootElement();for (int i = 0; i < rootElement.elements().size(); i++){if(rootElement.elements().get(i).attributeValue("name").equals(brand)){for (int j = 0; j < rootElement.elements().get(i).elements().size(); j++){if(rootElement.elements().get(i).elements().get(j).attributeValue("name").equals(type)){rootElement.elements().get(i).elements().remove(j);}}}}}public void delBrand(String brand) {// 获取根节点Element rootElement = document.getRootElement();for (int i = 0; i < rootElement.elements().size(); i++){if(rootElement.elements().get(i).attributeValue("name").equals(brand)){rootElement.elements().remove(i);}}}public void updateType(String brand, String name, String newName) {// 获取根节点Element rootElement = document.getRootElement();for (int i = 0; i < rootElement.elements().size(); i++){if(rootElement.elements().get(i).attributeValue("name").equals(brand)){for (int j = 0; j < rootElement.elements().get(i).elements().size(); j++){if(rootElement.elements().get(i).elements().get(j).attributeValue("name").equals(name)){rootElement.elements().get(i).elements().get(j).addAttribute("name",newName);}}}}}public void updateBrand(String brand, String newBrand) {// 获取根节点Element rootElement = document.getRootElement();for (int i = 0; i < rootElement.elements().size(); i++){if(rootElement.elements().get(i).attributeValue("name").equals(brand)){rootElement.elements().get(i).addAttribute("name",newBrand);}}}
}

结果

<?xml version="1.0" encoding="UTF-8"?>
<PhoneInfo> <Brand name="华为"> <Type name="U8650"/>  <Type name="HW123"/>  <Type name="HW321"/> </Brand>  <Brand name="苹果"> <Type name="iPhone4"/> </Brand>  <brand name="小米"><type name="小米15"/><type name="小米13"/></brand>
</PhoneInfo>

综合案例

<?xml version="1.0" encoding="GBK"?>
<citys><city id='010'><cityname>北京</cityname><cityarea>华北</cityarea><population>2114.8万人</population></city><city id='021'><cityname>上海</cityname><cityarea>华东</cityarea><population>2,500万人</population></city><city id='020'><cityname>广州</cityname><cityarea>华南</cityarea><population>1292.68万人</population></city><city id='028'><cityname>成都</cityname><cityarea>华西</cityarea><population>1417万人</population></city>
</citys>

(1)使用dom4j将信息存入xml中
(2)读取信息,并打印控制台
(3)添加一个city节点与子节点
(4)使用socket TCP协议编写服务端与客户端,
客户端输入城市ID,服务器响应相应城市信息
(5)使用socket TCP协议编写服务端与客户端,客户端要求用户输入city对象,服务端接收并使用dom4j保存至XML文件

请参考我的之前的博客 -----> java之网络编程
—>java之IO流

解析

这道题我的思路是
将客户端和服务端抽象成类,都有接收和发送功能。
然后把xml文件的添加,保存,查询都给保存起来。

citys.xml

<?xml version="1.0" encoding="UTF-8"?>
<citys> <city id="010"> <cityname>北京</cityname>  <cityarea>华北</cityarea>  <population>2114.8万人</population> </city>  <city id="021"> <cityname>上海</cityname>  <cityarea>华东</cityarea>  <population>2,500万人</population> </city>  <city id="020"> <cityname>广州</cityname>  <cityarea>华南</cityarea>  <population>1292.68万人</population> </city>  <city id="028"> <cityname>成都</cityname>  <cityarea>华西</cityarea>  <population>1417万人</population> </city>
</citys>

Server.java

package com.hsh.homework1;import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public int port;ServerSocket s;Socket socket;OutputStream os;InputStream is;public Server(int port) {this.port = port;}public void start() throws Exception {System.out.println("服务器启动成功");s = new ServerSocket(port);// 每使用一次 accept 说明一个客户端连接// 再次使用就和上一次的客户端连接断开socket = s.accept(); // 只 accept 一次is = socket.getInputStream();os = socket.getOutputStream();System.out.println("客户端已连接");}public void stop() throws Exception {s.close();}/*** 发送消息 比如返回该城市的信息* @param msg* @throws Exception*/public void responseMsg(String msg) throws Exception {System.out.println("服务器开始发送");os.write((msg+"END").getBytes());System.out.println("服务器发送成功");}/*** 接收指令* @return* @throws Exception*/public String receiveMsg() throws Exception {System.out.println("服务器开始接收");byte[] b = new byte[1024];int len;String str = "";boolean receivedEnd = false;while (!receivedEnd && (len = is.read(b)) != -1) {str += new String(b, 0, len);if (str.contains("END")) {str = str.replace("END", ""); // 去掉结束符receivedEnd = true;}}return str;}}

ServerTest.java

package com.hsh.homework1;public class ServerTest {public static void main(String[] args) throws Exception {Server server = new Server(9999);server.start();XmlServise xmlServise = new XmlServise("src/com/hsh/homework1/citys.xml");while (true) {String msg = server.receiveMsg();System.out.println("收到客户端指令: " + msg);switch (msg){case "1":// 接收要查询的省份idString provinceId = server.receiveMsg();System.out.println("查询省份id: " + provinceId);String cityInfo = xmlServise.getCityInfo(provinceId);server.responseMsg(cityInfo);System.out.println();break;case "2":String addCityInfo =server.receiveMsg();System.out.println("添加城市信息: " + addCityInfo);String[] arr = Utils.split(addCityInfo);xmlServise.addCity(arr[0], arr[1], arr[2], arr[3]);xmlServise.save();break;default:server.responseMsg("无效指令");break;}}}
}

Client.java

package com.hsh.homework1;import java.io.OutputStream;
import java.lang.reflect.Array;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;public class Client {String url;int port;Socket socket;OutputStream os;public Client(String url, int port) {this.url = url;this.port = port;}public void start() throws Exception {socket = new Socket(url, port);System.out.println("客户端启动成功");}/*** 接收消息* @return* @throws Exception*/public String receiveMsg() throws Exception {System.out.println("客户端开始接收");socket.getInputStream();byte[] b = new byte[1024];int len;String str = "";// 循环读取,直到读取到结束符,不然可能会卡在这不往下走。boolean receivedEnd = false;while (!receivedEnd && (len = socket.getInputStream().read(b)) != -1) {str += new String(b, 0, len);if (str.contains("END")) {str = str.replace("END", ""); // 去掉结束符receivedEnd = true;}}System.out.println("客户端接收成功");return str;}/*** 关闭** @throws Exception*/public void stop() throws Exception {os.close();socket.close();}/*** 发送消息** @param instructions* @throws Exception*/public void sendInstructions(String instructions) throws Exception {System.out.println("客户端开始发送");os = socket.getOutputStream();os.write((instructions + "END").getBytes());System.out.println("客户端发送成功");}
}

ClientTest.java

package com.hsh.homework1;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;public class ClientTest {public static void main(String[] args) throws Exception {Client client = new Client("127.0.0.1", 9999);client.start();Scanner sc = new Scanner(System.in);while (true){System.out.println("请选择操作");System.out.println("1.输入城市ID查看城市信息");System.out.println("2.输入城市id,省份,省份归属地,人口数");System.out.println("3.退出");switch (sc.next()){case "1":client.sendInstructions("1");System.out.println("请输入城市ID");
//                    client.sendID(sc.next());client.sendInstructions(sc.next());System.out.println(client.receiveMsg());break;case "2":client.sendInstructions("2");System.out.println("请输入城市ID");String id =sc.next();System.out.println("请输入省份");String province =sc.next();System.out.println("请输入省份归属地");String area =sc.next();System.out.println("请输入人口数");String population =sc.next();List<String> list = new ArrayList<>();list.add(id);list.add(province);list.add(area);list.add(population);client.sendInstructions(list.toString());
//                    client.sendCityInfo(id,province,area,population);break;case "3":System.out.println("退出");client.stop();return;default:System.out.println("请输入正确的选项");break;}}}
}

XmlServise.java

package com.hsh.homework1;import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.FileWriter;public class XmlServise {public Document document;public String url;SAXReader saxReader = new SAXReader();public XmlServise(String url) throws Exception {this.url = url;this.document =saxReader.read(url);}public String printXml() {// 直接输出xml内容return document.asXML();}public void print() {// 直接输出xml内容// System.out.println(document.asXML());// System.out.println();Element rootElement = document.getRootElement();for (int i = 0; i < rootElement.elements().size(); i++){Element element = rootElement.elements().get(i);System.out.println(element.attributeValue("id"));for (int j = 0; j < element.elements().size(); j++){Element element1 = element.elements().get(j);System.out.println("    "+element1.getText());}}}public void addCity(String number, String cityname, String cityarea, String population) {Element rootElement = document.getRootElement();// 创建city元素Element city = DocumentHelper.createElement("city");city.addAttribute("id",number);// 创建cityname元素Element citynameElement = DocumentHelper.createElement("cityname");citynameElement.setText(cityname);// 创建cityarea元素Element cityareaElement = DocumentHelper.createElement("cityarea");cityareaElement.setText(cityarea);// 创建population元素Element populationElement = DocumentHelper.createElement("population");populationElement.setText(population);city.add(citynameElement);city.add(cityareaElement);city.add(populationElement);rootElement.add(city);}/*** 获取城市信息* @param provinceId* @return*/public String getCityInfo(String provinceId) {Element rootElement = document.getRootElement();for (int i = 0; i < rootElement.elements().size(); i++){Element element = rootElement.elements().get(i);if(element.attributeValue("id").equals(provinceId)){StringBuilder stringBuilder = new StringBuilder();for (int j = 0; j < element.elements().size(); j++){Element element1 = element.elements().get(j);stringBuilder.append(element1.getText());stringBuilder.append(" ");}return stringBuilder.toString();}}return "没有此城市";}public void save() throws Exception{OutputFormat outputFormat = OutputFormat.createPrettyPrint();outputFormat.setEncoding("UTF-8");XMLWriter  xmlWriter=new XMLWriter(new FileWriter(url),outputFormat);xmlWriter.write(document);xmlWriter.close();}
}

Utils.java

package com.hsh.homework1;public class Utils {public static String[] split(String str) {String[] arr = str.substring(1, str.length() - 1).split(",");for (int i = 0; i < arr.length; i++) {arr[i] = arr[i].trim();System.out.println(arr[i]);}return arr;}
}

运行结果

客户端启动成功
请选择操作
1.输入城市ID查看城市信息
2.输入城市id,省份,省份归属地,人口数
3.退出
1
客户端开始发送
客户端发送成功
请输入城市ID
010
客户端开始发送
客户端发送成功
客户端开始接收
客户端接收成功
北京 华北 2114.8万人 请选择操作
1.输入城市ID查看城市信息
2.输入城市id,省份,省份归属地,人口数
3.退出
2
客户端开始发送
客户端发送成功
请输入城市ID
035
请输入省份
河南
请输入省份归属地
华中
请输入人口数
1234万人
客户端开始发送
客户端发送成功请选择操作
1.输入城市ID查看城市信息
2.输入城市id,省份,省份归属地,人口数
3.退出
1
客户端开始发送
客户端发送成功
请输入城市ID
035
客户端开始发送
客户端发送成功
客户端开始接收
客户端接收成功
河南 华中 1234万人 请选择操作
1.输入城市ID查看城市信息
2.输入城市id,省份,省份归属地,人口数
3.退出
服务器启动成功
客户端已连接
服务器开始接收
收到客户端指令: 1
服务器开始接收
查询省份id: 010
服务器开始发送
服务器发送成功服务器开始接收
收到客户端指令: 2
服务器开始接收
添加城市信息: [035, 河南, 华中, 1234万人]
035
河南
华中
1234万人
服务器开始接收
收到客户端指令: 1
服务器开始接收
查询省份id: 035
服务器开始发送
服务器发送成功服务器开始接收
<?xml version="1.0" encoding="UTF-8"?><citys> <city id="010"> <cityname>北京</cityname>  <cityarea>华北</cityarea>  <population>2114.8万人</population> </city>  <city id="021"> <cityname>上海</cityname>  <cityarea>华东</cityarea>  <population>2,500万人</population> </city>  <city id="020"> <cityname>广州</cityname>  <cityarea>华南</cityarea>  <population>1292.68万人</population> </city>  <city id="028"> <cityname>成都</cityname>  <cityarea>华西</cityarea>  <population>1417万人</population> </city>  <city id="035"><cityname>河南</cityname><cityarea>华中</cityarea><population>1234万人</population></city>
</citys>

相关文章:

java中XML的使用

文章目录 什么是XML特点XML作用XML的编写语法基本语法特殊字符编写 约束XML的书写格式DTD文档schema文档属性命名空间XML命名空间的作用 解析XML的方法​​DOM解析XMLDOM介绍DOM解析包&#xff1a;org.w3c.dom常用接口DOM解析包的使用保存XML文件添加DOM节点修改/删除DOM节点 S…...

Spark SQL 之 Analyzer

Spark SQL 之 Analyzer // Special case for Project as it supports lateral column alias.case p: Project =>val resolvedNoOuter = p.projectList.map(resolveExpressionByPlanChildren(_, p...

Java - Junit框架

单元测试&#xff1a;针对最小的功能单元(方法)&#xff0c;编写测试代码对该功能进行正确性测试。 Junit&#xff1a;Java语言实现的单元测试框架&#xff0c;很多开发工具已经集成了Junit框架&#xff0c;如IDEA。 优点 编写的测试代码很灵活&#xff0c;可以指某个测试方法…...

麒麟系统ARM64架构部署mysql、jdk和java项目

麒麟系统ARM64架构部署mysql、jdk和java项目 一、mysql8的安装 操作步骤&#xff1a; 先下载mysql安装包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 由于官网里&#xff0c;mysql5.7以及更低版本不支持arm版本的&#xff0c;只能安装mysql8。…...

修复“ImportError: DLL load failed while importing lib: 找不到指定的程序”笔记

#工作记录 一、问题描述 在运行CosyVoice_For_Windows项目时&#xff0c;出现以下报错&#xff1a; Traceback (most recent call last): File "D:\ProgramData\anaconda3\envs\CosyVoice\Lib\pydoc.py", line 457, in safeimport module __import__(path) …...

vllm量化03—INT4 W4A16

本系列基于Qwen2.5-7B&#xff0c;学习如何使用vllm量化&#xff0c;并使用benchmark_serving.py、lm_eval 测试模型性能和评估模型准确度。 测试环境为&#xff1a; OS: centos 7 GPU: nvidia l40 driver: 550.54.15 CUDA: 12.3本文是该系列第3篇——INT4 W4A16 一、量化 f…...

VScode各文件转化为PDF的方法

文章目录 代码.py文件.ipynb文本和代码夹杂的文件方法 1:使用 VS Code 插件(推荐)步骤 1:安装必要插件步骤 2:安装 `nbconvert`步骤 3:间接导出(HTML → PDF)本文遇见了系列错误:解决方案:问题原因步骤 1:降级 Jinja2 至兼容版本步骤 2:确保 nbconvert 版本兼容替代…...

AI日报 · 2025年5月15日|GPT-4.1 登陆 ChatGPT

AI日报 2025年5月15日&#xff5c;GPT-4.1 登陆 ChatGPT 1、OpenAI 在 ChatGPT 全面开放 GPT-4.1 与 GPT-4.1 mini 北京时间 5 月 14 日晚&#xff0c;OpenAI 在官方 Release Notes 中宣布&#xff1a;专为复杂代码与精细指令场景打造的 GPT-4.1 正式加入 ChatGPT&#xff0…...

高效管理多后端服务:Nginx 配置与实践指南

在现代的 Web 开发和运维中&#xff0c;一个系统往往由多个后端服务组成&#xff0c;每个服务负责不同的功能模块。例如&#xff0c;一个电商网站可能包括用户服务、订单服务和支付服务&#xff0c;每个服务都运行在独立的服务器或容器中。为了高效地管理这些服务并提供统一的访…...

从代码学习深度学习 - 实战 Kaggle 比赛:图像分类 (CIFAR-10 PyTorch版)

文章目录 前言1. 读取并整理数据集1.1 读取标签文件1.2 划分训练集和验证集1.3 整理测试集1.4 执行数据整理2. 图像增广2.1 训练集图像变换2.2 测试集(和验证集)图像变换3. 读取数据集3.1 创建 Dataset 对象3.2 创建 DataLoader 对象4. 定义模型4.1 获取 ResNet-18 模型4.2 损…...

什么是路由器环回接口?

路由器环回接口&#xff08;LoopbackInterface&#xff09;是网络设备中的一种逻辑虚拟接口&#xff0c;不依赖物理硬件&#xff0c;但在网络配置和管理中具有重要作用。以下是其核心要点&#xff1a; 一、基本特性 1.虚拟性与稳定性 环回接口是纯软件实现的逻辑接口&#x…...

【高频面试题】LRU缓存

文章目录 1 相关前置知识&#xff08;OS&#xff09;2 面试题 16.25. LRU 缓存2.1 题面2.2 示例2.3 解法1 &#xff08;双端队列哈希表&#xff09;思路 2.4 解法2思路 3 参考 1 相关前置知识&#xff08;OS&#xff09; 为什么需要页面置换算法&#xff1a;当进程运行时&…...

Golang

本文来源 &#xff1a;腾讯元宝 Go语言&#xff08;又称Golang&#xff09;是由Google开发的一种现代编程语言&#xff0c;自2009年发布以来&#xff0c;因其简洁性、高性能和内置并发支持而广受欢迎。以下是关于Go语言的核心特点和优势的总结&#xff1a; 1. ​​核心特点​​…...

20250515配置联想笔记本电脑IdeaPad总是使用独立显卡的步骤

20250515配置联想笔记本电脑IdeaPad总是使用独立显卡的步骤 2025/5/15 19:55 百度&#xff1a;intel 集成显卡 NVIDIA 配置成为 总是用独立显卡 百度为您找到以下结果 ?要将Intel集成显卡和NVIDIA独立显卡配置为总是使用独立显卡&#xff0c;可以通过以下步骤实现?&#xff…...

『已解决』Python virtualenv_ error_ unrecognized arguments_--wheel-bundle

&#x1f4e3;读完这篇文章里你能收获到 &#x1f40d; 了解 virtualenv 参数错误的原因及解决方案&#x1f4e6; 学习如何正确配置 Python 虚拟环境 文章目录 前言一、问题描述1.1 错误现象1.2 影响范围 二、问题分析2.1 根本原因 三、解决方案3.1 兼容处理3.2 完整解决方案 …...

使用 Apache POI 生成 Word 文档

创建一个包含标题、段落和表格的简单文档。 步骤 1:添加依赖 确保你的项目中已经添加了 Apache POI 的依赖。如果你使用的是 Maven,可以在 pom.xml 中添加以下内容: <dependency><groupId>org.apache.poi</groupId>...

表记录的检索

1.select语句的语法格式 select 字段列表 from 表名 where 条件表达式 group by 分组字段 [having 条件表达式] order by 排序字段 [asc|desc];说明&#xff1a; from 子句用于指定检索的数据源 where子句用于指定记录的过滤条件 group by 子句用于对检索的数据进行分组 ha…...

【PX4飞控】在 Matlab Simulink 中使用 Mavlink 协议与 PX4 飞行器进行交互

这里列举一些从官网收集的比较有趣或者实用的功能。 编写 m 脚本与飞行器建立 UDP 连接&#xff0c;并实时可视化 Mavlink 消息内容&#xff0c;或者读取脚本离线分析数据。不光能显示 GPS 位置或者姿态等信息的时间曲线&#xff0c;可以利用 Matlab Plot 功能快速定制化显示一…...

文章复现|(1)整合scRNA-seq 和空间转录组学揭示了子宫内膜癌中 MDK-NCL 依赖性免疫抑制环境

https://www.frontiersin.org/journals/immunology/articles/10.3389/fimmu.2023.1145300/full 目标&#xff1a;肿瘤微环境(TME)在子宫内膜癌(EC)的进展中起着重要作用。我们旨在评估EC的TME中的细胞群体。 方法&#xff1a;我们从GEO下载了EC的单细胞RNA测序(scRNA-seq)和空…...

自用Vscode 配置c++ debug环境

前言 使用vscode配置c debug环境的好处 1、可以借助vscode方便轻量的扩展和功能 2、避免了传统使用gdb 复杂按键以及不够直观的可视化 3、方便一次运行&#xff0c;断点处查看变量&#xff0c;降低找bug难度 4、某大公司项目采用类似配置&#xff0c;经过实践检验 配置c运行环…...

STM32单片机内存分配详细讲解

单片机的内存无非就两种&#xff0c;内部FLASH和SRAM&#xff0c;最多再加上一个外部的FLASH拓展。在这里我以STM32F103C8T6为例子讲解FLASH和SRAM。 STM32F103C8T6具有64KB的闪存和20KB的SRAM。 一. Flash 1.1 定义 非易失性存储器&#xff0c;即使在断电后&#xff0c;其所…...

从算力困境到创新突破:GPUGEEK如何重塑我的AI开发之旅

目录 从算力困境到创新突破&#xff1a;GPUGEEK如何重塑我的AI开发之旅开发者的算力挣扎&#xff1a;一个不得不面对的现实AI算力市场的尴尬现状&#xff1a;为什么我们需要另辟蹊径1. 资源分配失衡与价格壁垒2. 技术门槛与环境复杂性 GPUGEEK深度剖析&#xff1a;不只是又一个…...

基于OpenCV的人脸微笑检测实现

文章目录 引言一、技术原理二、代码实现2.1 关键代码解析2.1.1 模型加载2.1.2 图像翻转2.1.3 人脸检测 微笑检测 2.2 显示效果 三、参数调优建议四、总结 引言 在计算机视觉领域&#xff0c;人脸检测和表情识别一直是热门的研究方向。今天我将分享一个使用Python和OpenCV实现…...

2025认证杯数学建模第二阶段A题小行星轨迹预测思路+模型+代码

2025认证杯数学建模第二阶段思路模型代码&#xff0c;详细内容见文末名片 一、问题重述 1.1 问题背景 在浩瀚无垠的宇宙中&#xff0c;近地小行星&#xff08;NEAs&#xff09;宛如一颗颗神秘的“太空子弹”&#xff0c;其轨道相对接近地球&#xff0c;给我们的蓝色星球带来…...

Uniapp 安卓实现讯飞语音听写(复制即用)

在移动应用开发中&#xff0c;语音交互功能能够极大提升用户体验&#xff0c;让操作更加便捷自然。讯飞语音听写技术凭借其高准确率和稳定性&#xff0c;成为众多开发者的选择。本文将详细介绍如何在 Uniapp 项目中&#xff0c;实现安卓端的讯飞语音听写功能&#xff0c;帮助你…...

【FileZilla】 从事件类型到消息类型的函数形参类型转化

本篇其实是前篇【Filezilla】 dispatch函数重载的例子-CSDN博客的一个补充&#xff0c;其中涉及到【FileZilla】事件调用机制代码解析-CSDN博客中的事件分发机制时钩子函数的参数传递怎么实现的。跟【FileZilla】sftp协议的数据传输上传和下载-CSDN博客同样&#xff0c;用事件是…...

python打卡day26

函数、参数、变量 知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 def function_name(parameter…...

RPC框架源码分析学习(二)

RPC框架源码分析与原理解读 前言 在分布式系统开发中&#xff0c;远程过程调用(RPC)是一项基础且关键的技术。通过对KVstorageBaseRaft-cpp项目RPC模块的源码分析&#xff0c;我深入理解了RPC框架的工作原理和实现细节。本文将从程序员视角分享我的学习心得。 框架概述 本项…...

算法分析:蛮力法

一、实验目的 1 掌握蛮力法的设计思想(利用计算机去穷举所有的可能解,再从中依次找出可行解) 2 掌握蛮力法的具体实现和时间复杂度分析 3 理解蛮力法的常见特性 实验要求&#xff1a;先用伪代码描述利用蛮力法解决的算法解决方案&#xff0c;再用程序实现&#xff0c;计算时间…...

构建RAG混合开发---PythonAI+JavaEE+Vue.js前端的实践

写在前文&#xff1a;之所以设计这一套流程&#xff0c;是因为 Python在前沿的科技前沿的生态要比Java好&#xff0c;而Java在企业级应用层开发比较活跃&#xff1b; 毕竟许多企业的后端服务、应用程序均采用Java开发&#xff0c;涵盖权限管理、后台应用、缓存机制、中间件集成…...

游戏引擎学习第280天:精简化的流式实体sim

回顾并为今天的内容做铺垫 今天的任务是让之前关于实体存储方式的改动真正运行起来。我们现在希望让实体系统变得更加真实和实用&#xff0c;能够支撑我们游戏实际所需的功能。这就要求我们对它进行更合理的实现和调试。 昨天我们基本让代码编译通过了&#xff0c;但实际上还…...

小程序映射逻辑处理

onLoad: function (options) { // 如果直接从options获取数据 this.setData({ jielunpin:发羽音, birthStr: 1944-01-01 }); // 处理诊断结论 this.processJielunpin(); // 添加一个处理诊断结论的函数 processJielunpin: function() { // 获取jielunpin和birthSt…...

亚马逊,temu测评采购低成本养号策略:如何用一台设备安全批量管理买家账号

只要能够巧妙规避平台的检测和风控措施&#xff0c;测评便可安全进行。 自养号测评&#xff0c;它更便于卖家掌控&#xff0c;且能降低风险。现在很多卖家都是自己养号&#xff0c;自己养号都是精养&#xff0c;不是自动的机刷&#xff0c;买家账号掌握在自己手里&#xff0c;更…...

TCP实现安全传输的核心机制 + TCP的报文讲解(全程图文讲解)

目录 一、TCP的协议和数据报格式 二、TCP常见的核心机制 1. 确认应答 2. 超时重传 3. 连接管理 三次握手&#xff08;建立连接&#xff09; 四次挥手&#xff08;断开连接&#xff09; 常见的状态和整体的传输流程 4. 滑动窗口 5. 流量控制 6. 拥塞控制 7. 延迟应…...

【测试工具】selenium和playwright如何选择去构建自动化平台

构建UI自动化平台服务&#xff0c;在底层选择自动化框架&#xff0c;selenium和playwright这两个如何选择 在构建UI自动化平台服务时&#xff0c;选择底层自动化框架&#xff08;如 Selenium 和 Playwright&#xff09;是一个非常关键的决策&#xff0c;直接影响平台的性能、可…...

ES常识8:ES8.X如何实现热词统计

文章目录 一、数据采集与存储设计1. 确定需记录的字段2. 设计搜索日志索引 二、数据写入与采集三、热门搜索词统计&#xff08;核心逻辑&#xff09;1. 基础版&#xff1a;近 7 天热门搜索词&#xff08;按出现次数排序&#xff09;2. 进阶版&#xff1a;加权热门词&#xff08…...

可解释性AI 综述《Explainable AI for Industrial Fault Diagnosis: A Systematic Review》

一、研究背景与动因&#xff08;Background & Motivation&#xff09; 随着工业4.0与工业5.0的发展&#xff0c;工业生产越来越依赖自动化与智能化手段&#xff0c;以实现高效、预测性维护与运行优化。在这一背景下&#xff0c;人工智能&#xff08;AI&#xff09;与机器学…...

数据可视化-----子图的绘制及坐标轴的共享

目录 绘制固定区域的子图 &#xff08;一&#xff09;、绘制单子图 subplot()函数 Jupyter Notebook的绘图模式 &#xff08;二&#xff09;、多子图 subplots()--可以在规划好的所有区域中一次绘制多个子图 &#xff08;三&#xff09;、跨行跨列 subplot2grid()---将整…...

nginx 配置

proxy_pass 结尾斜杠规则 不带斜杠‌&#xff1a;保留原始请求路径。 location /api {proxy_pass http://backend; # 转发到 http://backend/api }带斜杠‌&#xff1a;剥离 location 匹配的路径前缀。 location /api/ {proxy_pass http://backend/; # 转发到 http://back…...

《从零开始入门递归算法:搜索与回溯的核心思想 + 剑指Offer+leetcode高频面试题实战(含可视化图解)》​

一.递归 1.汉诺塔 题目链接&#xff1a;面试题 08.06. 汉诺塔问题 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a;将A柱子上的盘子借助B柱子全部移动到C柱子上。 算法原理&#xff1a;递归 当A柱子上的盘子只有1个时&#xff0c;我们可以直接将A上的盘子直…...

船舶制造业数字化转型:驶向智能海洋新航道

在全球海洋经济蓬勃发展的当下&#xff0c;船舶制造业作为海洋产业的重要支柱&#xff0c;正面临着前所未有的机遇与挑战。船舶制造周期长、技术复杂&#xff0c;从设计图纸到最终交付&#xff0c;涉及成千上万的零部件和复杂的工艺流程&#xff0c;传统制造模式已难以满足市场…...

SpringBoot 自动装配流程

Spring Boot 的自动装配&#xff08;Auto Configuration&#xff09;是其最核心的特性之一&#xff0c;它让你能“开箱即用”&#xff0c;极大简化了配置。下面是 Spring Boot 自动装配的整体流程&#xff08;从启动到生效&#xff09; 的详细解析&#xff1a; ✅ 一、整体流程…...

Vue 3 实现后端 Excel 文件流导出功能(Blob 下载详解)

&#x1f4a1; 本文以告警信息导出为例&#xff0c;介绍 Vue 3 中如何通过 Axios 调用后端接口并处理文件流&#xff0c;实现 Excel 自动下载功能。 &#x1f4d1; 目录 一、前言 二、后端接口说明 三、前端实现思路 四、导出功能完整代码 五、常见问题处理 六、效果展示 …...

基于IBM BAW的Case Management进行项目管理示例

说明&#xff1a;使用IBM BAW的难点是如何充分利用其现有功能根据实际业务需要进行设计&#xff0c;本文是示例教程&#xff0c;因CASE Manager使用非常简单&#xff0c;这里重点是说明如何基于CASE Manager进行项目管理&#xff0c;重点在方案设计思路上&#xff0c;其中涉及的…...

《Python星球日记》 第78天:CV 基础与图像处理

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、计算机视觉(CV)简介1. 什么是计算机视觉?2. 计算机视觉的应用场景3. 图像的基本属性a》像素(Pixel)b》通道(Channel)c》分辨率(Res…...

Google DeepMind 推出AlphaEvolve

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Flink 1.13.2 日志配置优化:保留最近 7 天日志文件

Flink 1.13.2 日志配置优化:保留最近 7 天日志文件 在使用 Apache Flink 1.13.2 进行流处理任务时,合理的日志配置对于作业的监控、调试和故障排查至关重要。本文将介绍如何通过修改log4j.properties文件,将 Flink 的默认日志配置升级为保留最近 7 天的日志文件配置,并解决…...

【优化算法】协方差矩阵自适应进化策略(Covariance Matrix Adaptation Evolution Strategy,CMA-ES)

CMA-ES&#xff08;Covariance Matrix Adaptation Evolution Strategy&#xff09;算法是一种无导数、基于多元正态分布的迭代优化方法&#xff0c;通过自适应地调整搜索分布的均值、协方差矩阵和步长&#xff0c;能够高效地解决非线性、非凸的连续优化问题。 算法以最大似然和…...

基于Leaflet和天地图的免费运动场所WebGIS可视化-以长沙市为例

目录 前言 一、免费运动场所数据整理 1、本地宝数据简介 2、Java后台数据解析 二、Leaflet前端地图展示 1、基础数据准备 2、具体位置及属性标记 三、成果展示 1、空间位置分布 2、东风路立交桥运动公园 3、芙蓉区花侯路浏阳河大桥下方 4、梅岭国际小区 5、湖南大学…...

399. 除法求值

https://leetcode.cn/problems/evaluate-division/description/?envTypestudy-plan-v2&envIdtop-interview-150思路&#xff1a;读完题后我们可以发现这题的考察已经很明确了就是考我们矩阵&#xff0c;我们将矩阵构建出来后&#xff0c;这题就变成可达性分析题了。 所以解…...