是否有c++;用转义序列替换xml特殊字符的函数? 我在网上搜索了很多,没有找到用其转义序列替换XML特殊字符的C++函数? 有这样的东西吗

是否有c++;用转义序列替换xml特殊字符的函数? 我在网上搜索了很多,没有找到用其转义序列替换XML特殊字符的C++函数? 有这样的东西吗,c++,xml,escaping,special-characters,C++,Xml,Escaping,Special Characters,我知道以下几点: Special Character Escape Sequence Purpose & & Ampersand sign ' ' Single quote " " Double quote > &

我知道以下几点:

Special Character   Escape Sequence Purpose  
&                   &           Ampersand sign 
'                   '          Single quote 
"                   "          Double quote
>                   >            Greater than 
<                   &lt;            Less than
特殊字符转义序列用途
&&;符号符号
“&apos;单引号
”“双引号
>大于
<
还有吗?写十六进制值,比如0×00,怎么样,
这也是一个问题吗?

有一个函数,我刚刚写的:

void replace_all(std::string& str, const std::string& old, const std::string& repl) {
    size_t pos = 0;
    while ((pos = str.find(old, pos)) != std::string::npos) {
        str.replace(pos, old.length(), repl);
        pos += repl.length();
    }
}

std::string escape_xml(std::string str) {
    replace_all(str, std::string("&"), std::string("&amp;"));
    replace_all(str, std::string("'"), std::string("&apos;"));
    replace_all(str, std::string("\""), std::string("&quot;"));
    replace_all(str, std::string(">"), std::string("&gt;"));
    replace_all(str, std::string("<"), std::string("&lt;"));

    return str;
}
void replace_all(std::string&str,const std::string&old,const std::string&repl){
大小\u t pos=0;
while((pos=str.find(old,pos))!=std::string::npos){
str.replace(pos,old.length(),repl);
pos+=repl.length();
}
}
std::string escape_xml(std::string str){
替换所有(str,std::string(&),std::string(&);
全部替换(str,std::string(“”),std::string(&apos;“”);
全部替换(str,std::string(“”),std::string(“”);
全部替换(str,std::string(“>”),std::string(“”);

替换所有(str,std::string(“似乎您想自己生成XML。我认为如果您想成功,您需要更清楚地了解XML规范。这些是唯一的XML特殊字符,您可以说“我知道还有更多特殊字符,如外语和货币符号“…这些不是用XML定义的,除非您指的是编码为代码点(£;例如)。您是在考虑HTML还是其他DTD

避免双重编码的唯一方法是只编码一次。如果您得到字符串“”,您如何知道它是否已经编码并且我想要表示字符串“>”,或者我想要表示字符串“”

最好的方法是将XML表示为DOM(字符串表示为未编码的字符串),并使用和XML serialiser类似的


哦,请记住,在XML中无法表示0x20下的字符(除了&x9;、&xA;和&xD;-空格)。

如前所述,您可以编写自己的字符。对于:

#包括
#包括
#包括
int main()
{
std::stringxml(“a<>&'\'字符串”);
std::cout优先;
}
大小\u t pos=0;
while(std::string::npos!=(pos=xml.find_first_of(reserved_chars,pos)))
{
replace(pos,1,转换[xml[pos]]);
pos++;
}

std::cout编写您自己的字符串非常简单,但是多次扫描字符串以搜索/替换单个字符可能效率低下:

std::string escape(const std::string& src) {
    std::stringstream dst;
    for (char ch : src) {
        switch (ch) {
            case '&': dst << "&amp;"; break;
            case '\'': dst << "&apos;"; break;
            case '"': dst << "&quot;"; break;
            case '<': dst << "&lt;"; break;
            case '>': dst << "&gt;"; break;
            default: dst << ch; break;
        }
    }
    return dst.str();
}
std::string转义(const std::string&src){
std::stringstream-dst;
用于(字符ch:src){
开关(ch){

案例“&”:dst我稍微修改了费鲁乔的解决方案,以消除其他妨碍解决方案的字符,例如<0x20的任何字符等(在互联网上的某个地方找到)。经过测试并正常工作

    void strip_tags(string* s) {
    regex kj("</?(.*)>");
    *s = regex_replace(*s, kj, "", boost::format_all);

    std::map<char, std::string> transformations;
    transformations['&']  = std::string("&amp; ");
    transformations['\''] = std::string("&apos; ");
    transformations['"']  = std::string("&quot; ");
    transformations['>']  = std::string("&gt; ");
    transformations['<']  = std::string("&lt; ");

  // Build list of characters to be searched for.
    //
    std::string reserved_chars;
    for ( std::map<char, std::string>::iterator ti = transformations.begin(); ti != transformations.end(); ti++)
    {
        reserved_chars += ti->first;
    }

    size_t pos = 0;
    while (std::string::npos != (pos = (*s).find_first_of(reserved_chars, pos)))
    {
        s->replace(pos, 1, transformations[(*s)[pos]]);
        pos++;
    }



}


string removeTroublesomeCharacters(string inString)
{

    if (inString.empty()) return "";

    string newString;
    char ch;

    for (int i = 0; i < inString.length(); i++)
    {

        ch = inString[i];
        // remove any characters outside the valid UTF-8 range as well as all control characters
        // except tabs and new lines
        if ((ch < 0x00FD && ch > 0x001F) || ch == '\t' || ch == '\n' || ch == '\r')
        {
            newString.push_back(ch);
        }
    }
    return newString;
希望有帮助


(哦,是的:另一个函数的功劳归于这里答案的作者:)

这些类型的函数应该是标准的,我们不应该重写它们。 如果您使用的是VS,请查看atlenc.h 此文件是VS安装的一部分。
在文件中有一个名为EscapeXML的函数,它比上面的任何示例都要完整得多。

为什么要自己做?5字符串替换为example@stefanbachert首先,我知道有更多的特殊字符,外语和货币符号,第二,如何防止双重编码?我不想双重编码&…为什么要发明轮子?也许有人想到了我不熟悉的事情..上面5个默认的特殊实体是由xml本身定义的。其他实体可能由doctype或schema定义。最后每个人都可以定义实体。所以你找不到标准函数。@stefanbachert为什么没有可以提供实体名称列表的标准函数?顺便说一句,官方HTML列表定义得很好。@DorCohen我刚刚注意到您想将0x00放入xml文件中。您不能,句号。选择另一种存储数据的方式。大多数xml生成器和xml阅读器都非常慷慨地使用0x20以下的字符;所以这不是问题这是一个很大的问题。xml 1.1标准甚至正式接受它们(作为字符引用,而不是字符本身)。例外情况是0x00,这在任何形状或形式中都是不允许的。@MrLister阅读此文章是的,该文章确认您不能在xml文件中存储0x00字符,并演示如何删除它们。这对您有帮助吗?
std::string escape(const std::string& src) {
    std::stringstream dst;
    for (char ch : src) {
        switch (ch) {
            case '&': dst << "&amp;"; break;
            case '\'': dst << "&apos;"; break;
            case '"': dst << "&quot;"; break;
            case '<': dst << "&lt;"; break;
            case '>': dst << "&gt;"; break;
            default: dst << ch; break;
        }
    }
    return dst.str();
}
    void strip_tags(string* s) {
    regex kj("</?(.*)>");
    *s = regex_replace(*s, kj, "", boost::format_all);

    std::map<char, std::string> transformations;
    transformations['&']  = std::string("&amp; ");
    transformations['\''] = std::string("&apos; ");
    transformations['"']  = std::string("&quot; ");
    transformations['>']  = std::string("&gt; ");
    transformations['<']  = std::string("&lt; ");

  // Build list of characters to be searched for.
    //
    std::string reserved_chars;
    for ( std::map<char, std::string>::iterator ti = transformations.begin(); ti != transformations.end(); ti++)
    {
        reserved_chars += ti->first;
    }

    size_t pos = 0;
    while (std::string::npos != (pos = (*s).find_first_of(reserved_chars, pos)))
    {
        s->replace(pos, 1, transformations[(*s)[pos]]);
        pos++;
    }



}


string removeTroublesomeCharacters(string inString)
{

    if (inString.empty()) return "";

    string newString;
    char ch;

    for (int i = 0; i < inString.length(); i++)
    {

        ch = inString[i];
        // remove any characters outside the valid UTF-8 range as well as all control characters
        // except tabs and new lines
        if ((ch < 0x00FD && ch > 0x001F) || ch == '\t' || ch == '\n' || ch == '\r')
        {
            newString.push_back(ch);
        }
    }
    return newString;
string StartingString ("Some_value");
string FinalString = removeTroublesomeCharacters(strip_tags(&StartingString));