La aplicación no funciona, desafortunadamente, XML ha detenido el error
Frecuentes
Visto 596 veces
0
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));
}
}
1 Respuestas
0
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
hiscentral.cuahsi.org/webservices/… si este es el enlace - Tanzeel Ahmed
¿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 android eclipse error-handling or haz tu propia pregunta.
Por favor agregue el
Logcat
salida para su error: seguimiento de pila de excepción, etc. - Andrey Ermakov