01-XML-04XML处理

XML处理

  1. DOM
    DOM解析要求解析器将整个XML文件全部加载到内存中,生成一个Document对象。

    优点:元素和元素之间保留结构,关系,可以针对元素进行增删改查操作。

    缺点:如果XML文件过大,可能会导致内存溢出。
  2. SAX
    SAX解析是一种更加高效的解析方式。它是逐行扫描,边扫描边解析,并且以时间驱动的方式进行具体的解析,每解析一行都会触发一个事件。

    优点:不会出现内存溢出的问题,可以处理大文件。

    缺点:只能读,不能写。
  3. 常见的解析XML类库
    解析器就是根据不同的解析方式提供具体的实现,为了方便开发人员来解析XML,有一些方便操作的类库。具体如下所示:

    1.dom4j:比较简单的XML解析类库;

    2.Jsoup:功能强大的DOM方式解析的类库,尤其对HTML的解析更加方便,所以可以使用Jsoup来爬取网页的数据。

JDK内置DOM

XML文件

books.xml

<?xml version="1.0" encoding="UTF-8"?>
<books><!-- book至少出现一次 --><book><!-- id --><id>1</id><!-- 书名 --><name>《JAVA从入门到放弃》</name><!-- 作者属性type:可选(man|woman)默认值 “man”属性age:必填属性--><author type="man" age="23">张三</author></book><book><id>2</id><name>《这是一本书》</name><author type="woman" age="32">李四</author></book>
</books>

JDK内置DOM读XML

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;/*** JDK内置DOM读XML** @author Anna.* @date 2024/3/31 17:42*/
public class JavaDomReadDemo {public static void main(String[] args) throws Exception {new JavaDomReadDemo().read();}public void read() throws ParserConfigurationException, IOException, SAXException {// 获取资源路径String path = this.getClass().getResource("books.xml").getPath();// 获取文件判断文件是否存在File file = new File(path);if (!file.exists() || !file.isFile()) {throw new RuntimeException("获取资源失败");}// 从DocumentBuilderFactory获得DocumentBuilder。 DocumentBuilder包含用于从 XML 文档中获取 DOM 文档实例的 API。DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();// parse()方法将 XML 文件解析为DocumentDocument doc = documentBuilder.parse(file);System.out.printf("根节点: %s", doc.getDocumentElement().getNodeName());// 循环打印NodeList nList = doc.getElementsByTagName("book");for (int i = 0; i < nList.getLength(); i++) {Node nNode = nList.item(i);System.out.println("");System.out.printf("元素: %s", nNode.getNodeName());if (nNode.getNodeType() == Node.ELEMENT_NODE) {Element elem = (Element) nNode;String id = elem.getElementsByTagName("id").item(0).getTextContent();String name = elem.getElementsByTagName("name").item(0).getTextContent();Element authorNode = (Element) elem.getElementsByTagName("author").item(0);String author = elem.getElementsByTagName("author").item(0).getTextContent();String type = authorNode.getAttribute("type");String age = authorNode.getAttribute("age");System.out.println("");System.out.printf("id: %s - name:%s - author:%s[type=%s,age=%s]", id, name, author, type, age);}}}}

执行结果

在这里插入图片描述

使用NodeIterator读取文本

import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;/*** JDK内置DOM读XML* 使用NodeIterator读取文本** @author Anna.* @date 2024/3/31 17:42*/
public class JavaDomReadDemo2 {public static void main(String[] args) throws Exception {new JavaDomReadDemo2().read();}public void read() throws ParserConfigurationException, IOException, SAXException {// 获取资源路径String path = this.getClass().getResource("books.xml").getPath();// 获取文件判断文件是否存在File file = new File(path);if (!file.exists() || !file.isFile()) {throw new RuntimeException("获取资源失败");}// 从DocumentBuilderFactory获得DocumentBuilder。 DocumentBuilder包含用于从 XML 文档中获取 DOM 文档实例的 API。DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();// parse()方法将 XML 文件解析为DocumentDocument doc = documentBuilder.parse(file);DocumentTraversal trav = (DocumentTraversal) doc;NodeIterator it = trav.createNodeIterator(doc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, null, true);for (Node node = it.nextNode(); node != null;node = it.nextNode()) {// 判断是否有属性if (node.hasAttributes()) {String attrStr = getAttrStr(node.getAttributes());System.out.printf("元素名称:%s-元素值:%s-属性:%s %n", node.getNodeName(), node.getTextContent(), "".equalsIgnoreCase(attrStr) ? "null" : attrStr, node.getNodeType());} else {System.out.printf("元素名称:%s-元素值:%s%n", node.getNodeName(), node.getTextContent());}}}private String getAttrStr(NamedNodeMap attributes) {StringBuffer sb = new StringBuffer();if (attributes != null && attributes.getLength() > 0) {sb.append("[");for (int i = 0; i < attributes.getLength(); i++) {Node item = attributes.item(i);sb.append(item.getNodeName()).append("=").append(item.getNodeValue()).append(" ");}sb.append("]");}return sb.toString();}
}

执行结果

在这里插入图片描述

使用NodeIterator读取文本自定义NodeFilter

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.traversal.DocumentTraversal;
import org.w3c.dom.traversal.NodeFilter;
import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.SAXException;import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;/*** JDK内置DOM读XML* 使用NodeIterator读取文本自定义NodeFilter* @author Anna.* @date 2024/3/31 17:42*/
public class JavaDomReadDemo3 {public static void main(String[] args) throws Exception {new JavaDomReadDemo3().read();}public void read() throws ParserConfigurationException, IOException, SAXException {// 获取资源路径String path = this.getClass().getResource("books.xml").getPath();// 获取文件判断文件是否存在File file = new File(path);if (!file.exists() || !file.isFile()) {throw new RuntimeException("获取资源失败");}// 从DocumentBuilderFactory获得DocumentBuilder。 DocumentBuilder包含用于从 XML 文档中获取 DOM 文档实例的 API。DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();// parse()方法将 XML 文件解析为DocumentDocument doc = documentBuilder.parse(file);DocumentTraversal trav = (DocumentTraversal) doc;NodeIterator it = trav.createNodeIterator(doc.getDocumentElement(), NodeFilter.SHOW_ELEMENT, new MyFilter(), true);for (Node node = it.nextNode(); node != null;node = it.nextNode()) {// 判断是否有属性if(node.hasAttributes()){String attrStr = getAttrStr(node.getAttributes());System.out.printf("元素名称:%s-元素值:%s-属性:%s %n", node.getNodeName(),node.getTextContent(),"".equalsIgnoreCase(attrStr) ? "null" : attrStr, node.getNodeType());}else {System.out.printf("元素名称:%s-元素值:%s%n", node.getNodeName(),node.getTextContent());}}}private String getAttrStr(NamedNodeMap attributes){StringBuffer sb = new StringBuffer();if(attributes != null && attributes.getLength() > 0){sb.append("[");for(int i = 0; i < attributes.getLength(); i++){Node item = attributes.item(i);sb.append(item.getNodeName()).append("=").append(item.getNodeValue()).append(" ");}sb.append("]");}return sb.toString();}/*** 自定义过滤器*  实现NodeFilter接口*  通过返回NodeFilter.FILTER_ACCEPT和NodeFilter.FILTER_REJECT来控制要使用的节点* @author Anna.* @date 2024/3/31 18:50*/static class MyFilter implements NodeFilter {@Overridepublic short acceptNode(Node thisNode) {if (thisNode.getNodeType() == Node.ELEMENT_NODE) {Element e = (Element) thisNode;String nodeName = e.getNodeName();if ("author".equals(nodeName)) {return NodeFilter.FILTER_ACCEPT;}}return NodeFilter.FILTER_REJECT;}}
}

执行结果

在这里插入图片描述

JDK内置DOM写XML

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;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;
import java.io.File;
import java.util.HashMap;
import java.util.Map;/*** JDK内置DOM写XML** @author Anna.* @date 2024/3/31 17:42*/
public class JavaDomWriteDemo {public static void main(String[] args) throws Exception {new JavaDomWriteDemo().write();}public void write() throws Exception {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.newDocument();// 创建根节点Element root = doc.createElementNS("", "books");doc.appendChild(root);// 设置子元素Map<String, String> book1 = new HashMap<String, String>();book1.put("type", "man");book1.put("age", "34");root.appendChild(createBook(doc, "1", "《JAVA从入门到放弃》", "张三", book1));Map<String, String> book2 = new HashMap<String, String>();book2.put("type", "man");book2.put("age", "34");root.appendChild(createBook(doc, "2", "《这是一本书》", "李四", book2));// Java DOM 使用Transformer生成 XML 文件。 之所以称为转换器,是因为它也可以使用 XSLT 语言转换文档。TransformerFactory transformerFactory = TransformerFactory.newInstance();Transformer transf = transformerFactory.newTransformer();// 设置文档的编码和缩进transf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");transf.setOutputProperty(OutputKeys.INDENT, "yes");transf.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");// DOMSource保存 DOM 树DOMSource source = new DOMSource(doc);// 获取资源路径String path = System.getProperty("user.dir") + File.separator + "01-xml-04-xml-handle/java-dom-demo/src/main/resources";File myFile = new File(path + File.separator + "books2.xml");StreamResult console = new StreamResult(System.out);StreamResult file = new StreamResult(myFile);// 写入控制台和文件transf.transform(source, console);transf.transform(source, file);}/*** 创建Book* e** @param doc* @param id* @param name* @param author* @return org.w3c.dom.Node* @author Anna.* @date 2024/3/31 19:03*/private static Node createBook(Document doc, String id, String name, String author, Map<String, String> attrsMap) {Element book = doc.createElement("book");book.setAttribute("id", id);book.appendChild(createUserElement(doc, "id", id, null));book.appendChild(createUserElement(doc, "name", name, null));book.appendChild(createUserElement(doc, "author", author, attrsMap));return book;}/*** 创建子节点** @param doc* @param name* @param value* @param attrsMap* @return org.w3c.dom.Node* @author Anna.* @date 2024/3/31 19:02*/private static Node createUserElement(Document doc, String name, String value, Map<String, String> attrsMap) {Element node = doc.createElement(name);node.appendChild(doc.createTextNode(value));if (attrsMap != null && attrsMap.size() > 0) {for (Map.Entry entry : attrsMap.entrySet()) {node.setAttribute(entry.getKey().toString(), entry.getValue().toString());}}return node;}
}

执行结果

在这里插入图片描述

DOM4J读写XML

引入MAVEN坐标

<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.3</version>
</dependency>

SAX读XML

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.Iterator;/*** SAX读XML文件** @author Anna.* @date 2024/3/31 19:40*/
public class SaxReadDemo {public static void main(String[] args) {new SaxReadDemo().read();}public void read() {// 获取资源路径String path = this.getClass().getResource("books.xml").getPath();// 获取文件判断文件是否存在File file = new File(path);if (!file.exists() || !file.isFile()) {throw new RuntimeException("获取资源失败");}// 1 创建SAXReader对象,用于读取XML文件SAXReader saxReader = new SAXReader();// 读取XML文件,得到document对象try {Document document = saxReader.read(new File(path));// 获取根元素Element rootElement = document.getRootElement();System.out.println("根元素名称:" + rootElement.getName());// 获取根元素下所有子元素Iterator<?> iterator = rootElement.elementIterator();while (iterator.hasNext()) {// 取出元素Element element = (Element) iterator.next();System.out.println("子元素名称:" + element.getName());// 获取子元素Element id = element.element("id");Element name = element.element("name");Element author = element.element("author");System.out.printf("子元素的子元素值-id:%s -name: %s --author:%s[type=%s,age=%s]%n",id.getStringValue(), name.getText(),author.getText(),// 获取author属性typeauthor.attribute("type").getValue(),// 获取author属性ageauthor.attribute("age").getValue());}} catch (DocumentException e) {e.printStackTrace();}}
}

执行结果

在这里插入图片描述

DOM4J写XML

Dom4j的常用API说明

方法操作
Element getRootElement();获取XML文件的根节点
String getName();返回标签的名称
List < Element > elements();获取标签所有的子标签
String arrtributeVallue(String name) ;获取指定属性名称的属性值
String getText();获取标签的文本
String elementText(String name);获取指定名称的子标签的文本,返回子标签文本的值
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.File;
import java.io.FileWriter;
import java.io.IOException;/*** Dom4j写XML文件** @author Anna.* @date 2024/3/31 19:40*/
public class Dom4jWriteDemo {public static void main(String[] args) {String path = System.getProperty("user.dir") + File.separator + "01-xml-04-xml-handle/dom4j-demo/src/main/resources";new Dom4jWriteDemo().write(path + File.separator + "books2.xml");}public void write(String path) {// 通过documentHelper生成一个Documen对象Document document = DocumentHelper.createDocument();// 添加并得到根元素Element books = document.addElement("books");// 为根元素添加子元素Element book = books.addElement("book");// 为book添加子元素Element id = book.addElement("id");Element name = book.addElement("name");Element author = book.addElement("author");// 为子元素添加文本id.addText("1");name.addText("《Java自学基础》");author.addText("张三");author.addAttribute("type", "man");author.addAttribute("age", "12");// 将DOC输出到XML文件 简单输出
//        Writer writer = null;
//        try {
//            writer = new FileWriter(new File(path));
//            document.write(writer);
//            // 关闭资源
//            writer.close();
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            if (writer != null) {
//                try {
//                    writer.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }// 美化格式输出OutputFormat format = OutputFormat.createPrettyPrint();XMLWriter xmlWriter = null;try {xmlWriter = new XMLWriter(new FileWriter(new File(path)), format);xmlWriter.write(document);// 关闭资源xmlWriter.close();} catch (IOException e) {e.printStackTrace();} finally {if (xmlWriter != null) {try {xmlWriter.close();} catch (IOException e) {e.printStackTrace();}}}}
}

执行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783737.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QT入门】 QListWidget各种常见用法详解之列表模式

往期回顾 【QT入门】 Qt代码创建布局之setLayout使用-CSDN博客 【QT入门】 Qt代码创建布局之多重布局变换与布局删除技巧-CSDN博客 【QT入门】 QTabWidget各种常见用法详解-CSDN博客 【QT入门】 QListWidget各种常见用法详解之列表模式 QListWidget有列表和图标两种显示模式&a…

springboot论坛管理系统

论坛管理系统 摘要&#xff1a; 在社会快速发展的影响下&#xff0c;论坛管理系统继续发展&#xff0c;使论坛管理系统的管理和运营比过去十年更加信息化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上论坛管理系统是一项十分重要并且有价值的事情。对于传统的论…

一篇讲明白 Hadoop 生态的三大部件

文章目录 每日一句正能量前言01 HDFS02 Yarn03 Hive04 HBase05 Spark及Spark Streaming关于作者推荐理由后记赠书活动 每日一句正能量 黎明时怀着飞扬的心醒来&#xff0c;致谢爱的又一天&#xff0c;正午时沉醉于爱的狂喜中休憩&#xff0c;黄昏时带着感恩归家&#xff0c;然后…

【Linux】进程实践项目 —— 自主shell编写

送给大家一句话&#xff1a; 不管前方的路有多苦&#xff0c;只要走的方向正确&#xff0c;不管多么崎岖不平&#xff0c;都比站在原地更接近幸福。 —— 宫崎骏《千与千寻》 自主shell命令编写 1 前言2 项目实现2.1 创建命令行2.2 获取命令2.3 分割命令2.4 运行命令 3 源代码…

非NVIDIA平台下的CUDA的替代方案OpenCL,第一步如何获取PlatformInfo、DeviceInfo

非NVIDIA平台下的CUDA的替代方案OpenCL&#xff0c;第一步如何获取PlatformInfo、DeviceInfo 介绍 当谈到高性能计算&#xff0c;NVIDIA的CUDA框架无疑是一个强大的工具。OpenC&#xff08;Open Computing Language&#xff09;是一个更为通用的解决方案&#xff0c;或者你使用…

Vscode连接远程服务器中的docker容器进行开发

0.预安装 1.本地windows或其他环境中安装了Vscode&#xff0c;Vscode中安装了Remote-SSH拓展&#xff08;用于利用SSH连接docker容器&#xff09; 2.远程服务器中安装了docker&#xff0c;并且拉取了自己需要的镜像 3.有root权限&#xff0c;能使用sudo命令 1. 在服务器端启…

javaWeb项目-学生考勤管理系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、JAVA技术 JavaSc…

蓝桥杯省赛刷题——题目 2656:刷题统计

刷题统计OJ链接&#xff1a;蓝桥杯2022年第十三届省赛真题-刷题统计 - C语言网 (dotcpp.com) 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a 道题目&#xff0c;周六和周日每天做 b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几…

MS Edge浏览器坏了?网页播放视频的速度不对

前言 小白是MS Edge浏览器的重度用户。电脑上必须有的两个浏览器&#xff1a;Google Chrome和Microsoft Edge。 前段时间小白在使用MS Edge的时候出了问题&#xff1a;播放视频或者音频的时候总是被莫名其妙加速或者减速&#xff0c;类似于播放视频时候的0.5x或者2.0x。 当时…

C++入门知识详细讲解

C入门知识详细讲解 1. C简介1.1 什么是C1.2 C的发展史1.3. C的重要性1.3.1 语言的使用广泛度1.3.2 在工作领域 2. C基本语法知识2.1. C关键字(C98)2.2. 命名空间2.2 命名空间使用2.2 命名空间使用 2.3. C输入&输出2.4. 缺省参数2.4.1 缺省参数概念2.4.2 缺省参数分类 2.5. …

Abaqus周期性边界代表体单元Random Sphere RVE 3D (Mesh)插件

插件介绍 Random Sphere RVE 3D (Mesh) - AbyssFish 插件可在Abaqus生成三维具备周期性边界条件(Periodic Boundary Conditions, PBC)的随机球体骨料及骨料-水泥界面过渡区(Interfacial Transition Zone, ITZ)模型。即采用周期性代表性体积单元法(Periodic Representative Vol…

python distribute是什么

Python的包管理工具常见的有easy_install, setuptools, 还有pip, distribute&#xff0c;那麽这几个工具有什么关系呢&#xff0c;看一下下面这个图就明白了&#xff1a; 可以看到distribute是setuptools的替代方案&#xff0c;pip是easy_install的替代方案。 Distribute提供一…

【QT学习】2.补充:connect中的lambda表达式

一.简单实例&#xff1a; 1.实例要求 点击按钮&#xff0c;实现 >o<与#-#的转换。 2.步骤 补充&#xff1a;​​​​​​​ 1.如果我想在lambda中修改数据&#xff0c;怎么办&#xff1f; 写上mutable就行。

vue基础教程(5)——构建项目级登录页

同学们可以私信我加入学习群&#xff01; 正文开始 前言一、创建首页二、登录页代码讲解三、对应的vue知识点&#xff1a;四、附件-各文件代码总结 前言 前面我们已经把vue自带的页面删除&#xff0c;也搭建了最简单的router路由&#xff0c;下面就可以真正开发我们自己的项目…

【独立开发前线】Vol.29 专注于电子邮件签名,也可以依靠SEO年入70万美元

今天要给大家分享的案例是MySignature&#xff0c;一个专注于电子邮件签名的产品&#xff1b; 它的官网是&#xff1a;MySignature: Free Email Signature Generator 提到电子邮件签名&#xff0c;很多人想到的肯定是“那不是电子邮件结尾的几行图文介绍吗&#xff0c;这也能做…

ZNC3罗德与施瓦茨ZNC3网络分析仪

181/2461/8938产品概述&#xff1a; 罗德与施瓦茨 ZNC3 网络分析仪的工作频率范围为 9 kHz 至 3 GHz&#xff0c;面向移动无线电和电子产品行业的应用。它具有双向测试装置&#xff0c;用于测量有源和无源 DUT 的所有四个 S 参数。此外&#xff0c;它还提供适合开发和生产中各…

最新2024年增强现实(AR)营销指南(完整版)

AR营销是新的最好的东西&#xff0c;就像元宇宙和VR营销一样。利用AR技术开展营销活动可以带来广泛的利润优势。更不用说&#xff0c;客户也喜欢AR营销&#xff01; 如果企业使用AR&#xff0c;71%的买家会更多地购物。40%的购物者准备在他们可以在AR定制的产品上花更多的钱。…

【Linux】详解文件系统以及周边知识

一、磁盘的基本知识 磁盘中可以被划分成一个一个的环&#xff0c;每个环都是一个磁道。每个磁道又可以被均分成一个一个的扇区&#xff0c;扇区是磁盘IO的基本单位&#xff08;想要修改扇区中的一个比特位就必须把该扇区的全部比特位都加载到内存中&#xff09;。磁盘中的盘面&…

【Linux】详解软硬链接

一、软硬链接的建立方法 1.1软链接的建立 假设在当前目录下有一个test.txt文件&#xff0c;要对其建立软链接&#xff0c;做法如下&#xff1a; ln就是link的意思&#xff0c;-s表示软链接&#xff0c;test.txt要建立软链接的文件名&#xff0c;后面跟上要建立的软链接文件名…

魔改一个过游戏保护的CE

csdn审核不通过 网易云课堂有配套的免费视频 int0x3 - 主页 文章都传到github了 Notes/外挂/魔改CE at master MrXiao7/Notes GitHub 为什么要编译自己的CE 在游戏逆向的过程中&#xff0c;很多游戏有保护&#xff0c;我们运行原版CE的时候会被检测到 比如我们开着CE运…