pugixml XML配置文件 的增删改查

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<SXConfiguration>
	<LocalSetting>
		<VMSLoginServer>
			<exitServerName>2</exitServerName>
			<server>
				<name>2</name>
				<ip>152.131.121.131</ip>
				<port>13313</port>
			</server>
			<server>
				<name>23</name>
				<ip>168.202.32.232</ip>
				<port>54331</port>
			</server>
		</VMSLoginServer>
	</LocalSetting>
</SXConfiguration>

对应:加载、增加、删除操作

Erlang 复制代码
m_VMSServerNode = m_LocalNode.child("VMSLoginServer");
    if (m_VMSServerNode.empty()) {
        DEBUG_LOG(ERROR, "Load config file failed[LocalSetting]! path = %s\n", m_File.c_str());
        return false;
    }


if (!LoadVMSServerConfig()) {
        return false;
    }


bool LocalSetting::LoadVMSServerConfig()
{
    if (m_VMSServerNode.empty()) {
        return false;
    }
    for (pugi::xml_node serverNode : m_VMSServerNode.children("server")) {
        QString name = QString::fromStdString(serverNode.child_value("name"));
        QString ip = QString::fromStdString(serverNode.child_value("ip"));
        int port = serverNode.child("port").text().as_int();
        if (name == "" || ip == "" || port == 0) {
            return false;
        }
        m_vmsserver_hash[name] = { ip, port };
    }
    return true;
}

QHash<QString, VMSServerInfo> LocalSetting::GetVMSServerInfo()
{
    return m_vmsserver_hash;
}

bool LocalSetting::SetVMSServerValue(QString name, QString ip, int port)
{
    if (!m_VMSServerNode.empty()) {
        if (m_vmsserver_hash.contains(name)){
            RemoveVMSServer(name);
        }
        m_vmsserver_hash.insert(name, { ip, port });

        // 添加新的服务器节点
        bool ret = false;
        auto serverNode = m_VMSServerNode.append_child("server");
        ret = serverNode.append_child("name").append_child(pugi::node_pcdata).set_value(name.toStdString().c_str());
        if (!ret) return false;
        ret = serverNode.append_child("ip").append_child(pugi::node_pcdata).set_value(ip.toStdString().c_str());
        if (!ret) return false;
        ret = serverNode.append_child("port").append_child(pugi::node_pcdata).set_value(QString::number(port).toStdString().c_str());
        if (!ret) return false;
        m_Doc.save_file(m_File.c_str(), "\t", 1U, pugi::encoding_utf8);
        return true;
    }
}

bool LocalSetting::SetExitServerName(QString name)
{
    if (!m_VMSServerNode.empty()) {
        pugi::xml_node exitServerName = m_VMSServerNode.child("exitServerName");
        if (exitServerName) {
            std::string str_name = name.toStdString();
            const char* tem_name = str_name.c_str();
            bool ret = exitServerName.text().set(tem_name);
            if (ret) {
                m_Doc.save_file(m_File.c_str(), "\t", 1U, pugi::encoding_utf8);
            }
        }
        else
        {
            m_VMSServerNode.append_child("exitServerName");
            DEBUG_LOG(ERROR, "exitServerName node not found!/n");
            return false;
        }
    }
}

QString LocalSetting::GetExitServerName()
{
    if (!m_VMSServerNode.empty()) {
        pugi::xml_node exitServerName = m_VMSServerNode.child("exitServerName");
        if (exitServerName) {
            QString name = exitServerName.text().as_string("");
            if (name != NULL) {
                return name;
            }
        }
    }
    return QString();
}

bool LocalSetting::RemoveVMSServer(const QString& name) {
    // 检查名称是否存在
    if (!m_vmsserver_hash.contains(name)) {
        //qWarning() << "Server not found:" << name;
        return false;
    }

    // 遍历当前 XML 文件中的所有服务器节点,并根据 serverMap 更新或删除
    for (auto serverNode : m_VMSServerNode.children("server")) {
        QString server_node_name = QString::fromStdString(serverNode.child_value("name"));
        // 如果 serverMap 中有这个服务器的信息,则更新或者删除它
        if (name == server_node_name) {
            serverNode.parent().remove_child(serverNode);
            // 从服务器映射表中移除
            m_vmsserver_hash.remove(name);
        }
    }
    int ret = m_Doc.save_file(m_File.c_str(), "\t", 1U, pugi::encoding_utf8);
    if (!ret) return false;
    return true;
}
相关推荐
云水一下21 分钟前
零基础玩转bWAPP靶场(三十一):XML/XPath 注入(搜索)
xml·web安全·bwapp
w67820072 天前
,攻击者通过构造特殊的XML使其包含恶意外部实体。外部实体可以为服务器敏感文件,也可以为网络请求等,之后利用方式类似于文件包含和SS ...
xml·服务器·网络
name好难取诶2 天前
解析请求体内容(如 JSON、表单数据、XML 等) 将原始数据转换为 Python 数据结构 使转换后的数据可在 request. ...
xml·python·json
qq_171538852 天前
深入浅出 MyBatis XML:从入门到精通
xml·java·mybatis
前网易架构师-高司机8 天前
带标注的扑克牌识别数据集,识别率99.5%,3083张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·数字·扑克牌·纸牌
执明wa9 天前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
IT_Octopus11 天前
一次由 RestTemplate 引发的 Connection reset:被 XML 截胡的请求体
xml·java·spring boot
Dontla11 天前
网站爬虫控制策略介绍(robots.txt、sitemap.xml、x-robots-tag、noindex、nofollow)网站索引
xml·爬虫·dubbo
风起洛阳@不良使12 天前
spring中xml和注解开发的对比
xml·java·spring
Mikowoo00713 天前
批量汇总XML格式的发票信息
xml·python