1

サードパーティの REST Web サービスを使用しています。私がやっていることは、SAX パーサーを使用して応答を解析することです。<section>それに応じて、それぞれに 1 つのタグとその他のタグを含むタグのコレクションがあります<text>。このテキストは基本的に製品のレビューであるため、ユーザーは好きなもの (または ws-provider の Web サイトで許可されているもの) を入力できます。<text>このタグを 1 か所で解析中に問題が発生しました。1 つのケースでのみ 30 件ほどのレビューで応答があり、奇妙な動作をします。

これは解析中の xml の一部です

<text>Prachtige vormgeving. RVS/Zwart, zoals afbeelding hierbij. Even de handleiding doorlezen en daarna zeer handig in gebruik. Koffie is heerlijk. Heet water voor thee of zelfs kopje Nescafé. Cups zijn eur 0,31/0,33 per stuk. Via de site kan je een startersaanbieding met presentatiekist bestellen.&lt;br/&gt;Sommige onderdelen zijn natuurlijk heet, pas op met kinderhandjes. Kortom: zeer tevreden!!&lt;br/&gt; </text>

org.xml.sax.helpers.DefaultHandler私はすべてのものを行った場所を実装しました。奇妙なのは、 public void characters(char[] ch, int start, int length)上記の xml に対してメソッドが 2 回呼び出される理由です。私がデバッグしたところ、最初はchar[] chテキストが含まれている状態で呼び出され"Prachtige vormgeving...."、2 回目は空の文字列が呼び出され、実際のテキストが上書きされたため、これらの特定のレビュー アイテムのレビュー テキストがありませんでした。何故ですか?これはバグですか?

追加のチェックを行いました。既にテキストがある場合は、次回はテキストの割り当てを無視します。したがって、それでも正しく動作します。また、2回目に呼び出されたとき、qNameは空の文字列ですが、初めて「TEXT」であることがわかりました。(それはpublic void startElement(String uri, String localName, String qName, Attributes attributes)方法にあります)。私のJavaは1.5_06で、OC4J 10.1.3.5にアプリをデプロイしています。

繰り返しますが、質問は次のとおりです。これはバグですか? それとも通常の動作で、SAX 解析に関する知識が欠けているだけですか?

4

1 に答える 1

3

で受け取った文字を蓄積する必要がありcharactersます。あなたが説明する動作は、 SAX 仕様に適合します。charactersメソッドを呼び出すタイミングと方法を決定するのはパーサー次第です。

パーサーはこのメソッドを呼び出して、文字データの各チャンクを報告します。SAX パーサーは、すべての連続する文字データを 1 つのチャンクで返すか、複数のチャンクに分割する場合があります。ただし、ロケータが有用な情報を提供できるように、単一のイベントのすべての文字は同じ外部エンティティから取得する必要があります。

このようなものが役立ちます(チェックされていません):

class MyHandler extends DefaultHandler {
    StringBuilder chars = new StringBuilder();
    ...
    private void flushCharacters() {
        char [] data = chars.toString().toCharArray();
        // use data as you want or use just chars.toString()

        chars.delete(0, chars.length());
    }

    @Override
    public void characters(char [] data, int offset, int length) {
        chars.append(char, offset, length);
    }
    ...
    // call flushCharacters in 
    // startElement/endElement/processingInstruction and wherever you want
}
于 2013-03-12T18:08:36.917 に答える