package org.aisen.android.common.setting; import android.content.Context; import android.content.res.Resources; import android.util.Xml; import com.alibaba.fastjson.JSON; import org.aisen.android.common.utils.Logger; import org.xmlpull.v1.XmlPullParser; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class SettingsXmlParser { private static final String TAG = "AppSettingsXmlParser"; private SettingsXmlParser() { } static Map<String, Setting> parseSettings(Context context, String fileName) { Map<String, Setting> settingMap = new HashMap<String, Setting>(); List<SettingArray> settingArray = new ArrayList<SettingArray>(); List<SettingExtra> settingExtras = null; Setting readSetting = null; SettingArray readSettingArray = null; SettingExtra readSettingExtra = null; XmlPullParser xmlResParser = null; try { String packageName = context.getPackageName(); Resources resources = context.getPackageManager().getResourcesForApplication(packageName); Logger.d("read xml resource, filename = " + fileName); int resId = resources.getIdentifier(fileName, "raw", packageName); // 解析URL配置 xmlResParser = Xml.newPullParser(); xmlResParser.setInput(resources.openRawResource(resId), "utf-8"); int eventType = xmlResParser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { switch (eventType) { case XmlPullParser.START_TAG: if ("setting-array".equals(xmlResParser.getName())) { readSettingArray = new SettingArray(); readSettingArray.setType(xmlResParser.getAttributeValue(null, "type")); readSettingArray.setIndex(Integer.parseInt(xmlResParser.getAttributeValue(null, "index"))); } if ("setting".equals(xmlResParser.getName())) { readSetting = new Setting(); readSetting.setType(xmlResParser.getAttributeValue(null, "type")); } if ("extras".equals(xmlResParser.getName())) { settingExtras = new ArrayList<SettingExtra>(); } if ("extra".equals(xmlResParser.getName())) { readSettingExtra = new SettingExtra(); readSettingExtra.setType(xmlResParser.getAttributeValue(null, "type")); } if ("des".equals(xmlResParser.getName())) { if (readSettingExtra != null) { readSettingExtra.setDescription(xmlResParser.nextText()); } else if (readSetting != null) { readSetting.setDescription(xmlResParser.nextText()); } else if (readSettingArray != null) { readSettingArray.setDescription(xmlResParser.nextText()); } } if ("value".equals(xmlResParser.getName())) { if (readSettingExtra != null) { readSettingExtra.setValue(xmlResParser.nextText()); } else if (readSetting != null) { readSetting.setValue(xmlResParser.nextText()); } } break; case XmlPullParser.END_TAG: if ("setting".equals(xmlResParser.getName())) { if (readSetting != null) { if (readSettingArray != null) { readSettingArray.getSettingArray().add(readSetting); } else { settingMap.put(readSetting.getType(), readSetting); } } Logger.d(TAG, String.format("parse new setting --->%s", JSON.toJSONString(readSetting))); readSetting = null; } if ("setting-array".equals(xmlResParser.getName())) { settingArray.add(readSettingArray); Logger.d(TAG, String.format("parse new settingArray --->%s", JSON.toJSONString(readSettingArray))); readSettingArray = null; } if ("extras".equals(xmlResParser.getName())) { if (readSetting != null) for (SettingExtra extra : settingExtras) readSetting.getExtras().put(extra.getType(), extra); settingExtras = null; } if ("extra".equals(xmlResParser.getName())) { settingExtras.add(readSettingExtra); Logger.d(TAG, String.format("parse new settingExtra --->%s", JSON.toJSONString(settingExtras))); readSettingExtra = null; } } eventType = xmlResParser.next(); } } catch (Exception e) { Logger.printExc(SettingsXmlParser.class, e); } finally { // if (xmlResParser != null) // xmlResParser.close(); } for (SettingArray array : settingArray) { if (array.getSettingArray().size() > array.getIndex()) { Setting setting = array.getSettingArray().get(array.getIndex()); setting.setType(array.getType()); settingMap.put(setting.getType(), setting); } } return settingMap; } }