我正在将一个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转储到控制台进行检查,但我遇到了同样的问题,请查看:
答案 0 :(得分:1)
如果仔细观察,=
字符可能不会被空格替换,而是零字节。如果你在这里查看rapidxml文档:
http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1differences
它明确声明它会修改源文本。这样就可以避免分配任何新字符串,而是使用指向原始源的指针。
这部分似乎工作正常,可能问题在于您的其他代码是否尝试读取属性?