zoukankan      html  css  js  c++  java
  • Android使用Dom解析xml文件并进行展示

     本程序实现了使用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数据格式文件的解析。

  • 相关阅读:
    《程序员修炼之道》阅读笔记2
    《程序员修炼之道》阅读笔记1
    Ubuntu16桥接模式上网并设置静态ip
    读《架构漫谈》有感
    质量属性6个常见属性的场景分析
    sql注水
    python版本切换
    使用vue-cli构建 webpack打包工具时,生产环境下,每次build时,删除dist目录,并重新生成,以防dist目录文件越来越多。
    Java栈与堆
    从一个字符串s的第i个字符(不包括此字符)开始删除n个字符
  • 原文地址:https://www.cnblogs.com/LIANQQ/p/2828114.html
Copyright © 2011-2022 走看看