2011-06-20 35 views
0

我有這些類和函數:從XMLAndroid的SAXParser的工作2.2.1但不是2.2

閱讀喜好

private void readPreferences(InputSource is) { 
PrefsFetcher pf = new PrefsFetcher(); 
prefs = pf.getPreferences(is); 
if (prefs == null) { 
    Log.d(Constants.TAG, "prefs == null"); 
} 
// save to DB 
savePreferences(); 
} 

偏好提取程序

public class PrefsFetcher { 

public ArrayList<Preferences> getPreferences(InputSource is) { 

    ArrayList<Preferences> prefs = null; 

    try { 
      SAXParserFactory factory = SAXParserFactory.newInstance(); 
     SAXParser saxParser = factory.newSAXParser(); 
     XMLReader xmlReader = saxParser.getXMLReader(); 

     PrefsHandler handler = new PrefsHandler(); 
     xmlReader.setContentHandler(handler); 
     Log.d(Constants.TAG, "Parsing XML"); 
     xmlReader.parse(is); 
     prefs = handler.getPreferences(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return prefs; 
} 

}

首處理器

public class PrefsHandler extends DefaultHandler { 

private static final String PREFERENCES = "preferences"; 
private static final String DNI = "id"; 
private static final String FREQUENCY = "interval"; 
private static final String PHONE_NUMBER = "phoneNumber"; 
private static final String SERVER_ADDRESS = "serverAddress"; 
private static final String SERVER_PORT = "serverPort"; 
private static final String SERVER_PREF_ADDRESS = "prefAddress"; 
private static final String SERVER_PREF_PORT = "prefPort"; 

private boolean idChars; 
private boolean frequencyChars; 
private boolean phoneNumberChars; 
private boolean serverAddressChars; 
private boolean serverPortChars; 
private boolean prefAddressChars; 
private boolean prefPortChars; 

boolean startPreferences; 

private int numPrefs; 
private Preferences pref; 
private final ArrayList<Preferences> prefs; 

public PrefsHandler(){ 
    this.prefs = new ArrayList<Preferences>(); 
} 

@Override 
public void startDocument(){ 
} 

@Override 
public void startElement(String uri, String localName, String qName, Attributes atts) { 

    //Log.d(Constants.TAG, "XML localName: " + localName + " qName: " + qName); 

    if (localName.equals(PREFERENCES)) { 
     this.startPreferences = true; 
     this.pref = new Preferences(); 
    } 
    if (this.startPreferences){ 
     if (localName.equals(FREQUENCY)) { 
      this.frequencyChars = true; 
     } else if (localName.equals(PHONE_NUMBER)) { 
      this.phoneNumberChars = true; 
     } else if (localName.equals(DNI)) { 
      this.idChars = true; 
     } else if (localName.equals(SERVER_ADDRESS)) { 
      this.serverAddressChars = true; 
     } else if (localName.equals(SERVER_PORT)) { 
      this.serverPortChars = true; 
     } else if (localName.equals(SERVER_PREF_ADDRESS)) { 
      this.prefAddressChars = true; 
     } else if (localName.equals(SERVER_PREF_PORT)) { 
      this.prefPortChars = true; 
     } 
    } 
} 

@Override 
public void endDocument(){} 

@Override 
public void endElement(String uri, String localName, String qName) { 
    if (localName.equals(PREFERENCES)){ 
     this.startPreferences = false; 
     this.numPrefs++; 
     this.prefs.add(this.pref); 
    } 
    if (this.startPreferences){ 
     if (localName.equals(FREQUENCY)) { 
      this.frequencyChars = false; 
     } else if (localName.equals(PHONE_NUMBER)) { 
      this.phoneNumberChars = false; 
     } else if (localName.equals(DNI)) { 
      this.idChars = false; 
     } else if (localName.equals(SERVER_ADDRESS)) { 
      this.serverAddressChars = false; 
     } else if (localName.equals(SERVER_PORT)) { 
      this.serverPortChars = false; 
     } else if (localName.equals(SERVER_PREF_ADDRESS)) { 
      this.prefAddressChars = false; 
     } else if (localName.equals(SERVER_PREF_PORT)) { 
      this.prefPortChars = false; 
     } 
    } 
} 

@Override 
public void characters(char [] ch, int start, int length) { 
    String chString = ""; 
    if (ch != null) { 
     chString = new String (ch, start, length); 
    } 

    if (this.startPreferences) { 
     //Log.d(Constants.TAG, "chString: " + chString); 
     if (this.idChars) { 
      this.pref.setId(chString); 
     } else if (this.frequencyChars) { 
      this.pref.setFrequency(chString); 
     } else if (this.phoneNumberChars) { 
      this.pref.setPhoneNumber(chString); 
     } else if (this.serverAddressChars) { 
      this.pref.setServerAddress(chString); 
     } else if (this.serverPortChars) { 
      this.pref.setServerPort(chString); 
     } else if (this.prefAddressChars) { 
      this.pref.setPrefAddress(chString); 
     } else if (this.prefPortChars) { 
      this.pref.setPrefPort(chString); 
     } 
    } 
} 

public ArrayList<Preferences> getPreferences(){ 
    Log.d(Constants.TAG, "prefs length: " + prefs.size()); 
    return this.prefs; 
} 

public String getAttributeValue(String attName, Attributes atts){ 
    String result = null; 
    for (int i = 0; i < atts.getLength(); i++){ 
     String thisAtt = atts.getLocalName(i); 
     if (attName.equals(thisAtt)){ 
      result = atts.getValue(i); 
      break; 
     } 
    } 
    return result; 
} 

}

如果我上運行模擬器或在HTC野火與2.2.1這個代碼,它工作得很好,我能保存在數據庫中的喜好。但是,當我在2.2版的三星Galaxy S上運行它時,我在readPreferences函數中返回null值。

這是2.2上的錯誤還是我做錯了什麼?

感謝你的幫助,

回答

0

它是不是在2.2中的錯誤或我做錯了什麼?

我不知道在2.2中是否有bug,但是你至少在做一件事情是錯誤的。

characters方法可以被解析器多次調用,部分地爲每個調用提供字符。你的characters方法只有在你幸運的時候纔會起作用,它只被調用一次。

妥善處理在SAX字符,你需要(每個在這裏你需要收集字符標記)初始化在startElement方法的緩衝區,收集字符轉換成在characters法進行緩衝,並得到結果的endElement方法。

相關問題