TinyXml2基础操作大全,tinyxml深度解析,一文精通tinyxml之xml中的操作

📋 前言

  • 🖱 博客主页:在下马农的碎碎念
  • 🤗 欢迎关注🔎点赞👍收藏⭐️留言📝
  • ✍ 本文由在下马农原创,首发于CSDN
  • 📆 首发时间:2021/12/25
  • 📅 最近更新时间:2021/12/25
  • 🤵 此马非凡马,房星本是星。向前敲瘦骨,犹自带铜声。
  • 📇 系列文章目录: 快点我呀,我是目录
  • 🙏作者水平有限,如发现错误,请留言轰炸哦!万分感谢!

仍然自由由我,永远高唱我歌

在这里插入图片描述

一、tinyxml2概述

TinyXML-2是一个用于解析和生成XML文档的轻量级C++库,它提供了一组简单的类和函数来处理 XML 数据。它是TinyXML的升级版本,旨在提供更好的性能和更多功能。

以下是TinyXML-2的一些特点和功能:

  1. 轻量级:TinyXML-2的设计目标是简单、紧凑和高效。它的代码库非常小巧,适用于嵌入式系统或资源有限的环境。

  2. 解析XML:TinyXML-2可以解析XML文档并构建相应的内部数据结构。它支持基本的XML语法,包括元素、属性、文本和注释等。

  3. 生成XML:除了解析XML,TinyXML-2还可以生成XML文档。它允许用户创建元素、属性和文本,并将它们组合成完整的XML文档。

  4. 错误处理:TinyXML-2提供了强大的错误处理机制。在解析或生成XML时,如果遇到任何错误,它会生成相应的错误消息,以便开发人员可以轻松地调试和修复问题。

  5. 支持XPath查询:TinyXML-2支持使用XPath表达式对XML文档进行查询。XPath是一种用于在XML文档中定位节点的语言,它提供了强大的查找和过滤功能。

  6. Unicode支持:TinyXML-2内置了对Unicode字符集的支持。它可以正确处理各种语言的文本,包括非ASCII字符。

  7. 跨平台:TinyXML-2可以在多个操作系统上运行,包括Windows、Linux和Mac OS X等。它使用标准的C++代码编写,不依赖于特定的操作系统功能。

  8. 开源许可:TinyXML-2是基于MIT许可证发布的开源软件。这意味着用户可以免费使用、修改和分发这个库的源代码。

总体而言,TinyXML-2是一个简单而强大的C++库,用于处理XML文档。它提供了解析和生成XML的功能,支持错误处理和XPath查询,并具有跨平台和Unicode支持等特性。无论是嵌入式系统还是桌面应用程序,TinyXML-2都是一个方便易用的选择。

二、tinyxml2对象

tinyxml2中主要涉及五个对象,分别为:

1. XMLDocument:
XMLDocument 是 TinyXML2 的核心对象,用于表示整个 XML 文档。它可以用于解析 XML 文件或从头开始创建新的 XML 文档。

2. XMLElement:
XMLElement 表示 XML 文档中的元素。每个元素可以包含其他元素、属性和文本内容。XMLElement 对象提供了方法来获取和修改元素的名称、属性和内容。

3. XMLAttribute:
XMLAttribute 用于表示 XML 元素的属性。每个属性由名称和值组成,可以通过 XMLElement 对象的方法来访问和修改属性。

4. XMLText:
XMLText 用于表示 XML 元素中的文本内容。它可以包含文本节点中的实际文本数据,可以通过 XMLElement 对象的方法来获取和修改文本内容。

5. XMLComment:
XMLComment 用于表示 XML 中的注释。它可以包含注释节点中的实际注释内容,可以通过 XMLElement 对象的方法来获取和修改注释内容。

学会这几个对象的使用,我们就可以随心所欲地使用tinyxml2来操作xml文件

三、tinyxml2使用方法

tinyxml2使用方式非常简单,只需要将tinyxml2.cpptinyxml.h拷贝到项目目录,并在使用到tinyxml的文件中包含tinyxml.h头文件以及引入命名空间即可。不需要编译即可直接使用。

#include "tinyxml2.h"
using namespace tinyxml2;

四、tinyxml接口详解

4.1 创建xml文档

使用tinyxml中的XMLDocument对象可以实现xml文件的创建。

注意:本章节所有代码可在博主github获取,链接如下: ==tinyxml2使用==
如果不能访问,直接私信博主即可获取。

接口介绍

  1. 创建新的Declaration对象

    NewDeclaration()
    
  2. 将新的子元素添加到调用此接口的XML元素的末尾

    InsertEndChild()
    
  3. 创建新的Elements元素对象

    NewElement()
    
  4. 保存文档到文件,在对xml文档做出修改之后,调用此方法保存方法。 `

    XMLDocument::SaveFile()
    

示例介绍

在下面的示例程序中,我们首先创建一个XMLDocument对象doc。之后创建一个XML的声明并将其插入到doc的末尾,之后有创建一个根元素名为Root,并将此元素也插入到文档对象doc末尾。最后创建一个元素名为Child,将其添加在根元素Root的末尾。最后保存文件到example.xml。

示例代码:

#include "tinyxml2.h"

int main() {
    // 创建XML文档对象
    tinyxml2::XMLDocument doc;
    // 创建XML声明
    tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();
    doc.InsertEndChild(declaration);
    // 创建根元素
    tinyxml2::XMLElement* root = doc.NewElement("Root");
    doc.InsertEndChild(root);
    // 创建子元素并添加到根元素中
    tinyxml2::XMLElement* child = doc.NewElement("Child");
    child->SetText("Hello, World!");
    root->InsertEndChild(child);
    // 保存XML文档到文件
    doc.SaveFile("example.xml");
    return 0;
}

编译之后执行生成的可执行程序,会在执行程序的地方生成一个xml文件,名字是examole.xml

4.2 删除xml文档

接口介绍

  1. 加载xml文件,加载成功返回0
     LoadFile()
    

示例代码

#include <iostream>
#include "tinyxml2.h"

int main() {
    const char* filename = "example.xml";
    // 创建一个 XML 文档对象
    tinyxml2::XMLDocument doc;
    // 加载 XML 文件
    tinyxml2::XMLError result = doc.LoadFile(filename);
    if (result == tinyxml2::XML_SUCCESS) {
        // 删除 XML 文件
        std::remove(filename);
        std::cout << "XML 文件删除成功。" << std::endl;
    } else {
        std::cout << "无法加载 XML 文件:" << result << std::endl;
    }
    return 0;
}

4.3 打印xml文档

当我们获取到某个特定的元素之后,我们可以使用tinyxml2提供的接口将其打印出来。

接口介绍

  1. 将给定的XML对象打印到XMLPrinter中,支持打印XMLDocument、XMLElement和XMLText等节点。
     XMLDocument::Print()
    

示例代码

#include <iostream>
#include "tinyxml2.h"
int main() {
    tinyxml2::XMLDocument doc;
    doc.LoadFile("example.xml"); // 加载XML文档
    tinyxml2::XMLPrinter printer;
    doc.Print(&printer); // 使用Printer打印XML文档
    std::cout << printer.CStr() << std::endl; // 输出打印结果
    return 0;
}
<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Child>Hello, World!</Child>
</Root>

运行结果:

在这里插入图片描述

4.4 创建节点

接口介绍

  1. 使用NewElement创建新的元素节点:
    tinyxml2::XMLElement* element = doc.NewElement("ElementName");
    
  2. 使用NewText创建一个包含文本内容的文本节点:
    tinyxml2::XMLText* textNode = doc.NewText("TextContent");
    
  3. 使用NewComment 创建注释节点
    tinyxml2::XMLComment* comment = doc.NewComment("This is a comment");
    
  4. 使用NewDeclaration创建一个声明节点:
    tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();
    
  5. 使用NewDocument创建一个新的XML文档节点:
    tinyxml2::XMLDocument* newDocument = new tinyxml2::XMLDocument();
    
  6. 使用InsertFirstChild将一个节点作为父节点的第一个子节点插入:
    parentNode->InsertFirstChild(childNode);
    
  7. 使用InsertEndChild将一个节点作为父节点的最后一个子节点插入:
    parentNode->InsertEndChild(childNode);
    
  8. 使用InsertAfterChild将一个节点插入到另一个节点之后
    parentNode->InsertAfterChild(previousNode, newNode);
    
  9. 使用InsertBeforeChild将一个节点插入到另一个节点之前:
    parentNode->InsertBeforeChild(nextNode, newNode);
    

示例代码

#include <iostream>
#include "tinyxml2.h"

int main() {
    tinyxml2::XMLDocument doc;

    // 创建一个声明节点并将其添加到doc对象中
    tinyxml2::XMLDeclaration* declaration = doc.NewDeclaration();
    doc.LinkEndChild(declaration);

    // 创建根元素
    tinyxml2::XMLElement* root = doc.NewElement("Root");
    doc.InsertFirstChild(root);

    // 创建子元素
    tinyxml2::XMLElement* child = doc.NewElement("Child");
    child->SetText("Hello, World!");
    root->InsertEndChild(child);

    // 创建一个包含文本内容的文本节点并插入到child节点中
    tinyxml2::XMLText* textNode = doc.NewText("TextContent");
    child->InsertEndChild(textNode);

    // 创建一个注释节点
    tinyxml2::XMLComment* comment = doc.NewComment("This is a comment");
    doc.InsertEndChild(comment);

    // 创建第二个元素
    tinyxml2::XMLElement* parent = doc.NewElement("Parent");
    // 将parent添加到root下
    doc.InsertEndChild(parent);

    // 创建son节点 将son添加到parent下
    tinyxml2::XMLElement* son = doc.NewElement("son");
    parent->InsertEndChild(son);

    // 创建daughter节点 并将daughter节点作为parent第一个节点插入
    tinyxml2::XMLElement* daughter = doc.NewElement("daughter");
    parent->InsertFirstChild(daughter);

    // 创建dog节点并将dog节点作为parent最后一个节点插入
    tinyxml2::XMLElement* dog = doc.NewElement("dog");
    parent->InsertEndChild(dog);

    // 创建cat节点并将cat节点插入到son节点之后
    tinyxml2::XMLElement* cat = doc.NewElement("cat");
    parent->InsertAfterChild(son, cat);

    // 保存XML文档
    doc.SaveFile("example.xml");

    std::cout << "操作成功!" << std::endl;

    return 0;
}

运行结果

example.xml

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Child>Hello, World!TextContent</Child>
</Root>

<!--This is a comment-->
<Parent>
    <daughter/>
    <son/>
    <cat/>
    <dog/>
</Parent>

4.5 删除节点

接口介绍

  1. 获取XML文档对象的根节点
    doc.RootElement();
    
  2. 获取某节点的第一个孩子节点
    node.FirstChildElement();
    

    此方法功能为获取某个节点的第一个孩子节点,如果添加了一个字符串参数,如node.FirstChildElement("child")表示要获取node节点的第一个名为child的节点。

示例代码

#include <iostream>
#include "tinyxml2.h"

int main() {
    // 创建XML文档对象
    tinyxml2::XMLDocument doc;

    // 加载XML文件
    if (doc.LoadFile("file/example.xml") == tinyxml2::XML_SUCCESS) {
        // 获取根节点
        tinyxml2::XMLElement* root = doc.RootElement();

        // 根据节点名字查找要删除的节点
        tinyxml2::XMLElement* nodeToDelete = root->FirstChildElement("Child");

        if (nodeToDelete) {
            // 删除节点
            root->DeleteChild(nodeToDelete);

            // 保存修改后的XML文档
            if (doc.SaveFile("example_modified.xml") == tinyxml2::XML_SUCCESS) {
                std::cout << "节点删除成功,并保存修改后的XML文件。" << std::endl;
            } else {
                std::cout << "保存XML文件失败。" << std::endl;
            }
        } else {
            std::cout << "未找到要删除的节点。" << std::endl;
        }
    } else {
        std::cout << "加载XML文件失败。" << std::endl;
    }

    return 0;
}

运行结果

原文件example.xml

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Child>Hello, World!TextContent</Child>
</Root>

<!--This is a comment-->
<Parent>
    <daughter/>
    <son/>
    <cat/>
    <dog/>
</Parent>

删除后的文件example_modified.xml

<?xml version="1.0" encoding="UTF-8"?>
<Root/>

<!--This is a comment-->
<Parent>
    <daughter/>
    <son/>
    <cat/>
    <dog/>
</Parent>

4.6 修改节点的文本值

修改节点文本值常用方法为

接口介绍

  1. 设置node节点的名字

    node->SetName(newName)
    
  2. 设置node节点的内容文本值

    node->SetText(newText)
    

示例程序

#include <iostream>
#include "tinyxml2.h"

int main() {
    // 创建XML文档对象
    tinyxml2::XMLDocument doc;

    // 加载XML文件
    if (doc.LoadFile("example.xml") == tinyxml2::XML_SUCCESS) {
        // 获取根节点
        tinyxml2::XMLElement* root = doc.RootElement();

        // 根据节点名字查找要修改的节点
        tinyxml2::XMLElement* nodeToModify = root->FirstChildElement("Child");

        if (nodeToModify) {
            // 修改节点的名字和文本
            nodeToModify->SetName("NewName");
            nodeToModify->SetText("NewText");

            // 保存修改后的XML文档
            if (doc.SaveFile("example_modified.xml") == tinyxml2::XML_SUCCESS) {
                std::cout << "节点修改成功,并保存修改后的XML文件。" << std::endl;
            } else {
                std::cout << "修改XML文件失败。" << std::endl;
            }
        } else {
            std::cout << "未找到要修改的节点。" << std::endl;
        }
    } else {
        std::cout << "加载XML文件失败。" << std::endl;
    }

    return 0;
}

运行结果

Modify改之前的xml

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Child>Hello, World!TextContent</Child>
</Root>

<!--This is a comment-->
<Parent>
    <daughter/>
    <son/>
    <cat/>
    <dog/>
</Parent>

Modify改后的xml

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Child>Hello, World!TextContent</Child>
</Root>

<!--This is a comment-->
<Parent>
    <daughter/>
    <son/>
    <cat/>
    <dog/>
</Parent>

4.7 设置节点参数

接口介绍

  1. 为node节点设置参数
    node->setAttribute(attrName, attrValue);
    

示例代码

#include <iostream>
#include "tinyxml2.h"

int main() {
    // 创建XML文档对象
    tinyxml2::XMLDocument doc;

    // 加载XML文件
    if (doc.LoadFile("example.xml") == tinyxml2::XML_SUCCESS) {
        // 获取根节点
        tinyxml2::XMLElement* root = doc.RootElement();

        // 根据节点名字查找要修改的节点
        tinyxml2::XMLElement* nodeToModify = root->FirstChildElement("Child");

        if (nodeToModify) {
            // 修改节点的名字和文本
            nodeToModify->SetAttribute("name", "Jack");
            nodeToModify->SetAttribute("age", 6);
            // 保存修改后的XML文档
            if (doc.SaveFile("example_modified.xml") == tinyxml2::XML_SUCCESS) {
                std::cout << "节点修改成功,并保存修改后的XML文件。" << std::endl;
            } else {
                std::cout << "修改XML文件失败。" << std::endl;
            }
        } else {
            std::cout << "未找到要修改的节点。" << std::endl;
        }
    } else {
        std::cout << "加载XML文件失败。" << std::endl;
    }

    return 0;
}

运行结果

原始xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Child>Hello, World!TextContent</Child>
</Root>

<!--This is a comment-->
<Parent>
    <daughter/>
    <son/>
    <cat/>
    <dog/>
</Parent>

设置属性后xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Child name="Jack" age="6">Hello, World!TextContent</Child>
</Root>

<!--This is a comment-->
<Parent>
    <daughter/>
    <son/>
    <cat/>
    <dog/>
</Parent>

4.8 查询节点(获取节点名字、节点内容文本)

接口介绍

  1. 获取节点的名字
    node->Name()
    
  2. 获取节点的内容文本值
    node->GetText()
    

示例程序

#include <iostream>
#include "tinyxml2.h"

int main() {
    // 创建XML文档对象
    tinyxml2::XMLDocument doc;

    // 加载XML文件
    if (doc.LoadFile("example.xml") == tinyxml2::XML_SUCCESS) {
        // 获取根节点
        tinyxml2::XMLElement* root = doc.RootElement();

        // 获取根节点下的第一个子节点
        tinyxml2::XMLElement* firstNode = root->FirstChildElement();

        if (firstNode) {
            // 获取节点的名字
            std::string nodeName = firstNode->Name();
            printf("node name is %s\n", nodeName.c_str());

            // 获取节点的内容文本值
            std::string nodeConrtext = firstNode->GetText();
            printf("node text is %s\n", nodeConrtext.c_str());
        } else {
            std::cout << "未找到节点。" << std::endl;
        }
    } else {
        std::cout << "加载XML文件失败。" << std::endl;
    }
    return 0;
}

运行结果

使用的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Child>Hello, World!TextContent</Child>
</Root>

<!--This is a comment-->
<Parent>
    <daughter/>
    <son/>
    <cat/>
    <dog/>
</Parent>

控制台输出:

node name is Child
node text is Hello, World!TextContent

4.9 查询节点(获取节点属性值)

接口介绍

  1. 获取节点node名为name的参数值

    node->Attribute(name)
    
  2. 获取attr指向参数对象的参数名

    attr->Name()
    
  3. 获取attr指向参数对象的参数值

    attr->Value()
    
  4. 获取attr指向参数对象的下一个参数对象指针

    attr = attr->Next()
    

示例程序

#include <iostream>
#include "tinyxml2.h"

int main() {
    // 创建XML文档对象
    tinyxml2::XMLDocument doc;
    // 加载XML文件
    if (doc.LoadFile("example.xml") == tinyxml2::XML_SUCCESS) {
        // 获取根节点
        tinyxml2::XMLElement* root = doc.RootElement();
        // 获取根节点下的第一个子节点
        tinyxml2::XMLElement* firstNode = root->FirstChildElement();
        if (firstNode) {
            // 获取名为name的参数值
            const char* attrNameValue = firstNode->Attribute("name");
            if (!attrNameValue) {
                std::cout << "Failed to retrieve parameter attribute." << std::endl;
                return 0;
            }
            std::cout << "Parameter name value: " << attrNameValue << std::endl;
            // 遍历获取节点的所有参数
            const tinyxml2::XMLAttribute *attr = firstNode->FirstAttribute();
            while (attr) {
                std::string attrName = attr->Name();
                std::string attrValue = attr->Value();
                printf("param name is: %s, param value is: %s\n", attrName.c_str(), attrValue.c_str());
                attr = attr->Next();
            }
        } else {
            std::cout << "未找到节点。" << std::endl;
        }
    } else {
        std::cout << "加载XML文件失败。" << std::endl;
    }
    return 0;
}

运行结果

使用的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Child name="Jack" age="6">Hello, World!TextContent</Child>
</Root>

<!--This is a comment-->
<Parent>
    <daughter/>
    <son/>
    <cat/>
    <dog/>
</Parent>

控制台运行输出结果

Parameter name value: Jack
param name is: name, param value is: Jack
param name is: age, param value is: 6

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dockerfile - 基于 SpringBoot 项目自定义镜像(项目上线全过程)

目录 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 1.2、打包项目&#xff08;jar&#xff09; 1.3、编写 Dockerfile 文件&#xff0c;构建镜像 1.4、运行镜像并测试 一、Dockerfile 自定义项目镜像 1.1、创建 SpringBoot 项目并编写 a&#xff09;简…

手把手教你自己动手使用ONLYOFFICE制作2024年历日记本

手把手教你自己动手使用ONLYOFFICE制作2024年历日记本 又到了岁末年初的时候了&#xff0c;按照自己的习惯&#xff0c;是又该上淘宝买一个年历日记本了&#xff1a; 这也太便宜了吧&#xff01;这里我坚决要把价格打上去&#xff01; 把价格打上去&#xff0c;就是亲自动手制…

NFC物联网智能购物车设计方案

智能购物车是综合利用计算机网络、射频识别技术、数据库技术、单片机于一体的设备具有先进性、便于管理性、经济性、普适性。基于NFC (Near Field Communication&#xff0c;近场通信)技术的智能购物车&#xff0c;能够大幅缩短结账排队时间&#xff0c;实现“无感支付”。NFC是…

【C++】题解:三道只出现一次的数字问题

文章目录 只出现一次的数字i只出现一次的数ii只出现一次的数iii总结 本文介绍了三道只出现一次的数字问题的解法&#xff0c;分别是使用异或运算的方法、使用位运算的方法和使用异或运算和位运算相结合的方法。这三种方法都满足了题目中要求的线性时间复杂度和常数额外空间的条…

【教程】自动检测和安装Python脚本依赖的第三方库

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 背景说明 对于新python环境&#xff0c;要运行某个脚本&#xff0c;可能需要安装很多库&#xff0c;一般可以通过提供的requirements.txt来自动安装。但如果没有这个txt&#xff0c;那就得手动一个一个安装&#…

这一年,熬过许多夜,也有些许收获 | 2023年终总结

大家好&#xff0c;我是小悟 时间如白驹过隙&#xff0c;一如流光匆匆&#xff0c;转瞬即逝。它如同沙漏中的细沙&#xff0c;无声无息地从指间溜走&#xff0c;留给我们无尽的思索。 我们总是无知地忙碌着&#xff0c;而忽略了时间无形的步伐&#xff0c;却发现它已经一去不…

8个plotly绘图技巧

文章目录 什么是Plotlyplolty绘图如何添加标题&#xff0c;及控制标题的颜色和大小&#xff1f;plotly绘图如何自定义x轴和y轴的名称饼图如何同时显示百分比和数值柱状图宽度如何添加注释如何绘制多子图如何添加图例以及控制其颜色、大小、位置等桑基图Python技术资源分享1、Py…

打开3d模型时显示不匹配怎么办---模大狮模型网

当3d模型打开时&#xff0c;显示不匹配的情况可能有以下几个原因和解决方法&#xff1a; 文件格式不匹配&#xff1a;检查您所使用的3D软件是否支持打开该模型文件格式。不同的软件支持不同的文件格式&#xff0c;如果文件格式不匹配&#xff0c;可能无法正确加载和显示模型。尝…

新能源汽车制造设备状态监测:无线温振传感器的应用

随着全球对环境保护的关注度不断增加&#xff0c;新能源汽车的市场需求正在逐步扩大。而为了满足这一需求&#xff0c;新能源汽车制造企业必须依赖高效、可靠的设备来进行生产制造。然而&#xff0c;设备状态的监测与维护对于保证生产线的稳定运行至关重要。无线温振传感器作为…

【JVM篇】Java是如何实现平台无关的?

Java是如何实现平台无关的? ✔️什么是平台无关性✔️平台无关性的实现✔️Java虚拟机✔️字节码✔️Java语言规范 ✔️扩展知识仓✔️平台无关性的好处✔️ 有哪些语言实现了平台无关?✔️Java中基本数据类型的大小都是确定的吗? ✔️什么是平台无关性 平台无关性就是一种语…

dds 问题记录

Q1. 2023.12.29 一个participant内部的数据也会放到topic中进行发布、订阅吗&#xff1f;为什么&#xff1f;如图中的topic3。 (from 车载通信架构 —— DDS协议介绍https://mp.weixin.qq.com/s/IasCCsVJ7w-CHeyXGM6soQ)

Java创建线程执行任务的方法(一)

目录 1.继承Thread类 2.实现Runnab类 2.1实现Runnable类 2.2使用Lambda表达式 3.实现Callable类 3.1返回Integer类型数据 3.2返回String类型数据 3.3返回Object类型数据 4.匿名内部类 创建线程的方法&#xff1a;继承Thread类&#xff1b;实现Runnab类&#xff1b;匿名…

深度解析高防产品---游戏盾

游戏盾是针对游戏行业所推出的高度可定制的网络安全解决方案&#xff0c;游戏盾是高防产品系列中针对游戏行业的安全解决方案。游戏盾专为游戏行业定制&#xff0c;针对性解决游戏行业中复杂的DDoS攻击、游戏CC攻击等问题。游戏盾通过分布式的抗D节点&#xff0c;可以防御TB级大…

归并算法:分治而治的高效算法大揭秘(图文详解)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《数据结构&算法》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 归并算法是我们算法中最常见的算法之一&#xff0c;其思想非常巧妙。本身归并是只能归并有序数组…

迁移Ubuntu报错问题

问题描述&#xff1a; 使用LxRunOffline-v3.5.0-mingw迁移Ubuntu至非系统盘时&#xff0c;出现如下报错 ‘Couldn’t set the case sensitive attribute of the directory “\?\C:\Users\xxx\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\Loc…

Typora使用PicGo+Gitee上传图片报错403 Forbidden

Typora使用PicGoGitee上传图片报错403 Forbidden Typora使用PicGoGitee上传图片&#xff0c;上传失败了&#xff0c;错误信息如下 打开PicGo的日志文件查看&#xff0c;可以看到错误详情如下 换了一个插件github-plus重新配置&#xff0c;解决了这个问题 再打开日志查看&…

ubuntu:beyond compare 4 This license key has been revoked 解决办法

https://www.cnblogs.com/zhibei/p/12095431.html 错误如图所示&#xff1a; 解决办法&#xff1a; &#xff08;1&#xff09;先用find命令找到bcompare所在位置&#xff1a;sudo find /home/ -name *bcompare &#xff08;2&#xff09;进入 /home/whf/.config,删除/bco…

计算机网络——应用层与网络安全(六)

前言&#xff1a; 前几章我们已经对TCP/IP协议的下四层已经有了一个简单的认识与了解&#xff0c;下面让我们对它的最顶层&#xff0c;应用层进行一个简单的学习与认识&#xff0c;由于计算机网络多样的连接形式、不均匀的终端分布&#xff0c;以及网络的开放性和互联性等特征&…

VerticalGridView适配触摸屏踩坑,触摸滑动时位置重置/闪烁问题

VerticalGridView是什么? VerticalGridView是安卓leanback库的列表组件,用于支持使用遥控器(按键事件)浏览列表。 它与RecyclerView的继承关系是:VerticalGridView→BaseGridView→RecyclerView 首先我想吐槽一下leanback的BaseGridView相关组件,耦合度较高,并且不允许开…

DOA估计算法——迭代自适应算法(IAA)

1 简介 迭代自适应法 (Iterative Adaptive Approach&#xff0c;IAA)估计算法最早由美国的电气工程师和数学家Robert Schmidt和Roy A. Kuc在1986年的一篇论文"Multiple Emitter Location and Signal Parameter Estimation"中首次提出了这一算法&#xff0c; IAA DOA …