2012-04-23 14 views
16

Mantengo el JDOM project 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 ...validación XMLSchema en Android

Mis preguntas son: ¿hay alguna manera de hacer la validación de XMLSchema en Android? Si hay, ¿cómo?

preguntas de este tipo se han preguntado antes, pero no se da ninguna respuesta concluyente:

Esto es lo que actualmente 'saber' (corríjanme si estoy incorrecto) ...:

  • SchemaFactory.newInstance ("http://www.w3.org/2001/XMLSchema ") - falla con IllegalArgumentException
  • el valor predeterminado 'ExpatParser' en Android del proyecto Harmony no es compatible con la validación de XMLSchema.
  • Es posible cargar Xerces en una aplicación de Android, e incluso analizarlo, pero no hacer un análisis Validando - cuando intente obtener excepciones 'FATAL' de Android que causen bloqueos de aplicaciones.

He estado trabajando en esto desde hace algún tiempo, y he elaborado la siguiente 'investigación':

Si alguien tiene alguna más información sobre validación de XMLSchema en Android agradecería mucho cualquier entrada.

Si alguien ha realizado con éxito la validación de XMLSchema en XML y puede ayudarme a obtener la funcionalidad que funciona para JDOM obtendrán miles de puntos de Internet ... ;-) y se inmortalizarán en el código JDOM y enviarán mensajes.

+0

Pruebe esto http://stackoverflow.com/questions/9998134/validate-xml-against-schema-on-android-using-xerces – LeoMobDev

Respuesta

-1

Creo que podría usar RelaxNG; hay muchos validadores disponibles. http://relaxng.org/#validators

De particular interés debe ser - http://www.kohsuke.org/relaxng/bali/doc/ - https://msv.java.net/ - http://www.davidashen.net/rnv.html

Este último consiste en la realización C, los dos primeros están escritos en Java.

Si necesita un alto rendimiento, puede escribir un código JNI y llamar a las funciones en la fuente rnv. Un enfoque más simple sería simplemente construir rnv para Android, usando NDK y luego llamarlo ejecutable con parámetros.

Algo así 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 
+0

Gracias por echar un vistazo. Solicité explícitamente la validación de XMLSchema. Sugerir RelaxNG no me va a ayudar a validar contra XMLSchemas. – rolfl

+0

Mal día? No, no es un mal día. Gracias por preguntar. Creo que te estás perdiendo las implicaciones de la primera oración en mi pregunta. JDOM es una biblioteca solo para Java, y no puede introducir dependencias que no sean de Java. Sugerir soluciones JNI o ​​externas a Java no es útil. – rolfl

+0

¿Qué hay de xmllint? http://xmlsoft.org/xmllint.html – fabian

0

estoy usando

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

Si tienes una cadena XML puede analizar 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); 

favor no se olvide el manejo de excepciones .

+1

¡El op está pidiendo explícitamente la validación frente a un esquema, no solo el mero análisis! – juwi

2

Me fascina que, después de varios años, este sigue siendo un problema abierto. Sin embargo, parece que solo hay malas noticias. De acuerdo con la validación de esquema AOSP Issue Tracker actualmente parece no soportados con la API estándar de Android y Google parece no estar dispuestos a solucionarlo:

Nuestro API XML (SAX incluyendo, XmlPull y DOM) no son compatibles con cualquiera de los siguientes :

XML Schema 

XML DTDs (including external entity declarations and references) 
validation 

element content whitespace 

Sin embargo, un comentarista de ese mismo billete referencia a un workaround, y proporciona código de ejemplo que utiliza un puerto Xerces. No sé si esto va más allá de lo que has descubierto, hasta ahora, pero espero que ayude.

Para terminar con esto: El SchemaFactoryFinder sólo sabe las siguientes definiciones de esquema:

El uso de cualquier otra causa de definición del esquema fallará (Sin embargo, se registrará en el nivel de depuración). Obviamente, este es el caso para usted, ya que está utilizando otra referencia al esquema de 2011. Entonces, hacer una referencia "correcta" a la definición del esquema debería solucionar este problema.

+1

Interesante actualización, estoy tratando de digerir lo que tienes allí ... parece ser solo un enlace a una biblioteca de cifrado que internamente reconstruye un analizador completo de Xerces como una dependencia. Esta es una situación difícil, ya que requiere extraer un subconjunto de un proyecto existente, y me exigiría mantener el analizador completo también. Esta es una pista interesante, pero no una solución, al menos hasta donde sé. – rolfl

+0

Sí, pensé. También se verificó dos veces con nuestra base de código. Realizamos algunos análisis XML aquí y allá, pero no se realiza ninguna validación en ningún lado. Realmente no puedo entenderlo, hasta el momento. Vamos a comprobar la implementación real en libcore y ver qué hay – juwi

+0

En realidad ... creo que encontré el problema: https://android.googlesource.com/platform/libcore/+/master/luni/src /main/java/javax/xml/validation/SchemaFactoryFinder.java Línea 237ff. – juwi

Cuestiones relacionadas