私はC++コードからいくつかのhtmlを解析しようとしています。私はRapidXML、TinyXMLとXercesを試しました。私がgetDocumentRoot()
を呼び出した後、最初の2つでは解析エラーが発生しました(解析しようとしているコードが破損しています:<>
は閉じていません)。C++で無効なXMLを解析する
壊れたコードを解析する必要がある場合に、これらのケースを進めるにはどうすればよいですか?この種の問題のライブラリがありますか?
私はC++コードからいくつかのhtmlを解析しようとしています。私はRapidXML、TinyXMLとXercesを試しました。私がgetDocumentRoot()
を呼び出した後、最初の2つでは解析エラーが発生しました(解析しようとしているコードが破損しています:<>
は閉じていません)。C++で無効なXMLを解析する
壊れたコードを解析する必要がある場合に、これらのケースを進めるにはどうすればよいですか?この種の問題のライブラリがありますか?
まず、XMLが壊れている場合(HTMLが一般的にそうであるように)、DOMパーサーを使用するのは間違いありません。 SAXのようなイベントベースのパーサー(expat、Xercesなど)を使用すると、より良い運を得ることができます。
これは失敗します。なぜなら、Webパーツから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++のための最も簡単で効率的なxmlパーサの1つを見つけました。おそらく、あなたの問題を解決するのに役立ちます。
C++でもXMLでも、関連するコードを投稿した場合に役立ちます。 – pg1989
代わりにHTMLパーサを使用してみてください。 – Mat
あなたが何をしたいのかに応じて進める方法。したがって、XMLは無効です。どのように修正したいですか?あまりにも多くの仮定をするパーサを修正することは期待できませんので、壊れたドキュメントを見つけたときに何をしたいのかを指定する必要があります。 –