从 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实现从数字到字符串的转化

文件到 std::string_view

从字符串 stringstream 获取 const ptr 时的行为

stringstream、string 和 char* 转换混淆

stringstream的用法

C++ 中的“string”、“stream”和“stringstream”类是啥?