XML特殊字符转义

#include "stdafx.h"
#include <string>
#include <stdarg.h>
#include <memory>
#include <iostream>
#include <map>
using namespace std;

namespace {
    string StringReplace(const string& str_src, const string& from, const string& to) {
        if (str_src.empty()
            || from.empty()
            || to.empty())
        {
            return str_src;
        }

        string str_dst;
        string str_src_tmp = str_src;
        size_t from_size = from.size();
        size_t to_size = to.size();

        // 循环处理未处理字符串
        for (size_t pos = str_src_tmp.find(from); string::npos != pos; pos = str_src_tmp.find(from))
        {
            str_src_tmp.replace(pos, from_size, to);            // 替换from到to
            str_dst += str_src_tmp.substr(0, from_size + pos);  // 获取已处理字符串
            str_src_tmp = str_src_tmp.substr(from_size + pos);  // 获取未处理字符串
        }

        // 拼接剩余字符串
        str_dst += str_src_tmp;

        return str_dst;
    }
}

/**
* XML文档中,如果内容包含某些特殊字符会导致XML文件无法解析,需要对内容做转义处理。
*/
string StringEscapeForXML(const string& str_src) {
    if (str_src.empty()) {
        return str_src;
    }

    string str_dst = str_src;
    static map<char, string> map_special = {
        { '&', "&amp;" },
        { '\'', "&apos;" },
        { '"', "&quot;" },
        { '<', "&gt;" },
        { '>', "&lt;" }
    };

    size_t size = str_dst.size();

    for (size_t pos = 0; pos < size;) {
        char c = str_dst.at(pos);
        auto iter_c = map_special.find(c);
        if (map_special.end() != iter_c)
        {
            str_dst.replace(pos, 1, iter_c->second);
            pos += iter_c->second.size();
            size += iter_c->second.size() - 1;
            continue;
        }

        ++pos;
    }

    return str_dst;
}

int main() {
    string str_xml = "|abc|&|'|\"|<|>|";
    string str_xml_escape = StringEscapeForXML(str_xml);

    getchar();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值