2013-04-05 86 views
0

我想解析一个字符串,其中包含我的XML文件的一行。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 </Alb
(这里介于'<'和'/'之间的空格,因为我无法将它们写在一起)。

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

link to std::string::find

因此,谁能告诉我,我做错了什么?

回答

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:

[...]的每个以下划线被保留以执行在 全局命名空间用作名字开头的名字。

+0

谢谢,也强烈感谢下划线。 – 2013-04-05 17:46:58

+0

@CGuy:很高兴我能帮到:) – 2013-04-05 17:47:19

5

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

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

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

+0

LOL!有点倾倒我...也谢谢 – 2013-04-05 17:48:04

3

不要这样做!

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

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

P.S:使用const在可能的情况:

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

呵呵?我虽然不能改变常量变量......?!我错过了什么? – 2013-04-05 19:33:20

+0

是啊..失败了,但我不知道如何做到另一种更安全的方式= / – 2013-04-05 19:35:28