Parse XML on Android

前端 未结 3 1753
广开言路
广开言路 2020-12-20 06:06

I am trying to use the API for our billing system in an Android Application, but I am having trouble figuring out how to parse the XML that it returns. Here is what my funct

相关标签:
3条回答
  • 2020-12-20 06:57

    Yes SAX parser is the solution and here is the basic code to get you started:

    void parseExampleFunction(){
        SAXParserFactory spf = SAXParserFactory.newInstance();
        SAXParser sp = spf.newSAXParser();
        XMLReader xr = sp.getXMLReader();
    
        File myFile = new File( //the XML file which you need to parse );
        myFile.createNewFile();
    
        FileInputStream fOut =  new FileInputStream(myFile);
        BufferedInputStream bos = new BufferedInputStream( fOut );
    
        /** Create handler to handle XML Tags ( extends DefaultHandler ) */
    
        MessagesXMLHandler myXMLHandler = new MessagesXMLHandler(context);
        xr.setContentHandler(myXMLHandler);
        xr.parse(new InputSource(bos));
    }
    
    // the class where the parsing logic needs to defined.This preferably can be in a different .java file 
    public class MessagesXMLHandler extends DefaultHandler{
    
        //this function is called automatically when a start tag is encountered
        @Override
        public void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException 
        //variable localName is the name of the tag
    
        //this function is called autiomatically when an end tag is encountered
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
        }
    
        //this function gets called to return the value stored betweeen the closing and opening tags
        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            //now variable value has the value stored between the closing and opening tags
            String value=new String(ch,start,length);
        }
    }
    
    0 讨论(0)
  • 2020-12-20 07:02
    1. Add java-json.jar in library folder
    2. Compile files ('libs/java-json.jar') //add this line into your build

    Here is the code to convert xml response to json response:

    JSONObject jsonObj = null;
    try {
            jsonObj = XML.toJSONObject(response.toString());
    } catch (JSONException e) {
            Log.e("JSON exception", e.getMessage());
            e.printStackTrace();
    }
    
    0 讨论(0)
  • 2020-12-20 07:04

    for parse xml on android best way is to use SAXParser. i explained it bellow with demo....

    first of all create your activity class like as bellw.

    public class ActivityForSax extends ListActivity {
    private ProgressDialog pDialog;
    private ItemXMLHandler myXMLHandler;
    private String rssFeed = "https://www.dropbox.com/s/t4o5wo6gdcnhgj8/imagelistview.xml?dl=1";
    private TextView textview;
    private ListView mListView;
    private ArrayList<HashMap<String, String>> menuItems;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.xml_dom);
    
        textview = (TextView)findViewById(R.id.textView1);
        doParsing();
    
        mListView = getListView();
    }
    
    public void doParsing(){
    
        if (isNetworkAvailable()) {
            textview.setText("Loading...Please wait...");
            new AsyncData().execute(rssFeed);
        } else {
            showToast("No Network Connection!!!");
        }   
    }
    class AsyncData extends AsyncTask<String, Void, Void> {
    
        @Override
        protected void onPreExecute() {
            menuItems = new ArrayList<HashMap<String, String>>();
            pDialog = new ProgressDialog(ActivityForSax.this);
            pDialog.setTitle("Loading....");
            pDialog.setMessage("Please wait...");
            pDialog.show();
            super.onPreExecute();
        }
    
        @Override
        protected Void doInBackground(String... params) {
    
            try {
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                XMLReader xr = sp.getXMLReader();
    
                myXMLHandler = new ItemXMLHandler();
                xr.setContentHandler(myXMLHandler);
    
                URL _url = new URL(params[0]);
    
                xr.parse(new InputSource(_url.openStream()));
    
            } catch (ParserConfigurationException pce) {
                Log.e("SAX XML", "sax parse error", pce);
            } catch (SAXException se) {
                Log.e("SAX XML", "sax error", se);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
    
        }
    
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
    
            textview.setText("Done!!!");
            if (pDialog != null && pDialog.isShowing()) {
                pDialog.dismiss();
            }
    
            ArrayList<Bean> itemsList = myXMLHandler.getItemsList();
    
            for (int i = 0; i < itemsList.size(); i++) {
                Bean objBean = itemsList.get(i);
                // creating new HashMap
                HashMap<String, String> map = new HashMap<String, String>();
                // adding each child node to HashMap key => value
                map.put("TITLE :: ", objBean.getTitle());
                map.put("DESC :: ", objBean.getDesc());
                map.put("PUBDATE :: ", objBean.getPubDate());
    
                // adding HashList to ArrayList
                menuItems.add(map);
            }
    
            // Adding menuItems to ListView
            ListAdapter adapter = new SimpleAdapter(ActivityForSax.this, menuItems,
                    R.layout.list_item,
                    new String[] { "TITLE :: ", "DESC :: ", "PUBDATE :: " }, new int[] {
                    R.id.name, R.id.email, R.id.mobile });
    
            mListView.setAdapter(adapter);
    
        }
    }
    
    public void showToast(String msg) {
        Toast.makeText(ActivityForSax.this, msg, Toast.LENGTH_LONG).show();
    }
    
    public boolean isNetworkAvailable() {
        ConnectivityManager connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity == null) {
            return false;
        } else {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null) {
                for (int i = 0; i < info.length; i++) {
                    if (info[i].getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
    }
    

    now you need to create default handler class for parsing xml data.

    public class ItemXMLHandler extends DefaultHandler {
    
    Boolean currentElement = false;
    String currentValue = "";
    Bean item = null;
    private ArrayList<Bean> itemsList = new ArrayList<Bean>();
    
    public ArrayList<Bean> getItemsList() {
        return itemsList;
    }
    
    // Called when tag starts
    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
    
        currentElement = true;
        currentValue = "";
    
        if (localName.equals("item")) {
            item = new Bean();
        }
    
    }
    
    // Called when tag closing
    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
    
        currentElement = false;
    
        if (localName.equals("id")) {
            item.setId(currentValue);
        } else if (localName.equals("title")) {
            item.setTitle(currentValue);
        } else if (localName.equals("desc")) {
            item.setDesc(currentValue);
        } else if (localName.equals("pubDate")) {
            item.setPubDate(currentValue);
        } else if (localName.equals("link")) {
            item.setLink(currentValue);
        } else if (localName.equals("item")) {
            itemsList.add(item);
        }
    }
    
    // Called to get tag characters
    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
    
        if (currentElement) {
            currentValue = currentValue + new String(ch, start, length);
        }
    }
    }
    

    and finally your Bean class like as...

    public class Bean {
    
    private String id;
    private String title;
    private String desc;
    private String pubDate;
    private String link;
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
    
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    public String getDesc() {
        return desc;
    }
    
    public void setDesc(String desc) {
        this.desc = desc;
    }
    
    public String getPubDate() {
        return pubDate;
    }
    
    public void setPubDate(String pubDate) {
        this.pubDate = pubDate;
    }
    
    public String getLink() {
        return link;
    }
    
    public void setLink(String link) {
        this.link = link;
    }
    }
    
    0 讨论(0)
提交回复
热议问题