SAXにはロケータがあり、現在の場所を追跡します。ただし、startElement()で呼び出すと、常にxmlタグの終了場所が返されます。
タグの開始位置を取得するにはどうすればよいですか?この問題を適切に解決する方法はありますか?
残念ながら、パッケージLocator
内のJavaシステムライブラリによって提供されるインターフェイスはorg.xml.sax
、ドキュメントの場所に関する詳細な情報を定義上許可していません。引用する文書のgetColumnNumber
方法(ハイライトは私が追加):
メソッドからの戻り値は、診断のための概算としてのみ意図されています。元のXMLドキュメントの文字コンテンツを編集するための十分な情報を提供することは意図されていません。たとえば、行に結合文字シーケンス、ワイド文字、サロゲートペア、または双方向テキストが含まれている場合、値はテキストエディタの表示の列に対応しない場合があります。
その仕様によると、SAXドライバーによるベストエフォートに基づいて、「ドキュメントイベントに関連付けられたテキストの後の最初の文字の位置」を常に取得します。したがって、質問の最初の部分に対する簡単な答えは次のとおりです。いいえ、これLocator
はタグの開始位置に関する情報を提供しません。また、文書内のマルチバイト文字(中国語や日本語のテキストなど)を処理している場合、SAXドライバーから取得する位置は、おそらく希望どおりではありません。
タグの正確な位置を求めている場合、または属性、属性コンテンツなどについてさらに詳細な情報が必要な場合は、独自の位置プロバイダーを実装する必要があります。
すべての潜在的なエンコーディングの問題、Unicode文字などが関係しているため、これはプロジェクトとしては大きすぎてここに投稿できないと思います。実装は、特定の要件にも依存します。
個人的な経験からの簡単な警告:InputStream
SAXパーサーに渡すラッパーを書き込むことは危険です。SAXパーサーがストリームから既に読み取った内容に基づいてイベントを報告するタイミングがわからないためです。
最初に、情報を使用することに加えて、改行やタブなどをチェックすることにより、自分のcharacters(char[], int, int)
メソッドで独自のカウントを行うことで、ドキュメント内の実際の場所がよくわかるようになります。最後のイベントの位置を覚えておくことで、現在のイベントの開始位置を計算できます。ただし、改行がすべて表示されるとは限らないことを考慮してください。改行は、には表示されないタグ内に表示される可能性がありますが、情報からそれらを推定することはできます。ContentHandler
Locator
characters
Locator
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加