无法在android中解析正确的xml

时间:2012-05-18 06:51:30

标签: android xml-parsing

这是我的xml数据

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<menu>
<item_category>
<category_name>ICECREAM</category_name>
<item>
<item_name>SOFTY</item_name>
<item_price>7.00</item_price>
</item>
<item>
<item_name>STICK</item_name>
<item_price>15.00</item_price>
</item>
<item>
<item_name>CONE</item_name>
<item_price>25.00</item_price>
</item>
</item_category>
<item_category>
<category_name>PIZZA</category_name>
<item>
<item_name>PIZZA-HOT</item_name>
<item_price>35.00</item_price>
</item>
<item>
<item_name>PIZZA-CRISPY</item_name>
<item_price>29.00</item_price>
</item>
</item_category>
</menu>

我想在列表视图中显示来自此xml的item_name和item_price

这是我的主要行为,我正在解析值

static final String URL = "http://192.168.1.112/dine/index.php/dineout/mob_view";
    //static final String URL = "http://192.168.1.112/dineout/index.php/dineout/view";

    // XML node keys
    static final String KEY_MENU= "menu"; // parent node
    //static final String KEY_ID = "foodjoint_id";
    static final String KEY_CATEGORY= "category_name";
    static final String KEY_ITEM_CATEGORY="item_category";
    static final String KEY_ITEM= "item";
    static final String KEY_ITEM_NAME= "item_name";
    static final String KEY_PRICE= "item_price";


    @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 n;
        NodeList ncategories;
         ncategories = doc.getElementsByTagName(KEY_MENU);

           for(int i=0;i<ncategories.getLength();i++){
               Element e = (Element)ncategories.item(i);
               n=e.getElementsByTagName(KEY_ITEM_CATEGORY);

               for(int c=0;c<n.getLength();c++){ 
                 HashMap<String, String> map = new HashMap<String, String>();
                  e=(Element)n.item(c);


                  Log.e("catname", parser.getValue(e, KEY_CATEGORY).toString());
                  map.put(KEY_CATEGORY, parser.getValue(e,KEY_CATEGORY));

                  NodeList  ns=e.getElementsByTagName(KEY_ITEM);
                  for(int j=0;j<ns.getLength();j++){

                     e=(Element)ns.item(j);
                     Log.e("itemname", parser.getValue(e,KEY_ITEM_NAME).toString());
                     map.put(KEY_ITEM_NAME, parser.getValue(e, KEY_ITEM_NAME));
                     Log.e("itemprice", parser.getValue(e, KEY_PRICE).toString()+"\n");

                     map.put(KEY_PRICE, parser.getValue(e, KEY_PRICE));

                  }
            menuItems.add(map);

           }
           }





        // Adding menuItems to ListView
        ListAdapter adapter = new SimpleAdapter(this, menuItems,
                R.layout.list_item,
new String[] {KEY_CATEGORY,KEY_ITEM_NAME,KEY_PRICE}, new int[] {R.id.category,R.id.name,R.id.costlab });

        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 category = ((TextView) view.findViewById(R.id.category)).getText().toString();
                String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
                //String description = ((TextView) view.findViewById(R.id.desciption)).getText().toString();
                String cost = ((TextView) view.findViewById(R.id.cost)).getText().toString();
                // Starting new intent
                Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
                //in.putExtra(KEY_ITEM, name);

                in.putExtra(KEY_CATEGORY, category);
                in.putExtra(KEY_ITEM_NAME,name);
                in.putExtra(KEY_PRICE, cost);

                //in.putExtra(KEY_DESC, description);
                startActivity(in);

            }
        });
    }

}

这是我的xml解析器。

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

        } 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.getNextSibling() != null){
                  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));
        }

这是我的logcat输出:

05-18 12:07:44.562: E/catname(25201): ICECREAM
05-18 12:07:44.562: E/itemname(25201): SOFTY
05-18 12:07:44.562: E/itemname(25201): STICK
05-18 12:07:44.562: E/itemname(25201): CONE
05-18 12:07:44.562: E/catname(25201): PIZZA
05-18 12:07:44.562: E/itemname(25201): PIZZA-HOT
05-18 12:07:44.562: E/itemname(25201): PIZZA-CRISPY

但是我正在通过设备运行,我在屏幕上获得了价值 冰淇淋 多愁善感 COST


PIZZA PIZZA CRISPY COST


并非所有值。

所以我的要求是1)查看category_name,item_name,item price。但是每个项目的类别名称应该是重复的。

0 个答案:

没有答案