2012-04-16 2 views
0

XmlPullParser.END_DOCUMENTタグの2倍の処理がAndroidの組み込みSAXパーサーにあります。コードは単純です:XML文書は基本的には(文字列s)のように見えますXmlPullParserのファジー解釈.END_DOCUMENT

String s; //actually contains XML 
    //blah-blah 
    factory = XmlPullParserFactory.newInstance(); 
    factory.setNamespaceAware(false); 
    xpp = factory.newPullParser(); 
    StringReader sw=new StringReader(s); 
    xpp.setInput(sw); 
    int eventType = xpp.getEventType(); 
    while (eventType != XmlPullParser.END_DOCUMENT) 
    { 
     if (eventType == XmlPullParser.START_TAG) 
     { 
       //blah-blah 
     } 
     else if(eventType==XmlPullParser.TEXT) 
     { 
       //blah-blah 
     } 
     else if (eventType == XmlPullParser.END_TAG) 
     { 
       //blah-blah 
     } 
     eventType=xpp.next(); 
    } 

場合:このすべてを

<?xml version="1.0" encoding="utf-8"?> 
<templates> 
    <template key="Person" name="Person"> 
     <field key="Photo" name="Photo" type="image" hint="Press to select image"/> 
    </template> 
</templates> 

が正常に動作します。しかし、最後のタグ</templates>の後に余分な文字があると、ここで変わってしまいます(私のXMLの性質上、ときどき最終タグの後にいくつかのゴミのシンボルが現れることがあります)。ほとんどのAndroidデバイス(約90%)では、SAXパーサーは余分な文字を無視しますが、ICS-SAXパーサーを搭載したデバイスのほとんどが余分な文字を解析してクラッシュします。

質問があります:XML標準とは何ですか? SAXパーサーは、最後のタグの後に余分なシンボルを解析する必要がありますか?とにかくXmlPullParser.END_DOCUMENTは何ですか?データの終わりか、最後のタグのどちらかですか?

+0

どのように「クラッシュ」を意味しますか? –

+0

xpp.next() - XMLドキュメントの無効な文字を送信しますが、XMLドキュメントの最終タグに達した後に解析を停止することを期待していましたが、ほとんどのデバイスでは他のデバイスで記述されているとおりに動作しません。 – barmaley

+0

理解できませんEND_DOCUMENTタグの/>の後に解析しようとする理由は、代わりにループを終了する必要があります。それを自分自身で見て、どのデバイスを取るまで、それをまったく信じてはいけませんか? –

答えて

0

ルート要素の終了タグの後に空白以外の文字がある場合、ファイルは整形式XMLではなく、このファクトをアプリケーションに報告する必要があります。

+0

Hmmm ...なぜこの場合標準のAndroid SAXパーサーは報告しませんか? – barmaley

+0

そのパーサのサプライヤに尋ねる必要があります。 –