HyperX
HyperX

Reputation: 1211

Error when i try to parse XML

i am having some problems with my XMLParser it crashes before application opens. The error i get is:

Error: org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)

Here is my code for XMLParser:

public class XMLParser {

    public XMLParser(){
    }

    public String getXmlFromUrl(String url){
        String xml = null;

        try{
            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;
    }

    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;
    }

    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 "";
    }

    public String getValue(Element item, String str){
        NodeList n = item.getElementsByTagName(str);
        return this.getElementValue(n.item(0));
    }

}

And in my main activity i call it like thath:

XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL);
Document doc = parser.getDomElement(xml);

So if you can help me what could be causing this problems.

Upvotes: 0

Views: 327

Answers (2)

Barney
Barney

Reputation: 2373

Do you get a android.os.NetworkOnMainThreadException? You can't call network APIs (i.e. httpClient.execute()) on the main activity thread. Instead you need to run it in an AsyncTask. Click here if you need help on how to accomplish this.

Upvotes: 0

fweigl
fweigl

Reputation: 22038

The stacktrace tell's you exactly whats wrong: you shouldn't do network stuff on the UI thread.

Good fix: Don't do network stuff on the UI thread, use AsyncTask or others.

Quick fix: add this before your network stuff:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

See http://www.techblogistech.com/2011/11/how-to-fix-the-android-networkonmainthreadexception/

Upvotes: 2

Related Questions