1

simil- InkMLドキュメントを解析しようとしています。すべてのコンテンツのノードには、6 または 7 の数値 (負数と 10 進数も) を持つタプル (コンマで区切られたもの) があります。

テストでは、SAX のメソッド文字がすべてのデータを記憶していないことがわかりました。

コード:

    public class PenParser extends DefaultHandler {

   //code useless

public void characters(char ch[], int start, int length) throws SAXException {
//begin my debug print
        StringBuilder  buffer=new StringBuilder ();
        for(int i=start;i<length;i++){
            buffer.append(ch[i]);
        }
        System.out.println(">"+buffer);
//end my debug print

デバッグでは、バッファに関心のあるタグのすべての数が含まれているわけではなく、タグのコンテンツの最初の 107 (多かれ少なかれ)文字のみが含まれていることがわかります(私の行は 4610 文字より長くありません): 奇妙です私の意見では、StringBufferSAX解析によるこのcharのカット。

私も StringBuilder を使用していましたが、問題は残っています。

何か提案はありますか?

4

1 に答える 1

9

はい - それは明らかです。文字は、1 つのノードが解析されるときに複数回呼び出される場合があります。

as メンバーを使用しStringBuilder、コンテンツを文字で追加し、コンテンツを で処理する必要がありますendElement

編集済み

ところで。バッファを文字ごとに構築する必要はありません-これは私の文字の実装です(私は常に使用しています)

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException
    {
        characters.append(new String(ch,start,length));
    }

...そして忘れないように....

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException 
    {
                    final String content = characters.toString().trim();
                    // .... deal with content
                    // reset characters
        characters.setLength(0);
    }

 private final StringBuilder characters = new StringBuilder(64);
于 2013-02-13T09:23:55.547 に答える