1

SAX パーサーを使用する場合、ノード コンテンツに " があると解析に失敗します。これを解決するにはどうすればよいですか? すべての " 文字を変換する必要がありますか?

言い換えれば、ノードに引用符があるときはいつでも:

 <node>characters in node containing "quotes"</node>

そのノードは、ハンドラが解析するときに複数の文字配列に分割されます。これは正常な動作ですか?引用符がなぜこのような問題を引き起こすのでしょうか?

私が使用しているコードは次のとおりです。

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

 ...


HttpGet httpget = new HttpGet(GATEWAY_URL + "/"+ question.getId());
          httpget.setHeader("User-Agent", PayloadService.userAgent);
          httpget.setHeader("Content-Type", "application/xml");

          HttpResponse response = PayloadService.getHttpclient().execute(httpget);
          HttpEntity entity = response.getEntity();

          if(entity != null)
          {        
              SAXParserFactory spf = SAXParserFactory.newInstance();
              SAXParser sp = spf.newSAXParser();            
              XMLReader xr = sp.getXMLReader();            

              ConvoHandler convoHandler = new ConvoHandler();
              xr.setContentHandler(convoHandler);             
              xr.parse(new InputSource(entity.getContent()));                                


              entity.consumeContent();         

               messageList = convoHandler.getMessageList();


          }
4

2 に答える 2

6

エラーは、最新のコメントで参照されているハンドラー クラスにあります。

ContentHandler を記述する際の一般的な誤りは、すべての文字データに対して characters メソッドが 1 回だけ呼び出されると想定することです。実際には、収集する必要がある文字データのチャンクで複数回呼び出すことができます。複数の文字配列に分割するのは正常な動作です。

おそらく、startElement メソッドでコレクター (おそらく StringBuffer) を開始し、characters メソッドでデータを収集してから、コメントに表示されている message.setText が呼び出される endElement メソッドでデータを使用する必要があります。

于 2010-04-05T02:59:44.217 に答える
1

正解は既に与えられています (文字データが単一のイベントとして送信されることを保証するものではありません)。考慮すべきことの 1 つは、おそらく Stax (または xmlpull) の「プル」インターフェースを備えたパーサーを使用する方がうまくいくということです。すべての char データが単一のトークンとして報告されるように Stax パーサーに強制する方法があります (合体を有効にします)。Stax(または一般的にプルパーサー)はSAXよりも少し便利な使用法と見なされており、Androidでも実行される実装があります(Android SDKにはxmlpullもバンドルされていると思います)。Woodstox と Aalto が機能するはずです。

于 2010-12-17T18:07:34.470 に答える