2011-12-30 9 views
2

SAX(javax.xml.parsers.SAXParser)を使用してさまざまな場所に関する情報を含むXMLファイルを解析して、これらの場所を次のように表示できるAndroidアプリケーションを作成します。マップ上のポイント。残念ながら私はパーサに問題があります。私のXMLハンドラは、現在の要素の名前があると、関連するその要素の値を追加するかを確認するチェックし明らかにランダムなSAX出力エラー

<Placemark id="00001"> 
    <name>Place name</name> 
    <address>Place address</address> 
    <ExtendedData> 
    <Data name="postcode"> 
     <value>Place postcode</value> 
    </Data> 
    </ExtendedData> 
    <Point> 
    <coordinates>-0.000000,51.000000</coordinates> 
    </Point> 
</Placemark> 

XMLファイルは、次のようになり1000以上の繰り返しのグループで構成されていリストは、すなわち

@Override 
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { 

    if(localName.equals("placemark")) list.setPlaceID(attributes.getValue("id")); 
} 

@Override 
public void endElement(String uri, String localName, String qName) throws SAXException { 

    if(localName.equals("name")) list.setName(currentValue); 
    else if(localName.equals("address")) list.setAddress(currentValue); 
    else if(localName.equals("value")) list.setPostCode(currentValue); 
    else if(localName.equals("coordinates")) System.out.println(currentValue); 
} 

@Override 
public void characters(char[] ch, int start, int length) throws SAXException{ 

    currentValue = new String(ch, start, length); 
} 

これが成功した例99.9%を処理しますが、何らかの理由で私はいくつかの特定のXMLは、例えば、解析されたときに予期しない出力を生成する座標要素がある把握することはできません。

  1. <coordinates>-0.328459,51.604121</coordinates>4121なく-0.328459,51.604121

  2. <coordinates>-0.060226,51.602341</coordinates>を生成する問題の要素が分離されている場合、それらは問題なく解析することができ、さらに紛らわしい26,51.602341なく-0.060226,51.602341

を生成します。非常に大きな数が解析された場合にのみ、この問題が発生します。

これらの結果を説明する明確な説明はありますか?

答えて

2

使用

currentValue += new String(ch, start, length); 

と使用後のendElementで

currentValue = ""; 

にそれを初期化します。

なぜなら、タグの内容は、単語区切りがある場合はいつでも、複数のチャンクで送信されるからです。だからあなたはそれを連結する必要があります。

+0

参照http://stackoverflow.com/questions/8461723/xml-node-text-is-causing-issues-when-it-has-funny-characters/8676370#8676370 –

+0

ワンダフル!これは完全に機能し、私はもはや予期せぬ出力を受け取っていません。ご助力ありがとうございます! – Wolvern

+1

お手伝いします!文字列連結の代わりにStringBuilder.appendを使用します。これにより、パフォーマンスが向上する場合があり、これがベストプラクティスです。 –

関連する問題