studio programacion móviles libros libro desarrollo desarrollar curso aprende aplicaciones java android xsd

java - móviles - manual de programacion android pdf



Validación de esquema de Android (4)

Esto puede no ayudar mucho, pero la última vez que lo comprobé, la plataforma Android tenía un entorno Java algo limitado. Y el problema principal es que algunas API uno esperaría estar disponible; específicamente, javax.xml.validation (parte de JDK 1.5 y anove!) - no están ahí.

Como tal, es posible que deba incluir más tarros de lo que se haría en una plataforma java no castrada. Además, puede haber limitaciones en cuanto a qué API estándar se pueden agregar, debido a problemas de listas negras / blancas (este es un gran problema con Google App Engine, y dado que Android es anterior a él, tiene desafíos similares).

Aparte de eso, trataría de usar javax.xml.validation con Xerces XML parser incluido. Hay tropecientos millones de documentos instructivos sobre cómo hacer eso.

He creado un XML y estoy teniendo un archivo XSD y tengo que validar el xml con este esquema, ¿puedo obtener algún ejemplo para hacerlo? Y donde tengo que colocar el archivo xsd en mi proyecto para que pueda validar con ese esquema.


Compruebe http://developer.android.com/reference/javax/xml/validation/package-summary.html . De acuerdo con la documentación, javax.xml.validation es compatible desde API nivel 8.

(Voy a probar eso e informar lo antes posible)

- Actualización - Ok, el problema no es tan simple: SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); error en API de nivel 8 y nivel 9 con una excepción IllegalArgumentException como se describe en http://developer.android.com/reference/javax/xml/validation/SchemaFactory.html#newInstance(java.lang.String

Google no ayuda en ese asunto, excepto para encontrar el mismo informe de falla. La API está aquí pero no la implementación (por defecto).


Es un problema conocido publicado por Google aquí

La solución es usar Apache Xerces portado a Android. Hay un proyecto aquí

Tienes que hacer un svn chekout y exportar el proyecto a un archivo jar para utilizarlo como una biblioteca en tu proyecto de Android.

El código de instancia SchemaFactory cambia un poco. Te muestro un ejemplo:

import mf.javax.xml.validation.Schema; import mf.javax.xml.validation.SchemaFactory; import mf.javax.xml.validation.Validator; import mf.org.apache.xerces.jaxp.validation.XMLSchemaFactory; SchemaFactory factory = new XMLSchemaFactory(); Schema esquema = factory.newSchema(".../file.xsd");


Después de leer muchas publicaciones y probar un montón de cosas diferentes, finalmente conseguí que las cosas funcionaran correctamente para mí con Xerces-para-Android, y traté de documentar el proceso muy bien para todos los demás ... espero que ayude :)

Lo siguiente funcionó para mí:

  1. Crea una utilidad de validación
  2. Obtenga tanto el xml como el xsd en el archivo en el sistema operativo Android y use la utilidad de validación en su contra.
  3. Use Xerces-For-Android para hacer la validación.

Android admite algunos paquetes que podemos usar, creé mi utilidad de validación xml en función de: http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/package-summary.html

Mi prueba inicial de sandbox fue bastante suave con Java, luego traté de dárselo a Dalvik y descubrí que mi código no funcionaba. Algunas cosas simplemente no son compatibles con Dalvik, así que hice algunas modificaciones.

Encontré una referencia a xerces para Android, así que modifiqué mi prueba de sandbox ( lo siguiente no funciona con android, el ejemplo después de esto ):

import java.io.File; import javax.xml.XMLConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.Source; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.w3c.dom.Document; /** * A Utility to help with xml communication validation. */ public class XmlUtil { /** * Validation method. * Base code/example from: http://docs.oracle.com/javase/1.5.0/docs/api/javax/xml/validation/package-summary.html * * @param xmlFilePath The xml file we are trying to validate. * @param xmlSchemaFilePath The schema file we are using for the validation. This method assumes the schema file is valid. * @return True if valid, false if not valid or bad parse. */ public static boolean validate(String xmlFilePath, String xmlSchemaFilePath) { // parse an XML document into a DOM tree DocumentBuilder parser = null; Document document; // Try the validation, we assume that if there are any issues with the validation // process that the input is invalid. try { // validate the DOM tree parser = DocumentBuilderFactory.newInstance().newDocumentBuilder(); document = parser.parse(new File(xmlFilePath)); // create a SchemaFactory capable of understanding WXS schemas SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // load a WXS schema, represented by a Schema instance Source schemaFile = new StreamSource(new File(xmlSchemaFilePath)); Schema schema = factory.newSchema(schemaFile); // create a Validator instance, which can be used to validate an instance document Validator validator = schema.newValidator(); validator.validate(new DOMSource(document)); } catch (Exception e) { // Catches: SAXException, ParserConfigurationException, and IOException. return false; } return true; } }

El código anterior tenía que modificarse para que funcione con xerces para Android ( http://gc.codehum.com/p/xerces-for-android/ ). Necesita SVN para obtener el proyecto, las siguientes son algunas notas de cuna:

download xerces-for-android download silk svn (for windows users) from http://www.sliksvn.com/en/download install silk svn (I did complete install) Once the install is complete, you should have svn in your system path. Test by typing "svn" from the command line. I went to my desktop then downloaded the xerces project by: svn checkout http://xerces-for-android.googlecode.com/svn/trunk/ xerces-for-android-read-only You should then have a new folder on your desktop called xerces-for-android-read-only

Con el contenedor anterior (eventualmente lo convertiré en un contenedor, simplemente lo copié directamente en mi fuente para realizar pruebas rápidas. Si desea hacer lo mismo, puede hacer el contenedor rápidamente con Ant ( http: //ant.apache) .org / manual / using.html )), pude obtener lo siguiente para trabajar para mi validación xml:

import java.io.File; import java.io.IOException; import mf.javax.xml.transform.Source; import mf.javax.xml.transform.stream.StreamSource; import mf.javax.xml.validation.Schema; import mf.javax.xml.validation.SchemaFactory; import mf.javax.xml.validation.Validator; import mf.org.apache.xerces.jaxp.validation.XMLSchemaFactory; import org.xml.sax.SAXException; /** * A Utility to help with xml communication validation. */public class XmlUtil { /** * Validation method. * * @param xmlFilePath The xml file we are trying to validate. * @param xmlSchemaFilePath The schema file we are using for the validation. This method assumes the schema file is valid. * @return True if valid, false if not valid or bad parse or exception/error during parse. */ public static boolean validate(String xmlFilePath, String xmlSchemaFilePath) { // Try the validation, we assume that if there are any issues with the validation // process that the input is invalid. try { SchemaFactory factory = new XMLSchemaFactory(); Source schemaFile = new StreamSource(new File(xmlSchemaFilePath)); Source xmlSource = new StreamSource(new File(xmlFilePath)); Schema schema = factory.newSchema(schemaFile); Validator validator = schema.newValidator(); validator.validate(xmlSource); } catch (SAXException e) { return false; } catch (IOException e) { return false; } catch (Exception e) { // Catches everything beyond: SAXException, and IOException. e.printStackTrace(); return false; } catch (Error e) { // Needed this for debugging when I was having issues with my 1st set of code. e.printStackTrace(); return false; } return true; } }

Algunas notas secundarias:

Para crear los archivos, hice una sencilla utilidad de archivos para escribir cadenas en los archivos:

public static void createFileFromString(String fileText, String fileName) { try { File file = new File(fileName); BufferedWriter output = new BufferedWriter(new FileWriter(file)); output.write(fileText); output.close(); } catch ( IOException e ) { e.printStackTrace(); } }

También necesitaba escribir en un área a la que tenía acceso, así que hice uso de:

String path = this.getActivity().getPackageManager().getPackageInfo(getPackageName(), 0).applicationInfo.dataDir;

Un poco hackish, funciona. Estoy seguro de que hay una manera más sucinta de hacerlo, sin embargo, pensé que compartiría mi éxito, ya que no había ningún buen ejemplo que encontrara.