2016-05-31 18 views
0

私はSAXパーサーによって次のXML文書を解析してみてください:SAXパーサ - NumberFormatExceptionが

<?xml version="1.0" encoding="UTF-8" ?> 

<dance title="foxtrot" id="1"> 

    <type>ballroom</type> 

    <scene>assembly hall</scene> 

    <numberOfDancers>10</numberOfDancers> 

    <music>phonogram</music> 

    <dancers> 
     <dancer>Ivanov Ivan</dancer> 
     <dancer>Petrova Ludmila</dancer> 
    </dancers> 

    <number>22</number> 

</dance> 

それは文字である:

if (thisElement.equals("numberOfDancers")) { 
    dance.setNumberOfDancers(new Integer((new String(ch, start, length)))); 
} 

、これは私が得たものである:

java.lang.NumberFormatException: For input string: " 

    " 
at  java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
at java.lang.Integer.parseInt(Integer.java:569) 
at java.lang.Integer.parseInt(Integer.java:615) 
at parsers.SAXParser.characters(SAXParser.java:58) 
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.characters(AbstractSAXParser.java:546) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:463) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848) 
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777) 
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) 
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) 
at  com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) 
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:327) 
at javax.xml.parsers.SAXParser.parse(SAXParser.java:328) 
at Main.main(Main.java:37) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 




Integer.java:569 is next: 
    } else if (firstChar != '+') 
        throw NumberFormatException.forInputString(s); 

どこに問題がありますか?

+0

より良い回答を得るには、ContentHandlerコードを表示してください。 –

答えて

0

あなたのコードでは、部分文字列new String(ch, start, length)を解析してIntegerにしようとしています。 NumberFormatExceptionがちょうどそれが言う何を言って - 改行文字が数字として解釈することはできません:あなたはXMLでこのような何かを持っている場合

java.lang.NumberFormatException: For input string: " 

" 

これが発生する可能性があります。

... 
<scene>assembly hall</scene> 
<numberOfDancers> 
</numberOfDancers> 
<music>phonogram</music> 
... 

は、XML入力を確認してください。

+0

回答ありがとうございますが、タグ間に改行記号がありません。私のXMLファイルは、私の投稿とまったく同じです。 – savelich

0

変数thisElementの要素テキストは、xmlの現在の場所が何であるかとは関係ありません。エラーメッセージから、数字を保持すると予想される箇所に改行を含む空白文字列が保持されていることを示しています。空白のストリームは、現在の要素の前の要素テキストです。

コンテンツハンドラを表示したり、thisElementを初期化する方法、またはこれをさらに診断するために必要な、ドキュメント内の現在地の追跡方法を表示しないでください。

文字メソッドがSAXドキュメントに準拠していないことは明らかです。 charactersメソッドは、パーサーによって要素ごとに複数回呼び出される可能性があります。endElementメソッドが呼び出されるまで、完全な要素テキストを持つことはできません。 the Oracle tutorial

パーサーは、一度に特定の文字数を返す必要はありません。パーサーは、一度に1文字から数千までの何かを返すことができ、依然として標準に準拠した実装です。したがって、アプリケーションが見る文字を処理する必要がある場合は、characters()メソッドをjava.lang.StringBufferに文字を蓄積させ、すべてが見つかった場合にのみ操作してください。

文字メソッドは、バッファにコンテンツを保存するだけで済みます(たとえば、StringBuilderに追加)。 endElementメソッドの値をチェックし(数値として解析する前に空白を削除する)、バッファをクリアします。

ここでは、ContentHandlerの動作例を示します。これは、読み取られているXML内の位置を追跡し、現在のパスに基づいてオブジェクトのプロパティにテキストを一致させると、エレメントの終わりに達するまで要素テキストを保存します。

関連する問題