0

I am not able to parse my XML here. It returns "Item" only.
My AndroidActivity cannot be shown as it is very big. That's why I have only shown the part which is responsible for parsing.

My XML Looks like this :

<MyResource>
<Item>First</Item>
<Item>Second</Item>
</MyResource>

My ActivityClass method:

public class ShowItems extends Activity{
    ListView lv;
    ListAdapter adapter;
    static final String KEY_RESOURCE = "MyResource"; // parent node 
    static final String KEY_ITEM = "Item";
    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
    String[] from={KEY_ITEM };
    int[] to={R.id.mylist_item};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.showitems);
        
        lv=(ListView) findViewById(R.id.lv_items);
        parseXML();
        adapter = new SimpleAdapter(this, mylist,R.layout.list_item,from , to); 
        lv.setAdapter(adapter);
    }

private void parseXML() {
    // TODO Auto-generated method stub
    XMLParser parser = new XMLParser();
    
    final String URL="http://10.0.2.2:8080/MySite/xml";
    String xml = parser.getXmlFromUrl(URL); 
    Document doc = parser.getDomElement(xml); 
    NodeList nl = doc.getElementsByTagName(KEY_RESOURCE); 
    for (int i = 0; i < nl.getLength(); i++) {

        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i); 
        map.put(KEY_ITEM, parser.getValue(e, KEY_ITEM)); 
        mylist.add(map); }
}

My XML Parser Class:

import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import android.util.Log;
public class XMLParser {
    public String getXmlFromUrl(String url) { 
        String xml = null; 
        try { 
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            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; 
    }
    
    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 DOM 
            return doc; 
    }
    
    public String getValue(Element item, String str) {       
        NodeList n = item.getElementsByTagName(str);         
        return this.getElementValue(n.item(0)); 
    } 
    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 ""; 
      } 
}

I am not able to parse my XML here. What is the problem here?
It returns "Item" only.
What do I need to do in my ActivityClass especially in this part of the code?

String xml = parser.getXmlFromUrl(URL); 
    Document doc = parser.getDomElement(xml); 
    NodeList nl = doc.getElementsByTagName(KEY_RESOURCE); 
    for (int i = 0; i < nl.getLength(); i++) {
        
        
        HashMap<String, String> map = new HashMap<String, String>();
        Element e = (Element) nl.item(i); 
        map.put(KEY_ITEM, parser.getValue(e, KEY_ITEM)); 
        mylist.add(map); }
11
  • I am not sure what you want here, can you please be more clear? Commented Jul 2, 2013 at 14:01
  • you see his XML. He has two <Item> tags that he need to parse through DOM. And When he parse it through the above described method only the first <Item> tag is parsed the other (or the reamaining ones) are ignored. Commented Jul 2, 2013 at 16:20
  • @AltairRules: 1) Are you getting "First" (or) "Second" as input? 2) Could you print and see size of NodeList nl = doc.getElementsByTagName(KEY_RESOURCE);? Commented Jul 2, 2013 at 16:56
  • I mean "Second" as output, not input Commented Jul 2, 2013 at 17:05
  • i am getting output as "Item" when i do this : System.out.println(mylist); Commented Jul 2, 2013 at 17:11

1 Answer 1

0

Your getValue() method gets MyResource element, from there, you need to get all Items under MyResource and do getElementValue(). Example code is:

   public Map getValue(Element item, String str) {
        NodeList n = item.getElementsByTagName(str);
        for (int i = 0; i < n.getLength(); i++) {
            System.out.println(getElementValue(n.item(i)));
        }
        //Here store it in list/map and return list/map instead of String
        return list/MapHere;
    }
Sign up to request clarification or add additional context in comments.

6 Comments

where should i put this code. See that my for loop is running. how should i call this method ?
@Altair: you have this method in XMLParser class.
System.out.println(getElementValue(n.item(i))); is showing all the items in my Logcat output...but only First is retrieved.
@Altair: my code is example to print to console, if you want it returned, you need to store those values some where right? put them in map (or) list or some where.
okay.well i am storing it in map na ?? map.put(KEY_ITEM, parser.getValue(e, KEY_ITEM));
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.