从XML解析字符串时添加到n的反斜杠
Extrea backslash added to n when parsing a string from XML
我将xml数据读取到C++应用程序中。有些数据是多行字符串。每一行都用转义符"\n"分隔。但当它被加载到程序中时,反斜杠n会从左边获得额外的反斜杠。例如:
在XML中:
<node attrStr = "Hello!nWhat's your name?" />
在程序中:
"Hello!\nWhat's your name?"
因此,它会导致"\"answers"n"成为单独的字符。如果字符串被硬编码到程序源代码中,则不会发生这种情况。如何解决这个问题?
需要注意的是,XML字符串被读取到std::wstring中以处理unicode字符。
在这里找到答案。
在XML中用
替换"\n"解决了这个问题。
如果要转义XML中的换行符,则必须使用实体
。因此,正确的XML看起来像:
<node attrStr = "Hello! 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中,并且修复了
在上运行良好
相关文章:
- 使用 Tinyxml 在 xml 中添加一个子子项
- 使用 pugixml 将 xml 命名空间添加到xml_document
- 将具有 xml 属性的子树添加到提升属性树
- 如何使用 word 对象模型中的C++接口在 word 中添加自定义 XML 艺术
- 如何在每个XML节点上添加线路断裂
- C 添加自定义XML标签,用于序列化对向量
- 从XML解析字符串时添加到n的反斜杠
- 如何使用xerces向xml添加属性
- Qt XML序列化添加了额外的字符
- 如何将 AndroidManifest.xml 添加到 Project 后将应用部署到移动设备
- 使用提升将命名空间添加到 XML
- 将子节点添加到 XML 结构的顶部.提升属性树
- 在NetBeans中为我的C++项目添加一个XML文件
- 无法在给定的xml文件libxml2中正确添加子节点
- 如何在Visual Studio 2013中快速向c++代码中添加XML注释
- 使用pugixml和c++在.xml中添加行
- 向xml文档添加xml文本结构
- 替换而不是添加xml节点
- 如何在tinyxml生成的xml文件的顶部添加DOCTYPE
- 如何在cmarkup生成的xml标记中添加更多细节