从字符串流转换为字符串会删除' ='人物

时间:2014-05-04 23:08:14

标签: c++ xml string stringstream rapidxml

我正在将一个XML文件读入一个字符串流缓冲区,以便使用RapidXML解析它。 RapidXML仅解析XML节点的名称,但不解析其属性名称或值。经过一些实验,我发现问题不太可能是RapidXML,而是使用std :: string content(buffer.str());将stringstream缓冲区转换为字符串。 ' ='对XML解析如此重要的字符将转换为' ' (空格字符),之前到任何RapidXML处理。

当cout<<<<<调用是在下面的代码中进行的,这是在RapidXML获取字符串之前。

我的代码如下:

    #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 '='...

提前感谢您的帮助。

P.S。我遵循了使用这种技术将整个XML文件读入字符串流,将其转换为字符串,然后从以下链接将字符串提供给RapidXML的建议(感谢这些建议的贡献者,对不起,我可以&#39;让他们工作......):

Automation Software's RapidXML mini-tutorial

......这种方法在许多其他地方被看到,我不会在这里列出它们。似乎足够明智。我的错误似乎是独一无二的。这可能是ASCII与UNICODE问题吗?

我也试过这里的代码:

Thomas Whitton's example converting a string buffer to a dynamic cstring

上面的

代码片段:

    // 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转储到控制台进行检查,但我遇到了同样的问题,请查看:

  1. 在RapidXML解析为其提供的字符串进行分析后,我看到正确解析的XML标签名称。
  2. 没有正确解析的标记属性名称或值。这取决于&#39; =&#39;字符显示在要解析的字符串中。

1 个答案:

答案 0 :(得分:1)

如果仔细观察,=字符可能不会被空格替换,而是零字节。如果你在这里查看rapidxml文档:

http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1differences

它明确声明它会修改源文本。这样就可以避免分配任何新字符串,而是使用指向原始源的指针。

这部分似乎工作正常,可能问题在于您的其他代码是否尝试读取属性?