2

libxml2 HTMLParser モジュールを使用して iOS で Web ページの HTML を解析するプロジェクトに取り組んできました。次の行を含む Web ページを解析しようとすると、libxml2 の htmlParseDocument から EXC_BAD_ACCESS エラーが発生します。

<?xml version="1.0" encoding="UTF-8"?>

この行を HTML から取り除くと、解析は完全に機能します。

また、DTHTMLParser クラスを使用して libxml2 SAX コールバックを Objective-C コードにバインドしていることにも注意してください。

htmlParseDocument の EXC_BAD_ACCESS についてはあまり詳しく説明しないので、エラーを再現する Xcode プロジェクトのサンプルを作成しました。iOS 5.1 を対象とした Mountain Lion の Xcode 4.4 で作成しました。まず問題の行を含まない HTML ファイルを解析し、次に問題の行を含むドキュメントを解析しようとしてクラッシュします。ここからダウンロードできます: http://michaelmanesh.com/code/libxml2-crash.zip

4

2 に答える 2

1

DTHTMLParser の問題は、libxml で c コールバックを準備するメソッドが、処理命令が NULL に遭遇したときに呼び出す関数の関数ポインタを明らかに設定しなかったことでした。このため、処理命令により、libxml2 がランダムなアドレスで関数を呼び出そうとし、EXC_BAD_ACCESS が発生しました。

処理命令が検出されたときに呼び出されるオプションのデリゲート メソッドのサポートを実装するか、デリゲートに実装されていない場合はハンドラー構造体で NULL を実装することで、DTHTMLParser の問題を修正しました。

于 2012-08-09T17:03:12.947 に答える
0

LibXMLは、ほぼ同じ構文を持つ処理命令として誤ってそれを取り上げていると思います。Libxml は、含まれているすべての行を<?処理命令として扱います。何が問題なのかを正確に特定することはできませんが。疑問符を削除すると、通常の要素として解析され、parser:didStartElement:attributes:コールバック メソッドで属性が取得されます。疑問符と xml ( <? xml) の間にスペースを入れると、メソッドに戻りparser:foundCharactersます。あなたの要件が何であるかはわかりませんが、クラッシュしないようにする2つの方法があります。

于 2012-08-09T03:53:53.690 に答える