我一直試圖從我的C++代碼中解析一些html。我試過RapidXML,TinyXML和Xerces。前兩個給我解析錯誤(我試圖解析的代碼已損壞:某些<>
未關閉),而Xerces在我調用getDocumentRoot()
後返回null。在C++中解析無效的XML
如何在這些情況下進行解析破碎的代碼?是否有一些類似的問題庫?
我一直試圖從我的C++代碼中解析一些html。我試過RapidXML,TinyXML和Xerces。前兩個給我解析錯誤(我試圖解析的代碼已損壞:某些<>
未關閉),而Xerces在我調用getDocumentRoot()
後返回null。在C++中解析無效的XML
如何在這些情況下進行解析破碎的代碼?是否有一些類似的問題庫?
首先,如果XML被破壞(正如HTML一般),那麼使用DOM解析器絕對不是可行的方法。如果你使用像SAX這樣基於事件的解析器(比如expat,Xerces等),你可能會有更好的運氣。
如果不這樣做,爲什麼不從Webkit中提取HTML解析器並掛鉤。這將是非常容錯的,如果我沒有記錯的話,它是基於事件的,所以不應該太難。
xerces-c使用許多其他異常。
如果你想擁有一個強大的XML解析器,大量使用捕獲拋出的異常。許多異常類都有額外的信息,所以您可以使用它們來創建一個非常健壯的「寬容」xml解析器。
SAX也是一個很好的起點。在的Xerces-C
例DOM解析器(我最喜歡的解析器):
XercesDOMParser* parser = new XercesDOMParser();
parser->setValidationScheme(XercesDOMParser::Val_Always);
parser->setDoNamespaces(true);
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler);
char* xmlFile = "test.xml";
try
{
parser->parse(xmlFile);
}
catch (const XMLException& toCatch)
{
/*ERROR HANDLER*/
}
catch (const DOMException& toCatch)
{
/*ERROR HANDLER*/
}
catch (...)
{
/*ERROR HANDLER*/
}
delete parser;
delete errHandler;
此外,您還可以創建自己的DOMErrorHandler作出 「更正」 的飛行。有關更多信息,請參閱xerces-c programming guide。
你試過this one?我發現了最簡單和高效的C++解析器之一...也許它可以幫助你解決你的問題。
如果您發佈了任何相關的代碼,無論是C++還是XML,這都會有所幫助。 – pg1989 2012-03-25 17:50:22
也許嘗試使用HTML解析器? – Mat 2012-03-25 17:52:26
如何繼續取決於你想要發生什麼。所以XML是無效的。你想如何解決它?你不能指望解析器解決這個問題,這會造成太多的假設,所以你需要指定當你發現一個破損的文檔時你想要發生的事情。 – 2012-03-25 18:48:26