I want to know how to parse XML data on a BlackBerry.
I read somewhere that JSON is good method to parse xml data.
Are there any tutorials to parse XML data using JSON, or any other mechanism?
I want to know how to parse XML data on a BlackBerry.
I read somewhere that JSON is good method to parse xml data.
Are there any tutorials to parse XML data using JSON, or any other mechanism?
On
Parsing is usually done using a 3rd party library that can be loaded into a project. If you're using XML, I've used a library called the kXML parser. Setting it up can be a pain, but there are instructions on how to set it up here -
http://www.craigagreen.com/index.php?/Blog/blackberry-and-net-webservice-tutorial-part-1.html
Using kXML is pretty straight forward. This tutorial here explains how to parse an XML file -
http://www.roseindia.net/j2me/kxml/j2me-xml-parser.shtml
Edit: Whoops, the first tutorial in the next post has a pretty comprehensive overview on xml parsing on kxml2. So my post's kinda redundant.
On
This link is from the blackberry site : http://www.blackberry.com/knowledgecenterpublic/livelink.exe/fetch/2000/348583/800332/800599/How_To_-_Use_the_XML_Parser.html?nodeid=820554&vernum=0
I made the following changes to make it work (Yea...BB dev site is pretty annoying sometimes..)
in the method updateField() - Make sure to add the ui thread, otherwise no change will occur.
UiApplication.getUiApplication().invokeLater(new Runnable()
{
public void run()
{
String title="Title";
_screen.add(new RichTextField(node+" : "+element));
if(node.equals(title))
{
_screen.add(new SeparatorField());
}
}
});
Also if you want to read your .xml file locally (like in your folder for example) - You obviously don't need a localhost connection with a port. Either way, when I ran it with local://test.xml and I kept getting a connection error. Went forum jumping and found this little solution. (Yes my .xml file is called madhouse). Oh and the "test.xml.XMLDemoScreen - is packageName and class name.
Class cl = Class.forName("test.xml.XMLDemoScreen");
InputStream in = cl.getResourceAsStream("/madhouse.xml");
doc = docBuilder.parse(in);
Hope that helps! :D
On
/**
* class is used to parse the XML response from the server
*/
package com.rtcf.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Vector;
import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
import net.rim.device.api.i18n.DateFormat;
import net.rim.device.api.i18n.SimpleDateFormat;
import net.rim.device.api.xml.parsers.ParserConfigurationException;
import net.rim.device.api.xml.parsers.SAXParser;
import net.rim.device.api.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.rtcf.bean.ItemBean;
import com.rtcf.bean.SpvItemBean;
import com.rtcf.bean.ItemCategoryMappingsBean;
import com.rtcf.screen.FirstSyncProgressScreen;
import com.rtcf.util.db.SQLManagerSync1;
public class ItemXMLParser extends DefaultHandler {
//private Statement statement = null;
public int currentpage = 1, totalpage = 1;
public int maxWidth;
private final int BATCH_COUNT = 100;
private String tempVal;
long startT, endT;
private Vector vecItem = new Vector(BATCH_COUNT);
private Vector vecItemCategoryMapping = new Vector(BATCH_COUNT);
//constructor
int roomInsCount = 0;
int roomMapInsCount = 0;
int TBL_FACILITYCount = 0;
int insCount = 0;
private FirstSyncProgressScreen fsps;
private SQLManagerSync1 tempDb;
//constructor
public ItemXMLParser(FirstSyncProgressScreen fsps, SQLManagerSync1 tempDb){
this.fsps=fsps;
this.tempDb = tempDb;
getData();
}
/**
* Method returns the list of data in a vector (response objects)
* @param url
* @return Vector
*/
public void getData(){
FileConnection fconn = null;
InputStream inputStream = null;
try{
// String url = "http://10.10.1.10/LDS/abcd.xml";
// Logger.debug("HttpConParamUtil.getWebData -------------------- "+url);
// HttpConParamUtil.getWebData(url, param, this, method);
// HttpConUtilSingle.getWebData(url, this);
//Logger.debug("response size -------------- "+response.size());
String fileUrl = "file:///SDCard/Item.xml";
fconn = (FileConnection)Connector.open( fileUrl, Connector.READ);
//get a factory
SAXParserFactory spf = SAXParserFactory.newInstance();
try {
inputStream = fconn.openInputStream();
//get a new instance of parser
SAXParser sp = spf.newSAXParser();
//parse the file and also register this class for call backs
sp.parse(inputStream, this);
}catch(SAXException se) {
Logger.error( " startDocument "+se.getMessage(), se);
}catch (IOException ie) {
Logger.error( " startDocument "+ie, ie);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
Logger.error( " startDocument "+e, e);
} catch (Exception e) {
// TODO Auto-generated catch block
Logger.error( " "+e, e);
}
}
catch (Exception e) {
//Logger.debug("### Exception in getData - "+e.getMessage()+" "+e.getClass());
//Dialog.inform("### Exception in getData - "+e.getMessage()+" "+e.getClass());
}finally{
try{
if(inputStream != null){inputStream.close(); }
}catch(Exception e){}
try{
if(fconn != null){fconn.close(); }
}catch(Exception e){}
}
//return response;
}// end getData
//===========================================================
// Methods in SAX DocumentHandler
//===========================================================
public void startDocument () throws SAXException{
//Logger.debug("################# In startDocument");
DateFormat timeFormat = new SimpleDateFormat("HH.mm.ss");
startT = System.currentTimeMillis();
// String currentTime = timeFormat.format(date);
Logger.debug("########## ----------Start time:" + startT);
}
public void endDocument () throws SAXException{
if( vecItemCategoryMapping.size() > 0){
//fsps.updatedProgress2(22, "Inserting TBL_ITEM_CATEGORY_MAPPING Record ");
Logger.debug("Populate TBL_ITEM_CATEGORY_MAPPING...");
tempDb.InsertTbl_item_category_mapping(vecItemCategoryMapping);
vecItemCategoryMapping = null;
//vecItemCategory = new Vector(BATCH_COUNT);
}
if( vecItem.size() > 0){
// fsps.updatedProgress2(25, "Inserting TBL_ITEM Record ");
Logger.debug("Populate TBL_ITEM...");
tempDb.InsertTbl_item(vecItem);
vecItem = null;
//vecItem = new Vector(BATCH_COUNT);
}
}
//Event Handlers
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
//Logger.debug("################# In startElement qName : "+qName);
if(qName.equals("TBL_ITEM_CATEGORY_MAPPING")){
Logger.debug("Populate TBL_ITEM_CATEGORY_MAPPING...");
populateTblItemCategoryMapping(attributes);
}
if(qName.equals("TBL_ITEM")){
Logger.debug("Populate TBL_ITEM...");
populateTblItem(attributes);
}
}
public void endElement(String uri, String localName, String qName) throws SAXException {
if(qName.equals("TBL_ITEM_CATEGORY_MAPPING")&& vecItemCategoryMapping.size() == BATCH_COUNT){
Logger.debug("Populate TBL_ITEM_CATEGORY...");
tempDb.InsertTbl_item_category_mapping(vecItemCategoryMapping);
vecItemCategoryMapping = null;
vecItemCategoryMapping = new Vector(BATCH_COUNT);
}
if(qName.equals("TBL_ITEM")&& vecItem.size() == BATCH_COUNT){
Logger.debug("Populate TBL_ITEM...");
tempDb.InsertTbl_item(vecItem);
vecItem = null;
vecItem = new Vector(BATCH_COUNT);
}
}
public void characters(char[] ch, int start, int length) throws SAXException {
//Logger.debug("################# In characters");
tempVal = new String(ch,start,length);
}
// reads the xml file and saves the ItemCategoryMappingBean data and adds to vecItemCategoryMapping
private void populateTblItemCategoryMapping(Attributes attributes) {
try{
ItemCategoryMappingsBean ItemCategoryMappingBean = new ItemCategoryMappingsBean();
try{
if((attributes.getValue("itemCategoryId"))!=null)
ItemCategoryMappingBean.itemCategoryId = Integer.parseInt(attributes.getValue("itemCategoryId"));
else {
ItemCategoryMappingBean.itemCategoryId = -1;
}
if((attributes.getValue("itemId"))!= null)
ItemCategoryMappingBean.itemId = Integer.parseInt(attributes.getValue("itemId"));
else {
ItemCategoryMappingBean.itemId = -1;
}
if((attributes.getValue("ddlFlag"))!=null)
ItemCategoryMappingBean.ddlFlag = attributes.getValue("ddlFlag").charAt(0);
else {
ItemCategoryMappingBean.ddlFlag = 'I';
}
//ItemCategoryMappingBean.categoryName = (attributes.getValue("categoryName"));
Logger.debug("####### populateTblItemCategoryMapping ");
}catch(NumberFormatException nfe){
Logger.error("### NumberFormatException SAXXMLParser -->> populateTblItemCategoryMapping() - "+nfe.getMessage(),nfe);
}
vecItemCategoryMapping.addElement(ItemCategoryMappingBean);
}catch(Exception e){
Logger.error("ItemXMLParser -->> populate TblItemCategory() - "+e.getMessage(),e);
}
}
// reads the xml file and saves the ItemBean data and adds to vecItem
private void populateTblItem(Attributes attributes) {
// TODO Auto-generated method stub
ItemBean itemBean= new ItemBean();
try{
try{
itemBean.itemId = Integer.parseInt(attributes.getValue("itemId"));
if((attributes.getValue("videoURL"))!=null)
itemBean.videoURL = (attributes.getValue("videoURL"));
else {
itemBean.videoURL = "";
}
if((attributes.getValue("itemDescription"))!=null)
itemBean.itemDescription = (attributes.getValue("itemDescription"));
else {
itemBean.itemDescription = "";
}
if((attributes.getValue("itemProcedure"))!=null)
itemBean.itemProcedure = (attributes.getValue("itemProcedure"));
else {
itemBean.itemProcedure = "";
}
if((attributes. getValue("itemStandard"))!=null)
itemBean.itemStandard = (attributes.getValue("itemStandard"));
else {
itemBean.itemStandard = "";
}
if((attributes.getValue("weight"))!=null)
itemBean.weight = (attributes.getValue("weight"));
else {
itemBean.weight = "";
}
if((attributes.getValue("ddlFlag"))!=null)
itemBean.ddlFlag = attributes.getValue("ddlFlag").charAt(0);
else {
itemBean.ddlFlag = 'I';
}
vecItem.addElement(itemBean);
Logger.debug("####### populate TblItem ");
}catch(NumberFormatException nfe){
Logger.error("### NumberFormatException SAXXMLParser -->> populateTblItemCategoryMapping() - "+nfe.getMessage(),nfe);
}
}catch(Exception e){
Logger.error("ItemXMLParser -->> populateTblItemCategory() - "+e.getMessage(),e);
}
}
}// end XMLParser
Parsing XML in Blackberry
Parsing XML with JSON
Blackberry standard for JSON parsing is JSON ME
No idea... JSON can be represented and transported as a XML, but not vice versa.
XML sample:
JSON sample:
Basically if your XML is a strong equivalent of JSON, like:
there is a possibility to parse such XML with JSON.