Xml Parser - string :: find

时间:2013-04-05 17:36:17

标签: c++ string

我正在尝试解析包含一行XML文件的字符串。

std::string temp = "<Album>Underclass Hero</Album>";
int f = temp.find(">");
int l = temp.find("</");
std::string _line = temp.substr(f + 1, l-2);

这是我的函数代码的一部分,它应该实际返回解析后的字符串。我的期望是它返回 Underclass Hero 。相反,我得到了 Underclass Hero&lt; /白蛋白
(这是在'&lt;'和'/'空格之间,因为我无法将它们一起编写)。

我看了std :: string :: find几次,它总是说它返回,如果存在,第一个匹配的第一个字符的位置。这里它给了我字符串的最后一个字符,但只在我的变量 l f 没问题。

link to std::string::find

所以有人能告诉我我做错了吗?

3 个答案:

答案 0 :(得分:5)

substr将长度作为第二个参数,而不是结束位置。尝试:

temp.substr(f + 1, l-f-1);

另外,请考虑使用真正的XML解析器,不要自己尝试或other inappropriate means尝试。

答案 1 :(得分:5)

第二个参数采用您要提取的子字符串的长度。您可以通过以下方式修复代码:

#include <string>
#include <iostream>

int main()
{
    std::string temp = "<Album>Underclass Hero</Album>";
    int f = temp.find(">");
    int l = temp.find("</");
    std::string line = temp.substr(f + 1, l - f - 1);   
    //                                    ^^^^^^^^^
}

这是live example

另外,请注意_line等名称。根据C ++ 11标准的第17.6.4.3.2 / 1段:

  

[...]以下划线开头的每个名称都保留给实现,以便用作名称   全局命名空间。

答案 2 :(得分:3)

不要这样做!

'解析'''的XML文件迟早会因您的尝试而失败。示例:以下是有效的XML,但您的代码将失败:

<Album>Underclass Hero<!-- What about </ this --></Album>

P.S。:尽可能使用const

std::string const temp = ...
// ...
std::string const line = ...