La aplicación no funciona, desafortunadamente, XML ha detenido el error

He escrito este código para analizar este xml:

http://hiscentral.cuahsi.org/webservices/hiscentral.asmx/GetSeriesCatalogForBox2

Pero cuando lo ejecuto... dice "APP dejó de funcionar" y no puedo entender el motivo... ¡Por favor, ayuda!

El código es:

xmlActivity.java

package com.example.xml;

public class XmlActivity extends ListActivity {
    static final String URL = "http://hiscentral.cuahsi.org/webservices/hiscentral.asmx/GetSeriesCatalogForBox2";
    // XML node keys
    static final String KEY_SeriesRecord = "SeriesRecord"; // parent node
    static final String KEY_latitude = "latitude";
    static final String KEY_longitude = "longitude";
    static final String KEY_location = "location";

    /** Called when the activity is first created. */
    @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_SeriesRecord);

        // 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_SeriesRecord, parser.getValue(e, KEY_SeriesRecord));
            map.put(KEY_latitude, parser.getValue(e, KEY_latitude));
            map.put(KEY_longitude, parser.getValue(e, KEY_longitude));
            map.put(KEY_location, parser.getValue(e, KEY_location));

            // adding HashList to ArrayList
            menuItems.add(map);
        }
        ListAdapter adapter = new SimpleAdapter(this, menuItems,
                R.layout.list_item, new String[] { KEY_latitude, KEY_longitude,
                        KEY_location }, new int[] { R.id.name, R.id.desciption,
                        R.id.cost });

        setListAdapter(adapter);

        // selecting single ListView item
        ListView lv = getListView();

        lv.setOnItemClickListener(new OnItemClickListener() {

            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_latitude, name);
                in.putExtra(KEY_longitude, cost);
                in.putExtra(KEY_location, description);
                startActivity(in);

            }
        });
    }
}

SingleMenuItemActivity.java

package com.example.xml;

public class SingleMenuItemActivity extends Activity {

    // XML node keys
    static final String KEY_latitude = "latitude";
    static final String KEY_longitude = "longitude";
    static final String KEY_location = "location ";

    @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 latitude = in.getStringExtra(KEY_latitude);
        String longitude = in.getStringExtra(KEY_longitude);
        String location = in.getStringExtra(KEY_location);

        // 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(latitude);
        lblCost.setText(longitude);
        lblDesc.setText(location);
    }
}

xmlParser.java

package com.example.xml;

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

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

preguntado el 12 de junio de 12 a las 20:06

Por favor agregue el Logcat salida para su error: seguimiento de pila de excepción, etc. -

1 Respuestas

No puede realizar una operación lenta como HttpRequest en el subproceso de actividad. Debe ponerlos en un hilo separado (AsyncTask). Google lo menciona, pero perdí la fuente, lo siento.

Deberías intentar crear una AsyncTask así es como deberías intentarlo:

public class GetSoigneurInfoTask extends AsyncTask<Document, Integer, Document>                 //Le même code s'applique pour presque tout sauf onPostExecute()
{
    Document doc;
    String xml;
    String url;

    public GetSoigneurInfoTask(String URL)
    {
        url = URL;
    }

    protected Document doInBackground(Document...params)
    {
        xml = XmlFunctions.getXML(url);                                                         
        doc = XmlFunctions.XMLfromString(xml);
        return doc;
    }

    protected void onPostExecute(Document result)
    {
            if(result != null)
        {
            NodeList nodeList = doc.getElementsByTagName("RootTag");                                //Crée une liste avec les elements sous soigneur
            for (int i = 0; i < nodeList.getLength(); i++) 
            {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) 
                {
                    Element element = (Element) node;
                    NodeList nodelist = element.getElementsByTagName("childTag");
                    Element element1 = (Element) nodelist.item(0);
                    NodeList fstNm = element1.getChildNodes();
                    soignTemp = fstNm.item(0).getNodeValue();

                }
            }
        }
    }   

Así que llamas a tus métodos en doInBackground() y haces todo lo que tienes que hacer con la interfaz de usuario en onPostExecute()!

¡Espero que esto ayude!

Respondido el 12 de junio de 12 a las 21:06

No puedo entender lo que quiere decir "No puede hacer una operación lenta como HttpRequest en el hilo de actividad". Estaba haciendo esta operación en otra URL y funcionaba bien y todavía funciona, pero no en esta URL. Tanzeel Ahmed

aquí encontré el aquí - Ben Lefebvre

Cuando trato de abrir su URL en un navegador, dice: Falta el parámetro: xmin. - Ben Lefebvre

¿Realmente puedes obtener información de eso? El archivo XML debería verse como este. Quiero decir que muestran muchos ejemplos, pero creo que estos no son analizables. ¡Corrígeme si estoy equivocado! - Ben Lefebvre

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.