6

RSS および Atom ファイルを解析する際に SAX で問題が発生している連絡先がいます。彼によると、Item 要素からのテキストがアポストロフィまたはアクセント付きの文字で切り捨てられているようです。エンコーディングにも問題があるようです。

私は SAX を試してみましたが、いくつかの切り捨ても行われていますが、それ以上掘り下げることはできませんでした。誰かが以前にこれに取り組んだことがあれば、いくつかの提案をいただければ幸いです。

これは、ContentHandler で使用されているコードです。

public void characters( char[], int start, int end ) throws SAXException {
//
    link = new String(ch, start, end);

編集: エンコーディングの問題は、Java が Unicode で動作することを知っているため、情報をバイト配列に格納することが原因である可能性があります。

4

3 に答える 3

13

characters() メソッドは、テキスト要素の完全な文字コンテンツを 1 回のパスで提供するとは限りません。テキスト全体がバッファ境界にまたがる場合があります。start 要素イベントと end 要素イベントの間で文字を自分でバッファする必要があります。

例えば

StringBuilder builder;

public void startElement(String uri, String localName, String qName, Attributes atts) {
   builder = new StringBuilder();
}

public void characters(char[] ch, int start, int length) {
   builder.append(ch,start,length);
}

public void endElement(String uri, String localName, String qName) {
  String theFullText = builder.toString();
}
于 2009-12-11T21:01:33.203 に答える
5

XML エンティティは、SAX で特別なイベントを生成します。通常は必要ありませんが、 LexicalHandlerでそれらをキャッチできます。しかし、これは、タグごとに 1 つの文字イベントしか受信しないと想定できない理由を説明しています。他の回答で説明されているように、バッファーを使用してください。

たとえばhello&world、シーケンスを生成します

  • startElement
  • 文字こんにちは
  • startEntity
  • キャラクター&
  • endEntity
  • 文字の世界

さらにいくつかの例が必要な場合は、補助 SAX インターフェイスをご覧ください。その他の特別なイベントは、外部エンティティ、コメント、CDATA などです。

于 2009-12-11T22:16:39.647 に答える
1

入力を SAX にどのように渡していますか? InputStream (推奨) またはリーダーとして? したがって、byte[] から始めて、ByteArrayInputStreamを使用してみてください。

于 2009-12-11T19:40:14.473 に答える