libreria - Validación de XMLSchema en Android
leer xml java jdom (3)
Mantengo el proyecto JDOM y estoy tratando de ''certificarlo'' en Android. La mayoría de las cosas funcionan bien, pero la validación del esquema XML está resultando problemática ...
Mis preguntas son: ¿Hay alguna forma de validar XMLSchema en Android? Si la hay, ¿cómo?
Preguntas como esta se han hecho antes, pero no se da una respuesta concluyente:
Esto es lo que actualmente ''sé'' (corríjame si estoy equivocado) ...:
- SchemaFactory.newInstance (" http://www.w3.org/2001/XMLSchema ") - falla con IllegalArgumentException
- el ''ExpatParser'' predeterminado en Android del proyecto Harmony no admite la validación de XMLSchema.
- Es posible cargar Xerces en una aplicación de Android e incluso analizarla, pero no hacer un análisis de Validación : cuando lo intentas, obtienes excepciones ''FATAL'' de Android que causan bloqueos en la aplicación.
He estado trabajando en esto desde hace algún tiempo y he reunido la siguiente "investigación":
Si alguien tiene más información sobre la validación de XMLSchema en Android, agradecería enormemente cualquier entrada.
Si alguien ha realizado con éxito la validación de XMLSchema en XML y puede ayudarme a obtener la funcionalidad de JDOM, obtendrá miles de puntos de Internet ... ;-) y se inmortalizará en el código JDOM y enviará los mensajes.
Creo que podrías usar RelaxNG - hay muchos validadores disponibles. http://relaxng.org/#validators
De particular interés debería ser - http://www.kohsuke.org/relaxng/bali/doc/ - https://msv.java.net/ - http://www.davidashen.net/rnv.html
La última es la implementación de C, las dos primeras están escritas en Java.
Si necesita un alto rendimiento, puede escribir algunos códigos JNI y funciones de llamada en la fuente rnv. Un enfoque más simple sería simplemente compilar rnv para Android, usar NDK y luego llamar a su ejecutable con parámetros.
Algo como
Process p = Runtime.exec("/path/to/rnv/exec", [valdidationDoc: String, some more params]);
OutputStream out = p.getOutputStream(); // connected to STDIN of p
InputStream in = p.getInputStream(); // connected to STDOUT of p
out.write(new FileInputStream("/path/to/xml"));
/// read in for succes/errors
Me fascina que, después de varios años, este sea un tema abierto. Sin embargo, solo parece haber malas noticias. De acuerdo con el AOSP Issue Tracker, la validación del esquema actualmente parece no ser compatible con las API estándar de Android y Google parece no estar dispuesto a solucionarlo:
Nuestras API XML (incluidas SAX, XmlPull y DOM) no admiten ninguno de los siguientes:
XML Schema XML DTDs (including external entity declarations and references) validation element content whitespace
Sin embargo, un comentarista de ese mismo ticket hace referencia a una workaround y proporciona un código de ejemplo mediante un puerto Xerces. No sé si esto va más allá de lo que has descubierto hasta ahora, pero espero que ayude.
Para terminar esto: SchemaFactoryFinder solo conoce las siguientes definiciones de esquema:
- W3C_XML_SCHEMA10_NS_URI = " http://www.w3.org/XML/XMLSchema/v1.0 "
- W3C_XML_SCHEMA10_NS_URI = " http://www.w3.org/XML/XMLSchema/v1.1 "
El uso de cualquier otra definición de esquema hace que falle (Sin embargo, registrará esto en el nivel de depuración). Obviamente, este es el caso para usted, ya que está utilizando otra referencia al esquema de 2011. Así que "correctamente" haciendo referencia a la definición de esquema debería solucionar este problema.
estoy usando
javax.xml.parsers.DocumentBuilder;
javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.ParserConfigurationException;
Si tienes una cadena XML puedes analizarla por:
Document doc = null;
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xml));
doc = db.parse(is);
Por favor, no olvide el manejo de excepciones.