6

BlackBerry で XML データを解析する方法を知りたいです。

JSONがxmlデータを解析するための良い方法であることをどこかで読みました。

JSON またはその他のメカニズムを使用して XML データを解析するためのチュートリアルはありますか?

4

4 に答える 4

12

Blackberry での XML の解析

Simple API for XML (SAX) は、パブリック メーリング リスト (XML-DEV) のメンバーによって開発されました。XML 解析にイベント ベースのアプローチを提供します。これは、ノードからノードへではなく、イベントからイベントへと移動することを意味します。SAX はイベント ドリブン インターフェイスです。イベントには、XML タグ、エラーの検出などが含まれます。J2ME SAX - BlackBerry/J2ME を参照 - 属性を持つオブジェクトの SAX 解析コレクション

XML プル パーサー - 高速で小さな XML パーサーを必要とするアプリケーションに最適です。要素を入力するためにすべてのプロセスを迅速かつ効率的に実行する必要がある場合に使用する必要があります kXML - J2ME プル パーサー - Blackberry での XML 作成のより良いアプローチ

JSON を使用した XML の解析

JSON 解析の Blackberry 標準はJSON MEです

わかりません... JSONはXMLとして表現および転送できますが、その逆はできません。

XML (Extensible Markup Language) は、文書を電子的にエンコードするための一連の規則です。これは、W3C によって作成された XML 1.0 仕様、およびその他のいくつかの関連する仕様で定義されており、すべて無償のオープン スタンダードです。

XML サンプル:

<?xml version="1.0" encoding='UTF-8'?>
<painting>
  <img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
  <caption>This is Raphael's "Foligno" Madonna, painted in
    <date>1511</date>–&lt;date>1512</date>.
  </caption>
</painting>

JSON (JavaScript Object Notation の頭字語) は、人間が判読できるデータ交換用に設計された軽量のテキストベースのオープン スタンダードです。これは、オブジェクト (「JSON」の「O」) と呼ばれる単純なデータ構造と連想配列を表す JavaScript プログラミング言語から派生したものです。JavaScript との関係にもかかわらず、言語に依存せず、ほぼすべてのプログラミング言語でパーサーを使用できます。

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" }
     ]
 }

基本的に、XML が JSON の強力な同等物である場合、次のようになります。

<Person>
  <firstName>John</firstName>
  <lastName>Smith</lastName>
  <age>25</age>
  <address>
    <streetAddress>21 2nd Street</streetAddress>
    <city>New York</city>
    <state>NY</state>
    <postalCode>10021</postalCode>
  </address>
  <phoneNumber type="home">212 555-1234</phoneNumber>
  <phoneNumber type="fax">646 555-4567</phoneNumber>
</Person>

そのような XML を JSON で解析する可能性があります。

于 2010-05-04T05:23:33.130 に答える
3

解析は通常、プロジェクトにロードできるサードパーティ ライブラリを使用して行われます。XML を使用している場合は、kXML パーサーと呼ばれるライブラリを使用しました。設定は面倒ですが、ここに設定方法の説明があります -

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

kXML の使用は非常に簡単です。このチュートリアルでは、XML ファイルを解析する方法について説明します -

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

編集: おっと、次の投稿の最初のチュートリアルには、kxml2 での xml 解析に関するかなり包括的な概要があります。だから私の投稿はちょっと冗長です。

于 2010-05-04T15:03:01.933 に答える
2
/**
 * 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
于 2011-05-13T09:53:51.473 に答える
2

このリンクは Blackberry サイトからのものです: http://www.blackberry.com/knowledgecenterpublic/livelink.exe/fetch/2000/348583/800332/800599/How_To_-_Use_the_XML_Parser.html?nodeid=820554&vernum=0

私はそれを機能させるために次の変更を加えました(ええ... BB開発サイトは時々かなり面倒です..)

updateField() メソッド内 - 必ず ui スレッドを追加してください。そうしないと、変更は発生しません。

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

また、ローカルで .xml ファイルを読み取りたい場合 (たとえば、フォルダー内など) - 明らかに、ポートを使用した localhost 接続は必要ありません。いずれにせよ、local://test.xml で実行すると、接続エラーが発生し続けました。フォーラムジャンプに行って、この小さな解決策を見つけました。(はい、私の .xml ファイルはマッドハウスと呼ばれています)。ああ、「test.xml.XMLDemoScreen - packageName とクラス名です。

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

それが役立つことを願っています! :D

于 2012-06-22T18:20:53.893 に答える