Analizza file XML su BlackBerry

Voglio sapere come analizzare i dati XML su un BlackBerry.

Ho letto da qualche parte che JSON è un buon metodo per analizzare i dati xml.

Esistono tutorial per analizzare i dati XML utilizzando JSON o altri meccanismi?

Analisi XML in Blackberry

Simple API for XML (SAX) è stato sviluppato dai membri di una mailing list pubblica (XML-DEV). Fornisce un approccio basato sull’evento per l’analisi XML. Significa che invece di passare da nodo a nodo, passa da evento a evento. SAX è un’interfaccia basata su eventi. Gli eventi includono tag XML, rilevamento di errori, ecc. J2ME SAX – vedi BlackBerry / J2ME – SAX raccolta di oggetti con attributi

Parser XML pull – È ottimale per le applicazioni che richiedono un parser XML veloce e piccolo. Dovrebbe essere usato quando tutto il processo deve essere eseguito in modo rapido ed efficiente per inserire elementi kXML – parser J2ME – vedere Migliore approccio per la creazione XML in Blackberry

Analisi dell’XML con JSON

Lo standard Blackberry per l’analisi JSON è JSON ME

Nessuna idea … JSON può essere rappresentato e trasportato come XML, ma non viceversa.

XML (Extensible Markup Language) è un insieme di regole per la codifica elettronica dei documenti. È definito nella specifica XML 1.0 prodotta dal W3C e in molte altre specifiche correlate, tutti standard aperti gratuiti.

Campione XML:

  Foligno Madonna, by Raphael This is Raphael's "Foligno" Madonna, painted in 15111512.   

JSON (un acronimo per JavaScript Object Notation) è uno standard aperto leggero basato su testo progettato per lo scambio di dati leggibili. È derivato dal linguaggio di programmazione JavaScript per rappresentare semplici strutture dati e array associativi, chiamati oggetti (“O” in “JSON”). Nonostante la sua relazione con JavaScript, è indipendente dalla lingua, con parser disponibili praticamente per ogni linguaggio di programmazione.

Campione JSON:

 { "firstName": "John", "lastName": "Smith", "age": 25, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021" }, "phoneNumber": [ { "type": "home", "number": "212 555-1234" }, { "type": "fax", "number": "646 555-4567" } ] } 

Fondamentalmente se il tuo XML è un forte equivalente di JSON, come:

  John Smith 25 
21 2nd Street New York NY 10021
212 555-1234 646 555-4567

esiste la possibilità di analizzare tale XML con JSON.

L’analisi viene solitamente eseguita utilizzando una libreria di terze parti che può essere caricata in un progetto. Se stai usando XML, ho usato una libreria chiamata parser kXML. Impostarlo può essere un problema, ma ci sono le istruzioni su come impostarlo qui –

http://supportforums.blackberry.com/t5/Java-Development/Tutorial-How-To-Use-3rd-Party-Libraries-in-your-Applications/mp/177543

http://www.craigagreen.com/index.php?/Blog/blackberry-and-net-webservice-tutorial-part-1.html

Usare kXML è abbastanza semplice. Questo tutorial qui spiega come analizzare un file XML –

http://www.roseindia.net/j2me/kxml/j2me-xml-parser.shtml

Modifica: Whoops, il primo tutorial nel prossimo post ha una panoramica abbastanza completa sull’analisi di xml su kxml2. Quindi il mio post è piuttosto ridondante.

 /** * 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 

Questo collegamento è dal sito blackberry: http://www.blackberry.com/knowledgecenterpublic/livelink.exe/fetch/2000/348583/800332/800599/How_To_-_Use_the_XML_Parser.html?nodeid=820554&vernum=0

Ho apportato le seguenti modifiche per farlo funzionare (Yea … Il sito di BB dev è piuttosto fastidioso a volte ..)

nel metodo updateField () – Assicurati di aggiungere il thread ui, altrimenti non si verificheranno cambiamenti.

  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()); } } }); 

Inoltre, se vuoi leggere il tuo file .xml localmente (come nella tua cartella ad esempio) – Ovviamente non hai bisogno di una connessione localhost con una porta. Ad ogni modo, quando l’ho eseguito con local: //test.xml e ho continuato a ricevere un errore di connessione. Sono andato a saltare sul forum e ho trovato questa piccola soluzione. (Sì, il mio file .xml si chiama madhouse). Oh e il “test.xml.XMLDemoScreen – è packageName e nome della class.

 Class cl = Class.forName("test.xml.XMLDemoScreen"); InputStream in = cl.getResourceAsStream("/madhouse.xml"); doc = docBuilder.parse(in); 

Spero possa aiutare! : D