2011-03-28 11 views
23

Necesito analizar los objetos java que se pasan por xml. Quiero utilizar para estos fines JAXB framework, porque he pre-anotado (usando JAXB) java-class.Uso de JAXB con Google Android

¿Es esto posible en principio?

InputStream input = entity.getContent(); 
JAXBContext jc = JAXBContext.newInstance(new Class[] {Response.LoginResponse.class}); 
Unmarshaller un = jc.createUnmarshaller(); 
LoginResponse response = (LoginResponse)un.unmarshal(input); 

en la línea 4, tengo una advertencia: "no puede resolver método estático 282 JAXBContext ..." VM y luego se bloquea

Cualquier ideas sobre cómo resolver este problema?

+0

he vuelto a empaquetar JAXB. Ver [este blog] (http://www.docx4java.org/blog/2012/05/jaxb-can-be-made-to-run-on-android/) para más detalles. – JasonPlutext

Respuesta

22

No resuelvo exactamente su problema, pero JAXB no está incluido en Android de forma predeterminada y la biblioteca le costará 9 (!) MB de su apk. Pruebe SimpleXML en su lugar. Tiene habilidades similares y mucho más ligero.

+6

Quiero señalar, que ya tengo clases java pre-anotadas (usando JAXB). Si voy a usar SimpleXML, necesito volver a anotar las clases. Esto es inaceptable en mi proyecto. –

+0

Pero SimpleXML no admite completamente el esquema XML. –

+0

¿qué quieres decir? –

22

Tuve el mismo problema de querer utilizar un grupo de clases JAXB en el proceso de analizar las respuestas del servidor web XML (y, para mí, JSON).

Escribí una página wiki para Parsing XML and JSON on Android, que describe una solución para este problema y lo guía paso a paso.

Para ser claros, aconsejaría utilizar JSON en lugar de XML en Android siempre que sea posible. Hay significant performance advantages for JSON.

Para resumir mi solución para el uso de clases JAXB tanto para JSON y análisis XML:

terminé separando todas las anotaciones y javax.xml.* importaciones de las clases JAXB (un poco más fácil que las clases de re-de anotación para SimpleXML - plus, también puede analizar respuestas JSON) para crear POJOs verdaderos, y luego usar Jackson con versiones modificadas de las bibliotecas XML de las que depende Jackson.

La modificación de las bibliotecas XML es necesaria porque Android no incluye las clases XML necesarias en la plataforma, y ​​será complain si intenta incluir clases en el espacio de nombres javax.xml protegido como bibliotecas en su proyecto.

Quité las anotaciones XML e importé manualmente al principio, pero luego terminé en automating the process via ant scripts.

Afortunadamente, puede automatizar el proceso de modificación de la biblioteca XML. Escribí una publicación detallada en Modifying XML libraries for Android (que contiene todas las referencias del tutorial) que describe cómo mover las clases relevantes a un nuevo espacio de nombres sin protección usando el Jar Jar Links utility.

Si desea utilizar Jackson en Android, también hemos creado una versión modificada de los jackson-dataformat-android, aalto-xml, stax-api y stax2-api proyectos para Android que se puede sentir libre de utilizar.

He aquí una muestra de lo que cabría incluir en su pom.xml para incluir las dependencias a través de Maven:

<dependencies>    
    <!-- Using Jackson for parsing --> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>2.1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>2.1.2</version> 
    </dependency> 

    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>2.1.2</version> 
    </dependency> 
    <!-- XML parsing --> 
    <!-- So many problems with XML and Android... 
     Below XML libraries have been modified using JarJar 
     and are NOT the same as their J2SE counterparts, 
     hence the added "-android" to the artifactId 
     See: 
     https://github.com/CUTR-at-USF/SiriRestClient/wiki/Modifying-XML-libraries-for-Android 
     -->   
    <dependency> 
     <groupId>edu.usf.cutr.android.xml</groupId> 
     <artifactId>jackson-dataformat-xml-android</artifactId> 
     <version>2.1.2</version> 
    </dependency> 
    <dependency> 
     <groupId>edu.usf.cutr.android.xml</groupId> 
     <artifactId>stax2-api-android</artifactId> 
     <version>3.1.1</version> 
    </dependency> 
    <dependency> 
     <groupId>edu.usf.cutr.android.xml</groupId> 
     <artifactId>stax-api-android</artifactId> 
     <version>1.0-2</version> 
    </dependency> 
    <dependency> 
     <groupId>edu.usf.cutr.android.xml</groupId> 
     <artifactId>aalto-xml-android</artifactId> 
     <version>0.9.8</version> 
    </dependency>   
</dependencies>  

<repositories> 
    <!-- CUTR Android XML libraries Releases --> 
    <repository> 
     <id>cutr-releases</id> 
     <url>https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/releases</url> 
    </repository>  
</repositories> 

Ver this page para más detalles usando estas bibliotecas.

Puede descargar los archivos JAR de sus respectivos directorios here, si desea incluirlos directamente en su proyecto.

También puede consultar el código abierto "SIRI REST Client" app que utiliza estas bibliotecas para un ejemplo de trabajo.

EDITAR

Si está utilizando Gradle, su build.gradle se vería así:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.9.+' 
    } 
} 
apply plugin: 'android' 

repositories { 
    mavenCentral() 
    maven { 
     // CUTR SNAPSHOTs 
     url "https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/snapshots" 
    } 
    maven { 
     // CUTR Releases 
     url "https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/releases" 
    } 
} 

android { 
    compileSdkVersion 19 
    buildToolsVersion "19.0.1" 
    ... 
} 

dependencies { 
    ... 
    // Normal Jackson libraries 
    compile 'com.fasterxml.jackson.core:jackson-core:2.1.2' 
    compile 'com.fasterxml.jackson.core:jackson-annotations:2.1.2' 
    compile 'com.fasterxml.jackson.core:jackson-databind:2.1.2' 
    // Repackaged XML-specific libraries 
    compile 'edu.usf.cutr.android.xml:jackson-dataformat-xml-android:2.1.2' 
    compile 'edu.usf.cutr.android.xml:stax2-api-android:3.1.1' 
    compile 'edu.usf.cutr.android.xml:stax-api-android:1.0-2' 
    compile 'edu.usf.cutr.android.xml:aalto-xml-android:0.9.8' 
    ...  
} 
+1

Si está aquí para buscar una versión compatible con Android de jackson para el análisis XML, probablemente quiera leer [esta página] (https://github.com/CUTR-at-USF/SiriRestClient/wiki/Modifying-XML- libraries-for-Android). Sean fue tan amable de proporcionar la biblioteca modificada [jackson-dataformat-xml-android] (https://github.com/CUTR-at-USF/cutr-mvn-repo/raw/master/releases/edu/usf/cutr /android/xml/jackson-dataformat-xml-android/2.1.2/jackson-dataformat-xml-android-2.1.2.jar). Úselo junto con 'jackson-core',' jackson-anntotation' y 'jackson-databind', y sea feliz :) – sulai

+1

Gracias por el recordatorio @sulai! Creo que escribí esta publicación antes de que se publicara esa biblioteca, así que actualizaré mi respuesta anterior para incluirla. ¡Me alegro de que haya sido útil! –

+1

¿Alguien tiene el gradle de Android Studio igual para este pom.xml? –