从 stringstream 到 string 的转换会删除 '=' 字符
Posted
技术标签:
【中文标题】从 stringstream 到 string 的转换会删除 \'=\' 字符【英文标题】:conversion from stringstream to string removes '=' characters从 stringstream 到 string 的转换会删除 '=' 字符 【发布时间】:2014-05-04 23:08:13 【问题描述】:我正在将一个 XML 文件读入一个字符串流缓冲区,以便使用 RapidXML 对其进行解析。 RapidXML 仅解析 XML 节点的名称,而不解析它们的属性名称或值。经过一些实验,我发现问题不太可能出在 RapidXML 上,而在于使用 std::string content(buffer.str()); 将 stringstream 缓冲区转换为字符串。对 XML 解析非常重要的 '=' 字符被转换为 ' '(空格字符),在任何 RapidXML 处理之前。
当在下面的代码中进行 cout
我的代码如下:
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <conio.h>
#include <string>
#include <stdlib.h>
#include <rapidxml.hpp>
#include <vector>
#include <sstream>
using namespace std;
using namespace rapidxml;
//... main() and so forth, all works fine...
ifstream file(names.at(i)); // names.at(i) works fine...
//...
file.read(fileData, fileSize); // works fine...
//...
// Create XML document object using RapidXML:
xml_document<> doc;
//...
std::stringstream buffer;
buffer << file.rdbuf();
// This is where everything looks okay (i.e., '=' shows up properly):
cout << "\n" << buffer.str() << "\n\nPress a key to continue...";
getchar();
file.close();
std::string content(buffer.str());
// This is where the '=' are replaced by ' ' (space characters):
cout << "\n" << content << "\n\nPress a key to continue...";
getchar();
// Parse XML:
doc.parse<0>(&content[0]);
// Presumably the lack of '=' is preventing RapidXML from parsing attribute
// names and values, which always follow '='...
提前感谢您的帮助。
附言我遵循了关于使用这种技术将整个 XML 文件读入字符串流,将其转换为字符串,然后将字符串从以下链接提供给 RapidXML 的建议(感谢这些建议的贡献者,抱歉我不能他们还在工作......):
Automation Software's RapidXML mini-tutorial
...这种方法在很多地方都见过,这里就不一一列举了。似乎足够明智。我的错误似乎是独一无二的。这可能是 ASCII 与 UNICODE 的问题吗?
我也尝试过这里的代码:
Thomas Whitton's example converting a string buffer to a dynamic cstring
上面的代码sn-p:
// string to dynamic cstring
std::vector<char> stringCopy(xml.length(), '\0');
std::copy(xml.begin(), xml.end(), stringCopy.begin());
char *cstr = &stringCopy[0];
rapidxml::xml_document<> parsedFromFile;
parsedFromFile.parse<0>(cstr);
...具有类似的 RapidXML 无法解析节点属性名称和值。请注意,我没有将字符向量 stringCopy 转储到控制台进行检查,但我遇到了同样的问题,供审查的是:
-
在对提供给它进行分析的字符串进行 RapidXML 解析后,我看到正确解析的 XML 标记名称。
没有正确解析的标记属性名称或值。这些取决于要解析的字符串中显示的“=”字符。
【问题讨论】:
【参考方案1】:如果您仔细观察,=
字符可能不会被空格替换,而是零字节。如果您在这里查看 rapidxml 文档:
http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1differences
它特别声明它修改了源文本。这样它可以避免分配任何新字符串,而是使用指向原始源的指针。
这部分似乎工作正常,也许问题出在你试图读取属性的其余代码上?
【讨论】:
感谢您的回复。如果您查看我上面的代码,我发现任何 RapidXML 处理之前都存在问题。当我计算 ),但是当我将 buffer.str() 复制到 std::string content(buffer.str ()) 并将其推送到 cout,'=' 都显示为空白空格(例如,以上是关于从 stringstream 到 string 的转换会删除 '=' 字符的主要内容,如果未能解决你的问题,请参考以下文章
从字符串 stringstream 获取 const ptr 时的行为