2012-08-15 8 views
6

Durante la ejecución de un http POST, almaceno la respuesta como una cadena de respuesta.Parse xml from httppost response

HttpResponse httpresponse = httpclient.execute(httppost); 
HttpEntity resEntity = httpresponse.getEntity(); 
response = EntityUtils.toString(resEntity); 

Si imprimo respuesta que parece:

<?xml version="1.0" encoding="UTF-8"?> 
<response status="ok"> 
<sessionID>lo8mdn7bientr71b5kn1kote90</sessionID> 
</response> 

me gustaría almacenar sólo la Id.sesión como una cadena. He intentado

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
InputSource is = new InputSource(new StringReader(xml)); 

y diversos métodos como éste, pero no me deja ejecutar el código desde DocumentBuildFactory y InputSource no son válidos.

¿Qué debo hacer para extraer cadenas específicas de este XML?

+0

para mí la [KSOAP2] (http://ksoap2.sourceforge.net/) es una de las mejores maneras de manejar este tipo de respuestas – mihail

Respuesta

8

Esto es sólo rápido y sucio prueba. Funcionó para mí

import java.io.IOException; 
import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.Document; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 

public class Test { 
    public static void main(String[] args) { 
     String xml= "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response status=\"ok\"><sessionID>lo8mdn7bientr71b5kn1kote90</sessionID></response>"; 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder; 
     InputSource is; 
     try { 
      builder = factory.newDocumentBuilder(); 
      is = new InputSource(new StringReader(xml)); 
      Document doc = builder.parse(is); 
      NodeList list = doc.getElementsByTagName("sessionID"); 
      System.out.println(list.item(0).getTextContent()); 
     } catch (ParserConfigurationException e) { 
     } catch (SAXException e) { 
     } catch (IOException e) { 
     } 
    } 
} 

salida: lo8mdn7bientr71b5kn1kote90

+0

Gracias por la respuesta, esto funciona, el único problema es que cuando uso mi respuesta real, no. Creo que lo hace porque la cadena contiene comillas que no se escapan correctamente. – Ted

+0

No estoy seguro de qué es exactamente lo que obtienes en la respuesta, una conjetura es que puede incluir una lista de materiales (lista de materiales XML de Google para obtener más información) al principio de la cadena UTF. Si tiene un depurador (como el que está en Eclipse), debería ser bastante directo descubrir cuál es la diferencia entre él y una cadena de trabajo codificada. –

+0

Si la codificación de texto de la respuesta es UTF-8, tal vez también vale la pena intentar cambiar response = EntityUtils.toString (resEntity); a response = EntityUtils.toString (resEntity, "UTF-8"); –

1

1. Utilice DOM Parser.

Ej:

DocumentBuilderFactory odbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder odb = odbf.newDocumentBuilder(); 
      InputSource is = new InputSource(new StringReader(xml)); 
      Document odoc = odb.parse(is); 
      odoc.getDocumentElement().normalize(); // normalize text representation 
      System.out.println ("Root element of the doc is " + odoc.getDocumentElement().getNodeName()); 
      NodeList LOP = odoc.getElementsByTagName("locations"); 
      int totalPersons =LOP.getLength(); 
      System.out.println("Total nos of locations:"+totalPersons); 

      for(int s=0; s<LOP.getLength() ; s++) 
      { 
       Node FPN =LOP.item(s); 
       if(FPN.getNodeType() == Node.ELEMENT_NODE) 
        { 

        Element latlon = (Element)FPN;                 

        NodeList oNameList1 = latlon.getElementsByTagName("featured");          
        Element firstNameElement = (Element)oNameList1.item(0); 
        NodeList textNList1 = firstNameElement.getChildNodes(); 
        //this.setLocationId(((Node)textNList1.item(0)).getNodeValue().trim());  
        featuredArr = changeToBoolean(((Node)textNList1.item(0)).getNodeValue().trim());         // value taken 
        System.out.println("#####The Parsed data#####"); 
        System.out.println("featured : " + ((Node)textNList1.item(0)).getNodeValue().trim());   
        System.out.println("#####The Parsed data#####"); 
    } 

ver este enlace para más detalles:

http://tutorials.jenkov.com/java-xml/dom.html