2012-03-25 80 views
0

我一直試圖從我的C++代碼中解析一些html。我試過RapidXML,TinyXML和Xerces。前兩個給我解析錯誤(我試圖解析的代碼已損壞:某些<>未關閉),而Xerces在我調用getDocumentRoot()後返回null。在C++中解析無效的XML

如何在這些情況下進行解析破碎的代碼?是否有一些類似的問題庫?

+0

如果您發佈了任何相關的代碼,無論是C++還是XML,這都會有所幫助。 – pg1989 2012-03-25 17:50:22

+4

也許嘗試使用HTML解析器? – Mat 2012-03-25 17:52:26

+0

如何繼續取決於你想要發生什麼。所以XML是無效的。你想如何解決它?你不能指望解析器解決這個問題,這會造成太多的假設,所以你需要指定當你發現一個破損的文檔時你想要發生的事情。 – 2012-03-25 18:48:26

回答

0

首先,如果XML被破壞(正如HTML一般),那麼使用DOM解析器絕對不是可行的方法。如果你使用像SAX這樣基於事件的解析器(比如expat,Xerces等),你可能會有更好的運氣。

如果不這樣做,爲什麼不從Webkit中提取HTML解析器並掛鉤。這將是非常容錯的,如果我沒有記錯的話,它是基於事件的,所以不應該太難。

1

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

0

你試過this one?我發現了最簡單和高效的C++解析器之一...也許它可以幫助你解決你的問題。