2012-04-16 129 views
0

我發現Android的內置SAX解析器中的XmlPullParser.END_DOCUMENT標記有雙重處理。代碼很簡單: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文檔基本上看起來像(String s)將:

<?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

雖然你是指「崩潰」? – 2012-04-16 05:02:58

+0

xpp.next() - 在XML文檔中支持無效字符,儘管我期待在到達XML文檔的最終標記後它會停止解析 - 並且在大多數設備上它的工作方式與其他人所描述的不同 – barmaley 2012-04-16 05:04:38

+0

無法理解爲什麼它試圖解析END_DOCUMENT標記的/>之後,它應該退出循環。直到看到它,我纔會相信它,我應該拿哪個設備? – 2012-04-16 05:13:47

回答

0

如果在根元素的結束標記後面有非空白字符,則該文件不是格式良好的XML,並且解析器需要嚮應用程序報告此事實。

+0

嗯...爲什麼在這種情況下標準的Android SAX解析器不報告? – barmaley 2012-04-16 08:00:36

+0

您必須詢問解析器的供應商。 – 2012-04-21 18:01:31