Android Retrofit 2 Simple XML Converter
Estoy utilizando Retrofit 2.1.0 y Retrofit SimpleXML Converter 2.1.0 . He añadido simplexmlconverter para actualizar la instancia con el método addConverterFactory.
XML está por debajo
- Selector desplegable con la misma imagen pero diferente opacidad
- ¿Puedo obtener una vista previa de la barra de acciones en el editor de diseño gráfico?
- WYSIWYG View Editor en 'Android'?
- Cómo cambiar el color de la barra de progreso en Android? - (Traté de una manera, y no funciona)
- Tamaño de imagen de mapa de bits de Android en xml
<?xml version="1.0" encoding="UTF-8"?> <rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" version="2.0"> <channel> <title>title</title> <description></description> <language>en-us</language> <item> <title>text</title> <link>text</link> <description>text</description> <enclosure url="text" length="2043520" type="image/jpeg" /> <guid isPermaLink="false">text</guid> <pubDate>Fri, 17 Jun 2016 11:43 EDT</pubDate> <source url="text">text</source> </item> <item> <title>text</title> <link>text</link> <description>text</description> <enclosure url="text" length="1735257" type="image/jpeg" /> <guid isPermaLink="false">text</guid> <pubDate>Thu, 16 Jun 2016 10:17 EDT</pubDate> <source url="text"></source> </item> <item> <title>text</title> <link>text</link> <description>text</description> <enclosure url="text" length="3763157" type="image/jpeg" /> <guid isPermaLink="false">text</guid> <pubDate>Wed, 15 Jun 2016 10:02 EDT</pubDate> <source url="text">text</source> </item> </channel> </rss>
Mi código retroactivo del cliente api relevante: RetrofitAPIClient
OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(loggingInterceptor) .build(); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .client(client) .addConverterFactory(SimpleXmlConverterFactory.create()) .build(); apiService = retrofit.create(MyService.class);
ArticleResponse.java
import org.simpleframework.xml.Element; import org.simpleframework.xml.ElementList; import org.simpleframework.xml.Root; import java.util.List; @Root(name = "rss") public class ArticleResponse { @Element(name = "channel") public Channel channel; public class Channel { @ElementList public List<Article> articles; } }
Artículo.java
import org.simpleframework.xml.Attribute; import org.simpleframework.xml.Element; import org.simpleframework.xml.Text; @Element(name = "item") public class Article { @Element(name = "title") private String title; @Element(name = "link") private String link; @Element(name = "description") private String description; @Element(name = "enclosure") private Enclosure enclosure; @Element(name = "guid") private String guid; @Element(name = "pubDate") private String pubDate; @Element(name = "source") private Source source; public class Enclosure { @Attribute(name = "url") private String url; @Attribute(name = "length") private long length; @Attribute(name = "type") private String type; } public class Source { @Attribute(name = "url") private String url; @Text private String text; } }
El error es:
06-18 20:31:22.894 W/System.err: java.lang.RuntimeException: org.simpleframework.xml.core.AttributeException: Attribute 'version' does not have a match in class [my-package].webservice.response.ArticleResponse at line 1 06-18 20:31:22.894 W/System.err: at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:44) 06-18 20:31:22.894 W/System.err: at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:23) 06-18 20:31:22.894 W/System.err: at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:116) 06-18 20:31:22.894 W/System.err: at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211) 06-18 20:31:22.894 W/System.err: at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:106) 06-18 20:31:22.894 W/System.err: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133) 06-18 20:31:22.894 W/System.err: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 06-18 20:31:22.894 W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 06-18 20:31:22.894 W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 06-18 20:31:22.894 W/System.err: at java.lang.Thread.run(Thread.java:818) 06-18 20:31:22.894 W/System.err: Caused by: org.simpleframework.xml.core.AttributeException: Attribute 'version' does not have a match in class [my-package].webservice.response.ArticleResponse at line 1 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.readAttribute(Composite.java:494) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.readAttributes(Composite.java:413) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.access$300(Composite.java:59) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite$Builder.read(Composite.java:1382) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.read(Composite.java:201) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Composite.read(Composite.java:148) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Traverser.read(Traverser.java:92) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Persister.read(Persister.java:625) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Persister.read(Persister.java:606) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Persister.read(Persister.java:584) 06-18 20:31:22.895 W/System.err: at org.simpleframework.xml.core.Persister.read(Persister.java:543) 06-18 20:31:22.895 W/System.err: at retrofit2.converter.simplexml.SimpleXmlResponseBodyConverter.convert(SimpleXmlResponseBodyConverter.java:36) 06-18 20:31:22.895 W/System.err: ... 9 more
- Eclipse android phonegap config.xml no funciona?
- Android: verifica la firma de XML
- ¿Cómo agregar el borde coloreado en cardview?
- Android paquete / nombre de la clase en la disposición XML?
- Barra de herramientas empujando la barra de estado
- Android - Centro de vista de texto en LinearLayout
- Cómo especificar el atributo fromXType en el archivo anim xml
- Emoji símbolo 👍 en string.xml bloquea la aplicación
Prueba con strict = false
:
@Root(name = "rss", strict = false) public class ArticleResponse { @Element(name = "channel") public Channel channel; public class Channel { @ElementList public List<Article> articles; } }
Frente a un mismo problema. La solución es hacer la clase interna estática (o simplemente hacer una nueva clase única de java). También agregue la anotación "Root" para el nodo "channel".
@Root(name = "rss", strict = false) public class ArticleResponse { @Element(name = "channel") private Channel channel; @Root(name = "channel", strict = false) static class Channel { @ElementList(inline = true, name="item") private List<Article> articles; } }
Lo mismo ocurre con los nodos "recinto" y "fuente": crear nuevos archivos o crear clases internas estáticas.
public class Enclosure { @Attribute(name = "url") private String url; @Attribute(name = "length") private long length; @Attribute(name = "type") private String type; }
La razón por la que está viendo esto es porque le falta la anotación para el atributo "predeterminado" en su documento XML.
El comportamiento predeterminado de SimpleXML es establecer (strict = true), lo que significa que debe anotar TODOS los elementos y atributos en su documento, o lanzará la excepción de tiempo de ejecución que está viendo.
Por lo tanto, para el ejemplo de XML a continuación:
<response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XML-Schema-instance" version="1.2"> <sample_string>Brady</sample_string> <sample_integer>12</sample_integer> </response>
Debería utilizar el indicador (strict = false) para ignorar el atributo "version":
@Root(strict = false) public class Response { @Element(name = "sample_string") private String sampleString; @Element(name = "sample_integer") private Integer sampleInteger; public String getSampleString() { return sampleString; } public Integer getSampleInteger() { return sampleInteger; } }
O, anote el atributo "versión" en su clase:
@Root public class Response { @Attribute(name = "version") private String version; @Element(name = "sample_string") private String sampleString; @Element(name = "sample_integer") private Integer sampleInteger; public String getVersion() { return version; } public String getSampleString() { return sampleString; } public Integer getSampleInteger() { return sampleInteger; } }
- No se pudo resolver com.android.tools.build:gradle:2.2.3
- Obteniendo una imagen mediana de la secuencia de imágenes con OpenCV