2011-02-11 18 views
10

Estoy tratando de analizar el XML HttpResponse que obtengo de un HttpPost a un servidor (last.fm), para una aplicación de Android last.fm. Si simplemente lo analizo en cadena, puedo verlo como una cadena xml normal, con toda la información deseada. Pero simplemente no puedo analizar los NameValuePairs individuales. Este es mi objeto HttpResponse:Analizando un XML HttpResponse

HttpResponse response = client.execute(post); 
HttpEntity r_entity = response.getEntity(); 

Probé dos cosas diferentes y ninguna funcionó. Primero traté de recuperar los NameValuePairs:

List<NameValuePair> answer = URLEncodedUtils.parse(r_entity); 
String name = "empty"; 
String playcount = "empty"; 
for (int i = 0; i < answer.size(); i++){ 
    if (answer.get(i).getName().equals("name")){ 
     name = answer.get(i).getValue(); 
    } else if (answer.get(i).getName().equals("playcount")){ 
     playcount = answer.get(i).getValue(); 
    } 
} 

Después de este código, el nombre y la cuenta de juego permanecen "vacíos". Así que he intentado utilizar un analizador XML:

DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
Document answer = db.parse(new DataInputStream(r_entity.getContent())); 
NodeList nl = answer.getElementsByTagName("playcount"); 
String playcount = "empty"; 
for (int i = 0; i < nl.getLength(); i++) { 
    Node n = nl.item(i); 
    Node fc = n.getFirstChild(); 
    playcount Url = fc.getNodeValue(); 
} 

Esto parece fallar mucho antes, ya que ni siquiera llegar a establecer la variable de contador de reproducciones. Pero como dije, si realizo esto:

EntityUtils.toString(r_entity); 

Voy a obtener una cadena xml perfecta. Por lo tanto, no debería ser problema analizarlo, ya que HttpResponse contiene la información correcta. ¿Qué estoy haciendo mal?

Respuesta

17

lo resolví. El analizador DOM XML necesitaba un poco más de ajuste:

 HttpResponse response = client.execute(post); 
     HttpEntity r_entity = response.getEntity(); 
     String xmlString = EntityUtils.toString(r_entity); 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = factory.newDocumentBuilder(); 
     InputSource inStream = new InputSource(); 
     inStream.setCharacterStream(new StringReader(xmlString)); 
     Document doc = db.parse(inStream); 

     String playcount = "empty"; 
     NodeList nl = doc.getElementsByTagName("playcount"); 
     for(int i = 0; i < nl.getLength(); i++) { 
      if (nl.item(i).getNodeType() == org.w3c.dom.Node.ELEMENT_NODE) { 
       org.w3c.dom.Element nameElement = (org.w3c.dom.Element) nl.item(i); 
       playcount = nameElement.getFirstChild().getNodeValue().trim(); 
      } 
     } 
1

Este es un muy buen tutorial al analizar XML desde un feed. Se puede utilizar para construir aplicaciones más robustas que necesitan analizar fuentes XML espero que ayude

0

si (answer.get (i) .getName() == "nombre") {

No se puede usar == para comparar una cadena

Cuando usamos el operador ==, en realidad estamos comparando dos referencias de objetos, para ver si apuntan al mismo objeto. No podemos comparar, por ejemplo, dos cadenas de igualdad, usando el operador ==. En su lugar, debemos usar el método .equals, que es un método heredado por todas las clases de java.lang.Object.

Esta es la forma correcta de comparar dos cadenas.

String abc = "abc"; String def = "def"; 

// Bad way 
if ((abc + def) == "abcdef") 
{ 
    ...... 
} 
// Good way 
if ((abc + def).equals("abcdef")) 
{ 
    ..... 
} 

Tomado de Top Ten Errors Java Programmers Make

+0

sí. tienes razón. Lo cambié pero pero ambas variables siguen siendo "vacías" – gaussd