I am trying to parse apple’s plist file with help of Apache Commons Configuration libraries. When I tried example below as Java Application everything works fine, but the same code on Android is throwing exception.
Ok, for more details see codes below:
This is entry point in my android app:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
Log.i("AC", "Hello");
XMLPropertyListConfiguration plist = new XMLPropertyListConfiguration();
plist.setFileName("assets/data.plist");
plist.load();
Object prop = plist.getProperty("Resorts");
if(prop instanceof List) {
List<XMLPropertyListConfiguration> resorts = (List<XMLPropertyListConfiguration>) prop;
Log.i("AC",resorts.get(0).getClass().toString());
Log.i("AC",resorts.get(1).getClass().toString());
for(int i=0; i<resorts.size(); i++) {
String folder = (String) resorts.get(i).getProperty("Folder");
List<XMLPropertyListConfiguration> courses = (List<XMLPropertyListConfiguration>) resorts.get(i).getProperty("Courses");
Log.i("AC","Resort "+i+" in folder "+folder);
for(int j=0; j<courses.size(); j++) {
BigInteger course_index = (BigInteger) courses.get(j).getProperty("Index");
String course_name = (String) courses.get(j).getProperty("Name");
Log.i("AC","- Course "+course_index+": "+course_name);
}
}
}
} catch (ConfigurationException e) {
Log.e("AC","ConfigurationException");
e.printStackTrace();
}
}
and this is plist I want to parse:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Resorts</key>
<array>
<dict>
<key>Courses</key>
<array>
<dict>
<key>Index</key>
<integer>1</integer>
<key>Name</key>
<string>Black Stork International</string>
</dict>
<dict>
<key>Index</key>
<integer>2</integer>
<key>Name</key>
<string>Black Stork Panorama</string>
</dict>
<dict>
<key>Index</key>
<integer>3</integer>
<key>Name</key>
<string>Black Stork Village</string>
</dict>
</array>
<key>Folder</key>
<string>01</string>
</dict>
</array>
</dict>
</plist>
In build path I added external jars:
- commons-configuration-1.8.jar
- commons-lang-2.6.jar
Resulting exception:
02-28 18:23:52.531: W/System.err(795): org.apache.commons.configuration.ConfigurationException: Unable to parse the configuration file
02-28 18:23:52.531: W/System.err(795): at org.apache.commons.configuration.plist.XMLPropertyListConfiguration.load(XMLPropertyListConfiguration.java:263)
02-28 18:23:52.541: W/System.err(795): at org.apache.commons.configuration.AbstractHierarchicalFileConfiguration$FileConfigurationDelegate.load(AbstractHierarchicalFileConfiguration.java:565)
02-28 18:23:52.541: W/System.err(795): at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:395)
02-28 18:23:52.541: W/System.err(795): at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:361)
02-28 18:23:52.551: W/System.err(795): at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:324)
02-28 18:23:52.551: W/System.err(795): at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:261)
02-28 18:23:52.560: W/System.err(795): at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:238)
02-28 18:23:52.560: W/System.err(795): at org.apache.commons.configuration.AbstractHierarchicalFileConfiguration.load(AbstractHierarchicalFileConfiguration.java:184)
02-28 18:23:52.560: W/System.err(795): at sk.datacrea.common.skuska2.CommonSkuska2Activity.onCreate(CommonSkuska2Activity.java:58)
02-28 18:23:52.571: W/System.err(795): at android.app.Activity.performCreate(Activity.java:4465)
02-28 18:23:52.571: W/System.err(795): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
02-28 18:23:52.571: W/System.err(795): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
02-28 18:23:52.582: W/System.err(795): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
02-28 18:23:52.582: W/System.err(795): at android.app.ActivityThread.access$600(ActivityThread.java:123)
02-28 18:23:52.582: W/System.err(795): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
02-28 18:23:52.592: W/System.err(795): at android.os.Handler.dispatchMessage(Handler.java:99)
02-28 18:23:52.592: W/System.err(795): at android.os.Looper.loop(Looper.java:137)
02-28 18:23:52.592: W/System.err(795): at android.app.ActivityThread.main(ActivityThread.java:4424)
02-28 18:23:52.601: W/System.err(795): at java.lang.reflect.Method.invokeNative(Native Method)
02-28 18:23:52.601: W/System.err(795): at java.lang.reflect.Method.invoke(Method.java:511)
02-28 18:23:52.601: W/System.err(795): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
02-28 18:23:52.601: W/System.err(795): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
02-28 18:23:52.601: W/System.err(795): at dalvik.system.NativeStart.main(Native Method)
02-28 18:23:52.601: W/System.err(795): Caused by: javax.xml.parsers.ParserConfigurationException: No validating SAXParser implementation available
02-28 18:23:52.625: W/System.err(795): at org.apache.harmony.xml.parsers.SAXParserFactoryImpl.newSAXParser(SAXParserFactoryImpl.java:75)
02-28 18:23:52.625: W/System.err(795): at org.apache.commons.configuration.plist.XMLPropertyListConfiguration.load(XMLPropertyListConfiguration.java:256)
02-28 18:23:52.625: W/System.err(795): ... 22 more
Hope that there is some guru with answers for me 🙂
Exception “No validating Saxparser implementation available” was indeed because of setting validating of Saxparser factory to true in file XMLPropertyListConfiguration.
Eventualy I used this solution:
I created new class XMLPropertyListConfiguration2 in source folder of my project, which was identical to XMLPropertyListConfiguration class from external JAR, except the validating was changed to false.
Then in onCreate method of my Activity I used this class instead of XMLPropertyListConfiguration.