从XML解析字符串时添加到n的反斜杠

Extrea backslash added to n when parsing a string from XML

本文关键字:添加 XML 字符串      更新时间:2023-10-16

我将xml数据读取到C++应用程序中。有些数据是多行字符串。每一行都用转义符"\n"分隔。但当它被加载到程序中时,反斜杠n会从左边获得额外的反斜杠。例如:

在XML中:

<node  attrStr = "Hello!nWhat's your name?"  />

在程序中:

"Hello!\nWhat's your name?"

因此,它会导致"\"answers"n"成为单独的字符。如果字符串被硬编码到程序源代码中,则不会发生这种情况。如何解决这个问题?

需要注意的是,XML字符串被读取到std::wstring中以处理unicode字符。

在这里找到答案。

在XML中用&#10;替换"\n"解决了这个问题。

如果要转义XML中的换行符,则必须使用实体&#10;。因此,正确的XML看起来像:

<node attrStr = "Hello!&#10;What's your name?" />

由于XML不允许使用反斜杠进行字符转义,因此字符串"\n"被读取为两个普通字符"\"answers"n"。如果要加载具有正确换行符的XML内容,则必须将"\n"部分替换为" ;",如@Angew提出的答案中所建议的那样。

或者,您也可以在读取XML文件之前对其进行修改或预处理。

后面的两个字符n本质上没有任何特殊含义。在某些上下文中,这两个字符用于对换行进行编码。C++源文件中的字符串文字就是这样的上下文。XML文件不是这样的上下文。

这意味着,在解析包含子字符串n的XML文件时,您将在C++程序的内存中获得一个包含子字符串n的字符串。其他任何事情都是错误的。如果希望数据中的n表示换行符,则必须在数据进入内存后使用字符串替换。

解析完字符串后,只需将每次出现的n替换为ASCII字符LF即可完成设置。这就是使用标准库(低效)的方法

std::string s = getTheStringFromXml();
for (size_t idx = 0;;)
{
  idx = s.find("\n", idx);
  if (idx == s.npos)
    break;
  s[idx] = 'n';
  s.erase(idx + 1);
}

这个问题也发生在JavaScript中,并且修复了&#10;在上运行良好