0

我正在尝试解析一个包含我的 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::find 几次,它总是说它返回(如果存在)第一个匹配的第一个字符的位置。在这里,它给了我字符串的最后一个字符,但只在我的变量l中。
f没问题。

链接到 std::string::find

那么谁能告诉我我做错了什么?

4

3 回答 3

5

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

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

另外,请考虑使用真正的 XML 解析器,不要自己尝试或通过其他不适当的方式尝试。

于 2013-04-05T17:37:39.877 回答
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);   
    //                                    ^^^^^^^^^
}

这是一个活生生的例子

此外,请注意名称,例如_line. 根据 C++11 标准的第 17.6.4.3.2/1 段:

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

于 2013-04-05T17:38:35.790 回答
3

不要这样做!

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

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

PS:尽可能使用const

std::string const temp = ...
// ...
std::string const line = ...
于 2013-04-05T19:29:58.767 回答