Android使用Dom解析xml檔案並進行展示

來源:互聯網
上載者:User

 本程式實現了使用Dom方法從網路端解析xml檔案,展示在列表,並實現點擊進入相關頁面。

首先我們建立一個類,用來實現http請求和xml檔案節點的擷取,這裡的http請求很簡單,就傳遞一個url,在代碼中通過這樣的一個方法實現

public String getXmlFromUrl(String url) {        String xml = null;        try {            // defaultHttpClient            DefaultHttpClient httpClient = new DefaultHttpClient();            HttpPost httpPost = new HttpPost(url);            HttpResponse httpResponse = httpClient.execute(httpPost);            HttpEntity httpEntity = httpResponse.getEntity();            xml = EntityUtils.toString(httpEntity,"utf-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        } catch (ClientProtocolException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        // return XML        return xml;    }

設定編碼格式 否則會出現亂碼

   xml = EntityUtils.toString(httpEntity,"utf-8");

 

View Code

public class XMLParser {    // constructor    public XMLParser() {    }    /**     * Getting XML from URL making HTTP request     * @param url string     * */    public String getXmlFromUrl(String url) {        String xml = null;        try {            // defaultHttpClient            DefaultHttpClient httpClient = new DefaultHttpClient();            HttpPost httpPost = new HttpPost(url);            HttpResponse httpResponse = httpClient.execute(httpPost);            HttpEntity httpEntity = httpResponse.getEntity();            xml = EntityUtils.toString(httpEntity,"utf-8");        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        } catch (ClientProtocolException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        // return XML        return xml;    }        /**     * Getting XML DOM element     * @param XML string     * */    public Document getDomElement(String xml){        Document doc = null;        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();        try {            DocumentBuilder db = dbf.newDocumentBuilder();            InputSource is = new InputSource();                is.setCharacterStream(new StringReader(xml));                doc = db.parse(is);             } catch (ParserConfigurationException e) {                Log.e("Error: ", e.getMessage());                return null;            } catch (SAXException e) {                Log.e("Error: ", e.getMessage());                return null;            } catch (IOException e) {                Log.e("Error: ", e.getMessage());                return null;            }            return doc;    }        /** Getting node value      * @param elem element      */     public final String getElementValue( Node elem ) {         Node child;         if( elem != null){             if (elem.hasChildNodes()){                 for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){                     if( child.getNodeType() == Node.TEXT_NODE  ){                         return child.getNodeValue();                     }                 }             }         }         return "";     }     /**      * Getting node value      * @param Element node      * @param key string      * */     public String getValue(Element item, String str) {                    NodeList n = item.getElementsByTagName(str);                    return this.getElementValue(n.item(0));        }}

然後我們建立一個Activity繼承與ListActivity,在這個Activity中定義一些節點。

View Code

public class AndroidXMLParsingActivity extends ListActivity {    // All static variables    static final String URL = "http://10.0.2.2/biyeshejidata/menu.xml";    // XML node keys    static final String KEY_ITEM = "item"; // parent node    static final String KEY_ID = "id";    static final String KEY_NAME = "name";    static final String KEY_COST = "cost";    static final String KEY_DESC = "description";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();        XMLParser parser = new XMLParser();        String xml = parser.getXmlFromUrl(URL); // getting XML        Document doc = parser.getDomElement(xml); // getting DOM element        NodeList nl = doc.getElementsByTagName(KEY_ITEM);        // looping through all item nodes <item>        for (int i = 0; i < nl.getLength(); i++) {            // creating new HashMap            HashMap<String, String> map = new HashMap<String, String>();            Element e = (Element) nl.item(i);            // adding each child node to HashMap key => value            map.put(KEY_ID, parser.getValue(e, KEY_ID));            map.put(KEY_NAME, parser.getValue(e, KEY_NAME));            map.put(KEY_COST, "Rs." + parser.getValue(e, KEY_COST));            map.put(KEY_DESC, parser.getValue(e, KEY_DESC));            // adding HashList to ArrayList            menuItems.add(map);        }        // Adding menuItems to ListView        ListAdapter adapter = new SimpleAdapter(this, menuItems,                R.layout.list_item,                new String[] { KEY_NAME, KEY_DESC, KEY_COST }, new int[] {                        R.id.name, R.id.desciption, R.id.cost });        setListAdapter(adapter);        // selecting single ListView item        ListView lv = getListView();        lv.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                    int position, long id) {                // getting values from selected ListItem                String name = ((TextView) view.findViewById(R.id.name)).getText().toString();                String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString();                String description = ((TextView) view.findViewById(R.id.desciption)).getText().toString();                                // Starting new intent                Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);                in.putExtra(KEY_NAME, name);                in.putExtra(KEY_COST, cost);                in.putExtra(KEY_DESC, description);                startActivity(in);            }        });    }}

最後實現點擊進入一個新的頁面的Activity。

View Code

public class SingleMenuItemActivity  extends Activity {        // XML node keys    static final String KEY_NAME = "name";    static final String KEY_COST = "cost";    static final String KEY_DESC = "description";    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.single_list_item);                // getting intent data        Intent in = getIntent();                // Get XML values from previous intent        String name = in.getStringExtra(KEY_NAME);        String cost = in.getStringExtra(KEY_COST);        String description = in.getStringExtra(KEY_DESC);                // Displaying all values on the screen        TextView lblName = (TextView) findViewById(R.id.name_label);        TextView lblCost = (TextView) findViewById(R.id.cost_label);        TextView lblDesc = (TextView) findViewById(R.id.description_label);                lblName.setText(name);        lblCost.setText(cost);        lblDesc.setText(description);    }}

 到此,完成對xml資料格式檔案的解析。

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.