2013-04-05 85 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