2011-04-19 62 views
1

我得到一個奇怪的錯誤與rapidxml解析xml文件像rapidxml解析錯誤與url屬性

<?xml version="1.0" encoding="UTF-8"?> 
<IMG align="left" 
src="http://www.w3.org/Icons/WWW/w3c_home" /> 

它拋出時,「預計>」。 林使用如下所示的代碼解析

std::fstream file("./test.xml"); 
std::istream_iterator<char> eos; 
std::istream_iterator<char> iit (file); 

std::vector<char> xml(iit, eos); 
xml.push_back('\0'); 

xml_document<> doc; 
doc.parse<0>(&xml[0]); 

在IMG抹布「/」符號似乎噸是問題的數據。這是一個rapidxml錯誤還是我做錯了什麼?

回答

1

你的XML數據加載到載體的方法是錯誤的。在C++文本模式下,流默認設置了「skipws」標誌,這使得它們跳過輸入中的所有空白。你可以通過檢查你的向量的內容來驗證它 - 它將會丟失所有的空格/結束符。這顯然會導致解析器投訴。

取消設置skipws流上的標誌,以獲得正確的行爲:

file.unsetf(ios::skipws); 

或者,你可以使用文件類從rapidxml_utils.hpp加載文件:

using namespace rapidxml; 
file<> file("test.xml"); 
xml_document<> doc; 
doc.parse<0>(file.data()); 

可悲的是,加載文本使用C++流的文件非常複雜且充滿了陷阱。

至於sehe上面的測試,「錯誤接受」的情況是通過設計(我沒有足夠的聲譽來給他的回答添加評論)。你需要使用「parse_validate_closing_tags」解析標誌,使解析器檢查結束標記名稱是否匹配開始標記名稱:

doc.parse<parse_validate_closing_tags>(...); 

parse_validate_closing_tags rapidxml說明書中無。 此行爲的基本原理是性能 - 驗證結束標記是耗時的,並且在大多數情況下不需要。

0

您的XML有效。如果代碼和XML與您發佈的完全相同,則它必須是rapidxml錯誤。我想它或者不支持在多行中打破屬性列表,或者不太可能,不支持/>作爲標籤的結束。

+0

它絕對不是linebreak。如果我用src「/」替換src =「URL」,我仍然得到那個錯誤,但它不是「/>」 – P3trus 2011-04-19 14:08:23

+0

@ P3trus:什麼? – ybungalobill 2011-04-19 14:10:45

+0

這樣的代碼的作品。像這樣的代碼或代碼如不要 – P3trus 2011-04-19 14:13:39

1

我只是因爲好奇才試過。 RapidXml可能是快,但它肯定不是很好

#include "rapidxml.hpp" 

int main(int argc, char* args[]) 
{ 
     using namespace rapidxml; 
     xml_document<> doc; // character type defaults to char 
     doc.parse<0>(args[1]); // 0 means default parse flags 

} 

調用它會導致各種搞笑業務:

正確接受:

$ ./test.exe "<hello>world</hello>" 

$ ./test.exe '<?xml version="1.0" encoding="UTF-8"?> <IMG align="left" src="http://www.w3.org/Icons/WWW/w3c_home" />' 

正確拒絕

$ ./test.exe '<hello we=""/>' 
terminate called after throwing an instance of 'rapidxml::parse_error' 
    what(): expected > 
Aborted (core dumped) 

錯誤地接受:

$ ./test.exe '<hello we="close">world</die><zellq></die>' 

$ ./test.exe '<hello we="close/">world</die><we horrible=""></don'\''t>' 

因人而異

+1

「錯誤接受」的情況是由設計決定的。您需要使用「parse_validate_closing_tags」解析標記來使解析器檢查結束標記名稱是否與開始標記名稱匹配: doc.parse (...); 請參閱rapidxml手冊中的parse_validate_closing_tags。這種行爲的基本原理是性能 - 驗證結束標記是耗時的,並且在大多數情況下不需要。 – kaalus 2011-09-20 10:24:34

+0

@kaalus:+1並感謝您的支持。當xml解析器默認不解析XML時,我覺得這實際上是一團糟,但至少知道事情不會像它們出現的那樣糟糕! – sehe 2011-09-20 13:14:48