Foros del Web » Programación para mayores de 30 ;) » Java »

Problema al validar XML con XSD en JAVA. Dejo código.

Estas en el tema de Problema al validar XML con XSD en JAVA. Dejo código. en el foro de Java en Foros del Web. Buenas tardes, Tengo un problema intentando validar un XML con un XSD, he probado de varias maneras, con JDOM, con SAX y nada, casi siempre ...
  #1 (permalink)  
Antiguo 28/11/2011, 10:05
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 15 años, 5 meses
Puntos: 0
Problema al validar XML con XSD en JAVA. Dejo código.

Buenas tardes,

Tengo un problema intentando validar un XML con un XSD, he probado de varias maneras, con JDOM, con SAX y nada, casi siempre se pega un chasque en el paso del builder, os dejo el código pegado aquí:

private String JAXP_SCHEMA_LANGUAGE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage";
private String W3C_XML_SCHEMA ="http://www.w3.org/2001/XMLSchema";
private String JAXP_SCHEMA_SOURCE ="http://java.sun.com/xml/jaxp/properties/schemaSource";

private Logger log = null;

public static String validarXSD(String xsd, String datosXML, Logger logIN){

try {

//En esta variable se almacena, con el método que se considere adecuado, el nombre del fichero de validación XSD

String xsd1 = "entradaNPFSWMOD";
XSDBuilder builder =new XSDBuilder();

//String ruta = ("proyecto/xsd/"+xsd1+".xsd");
String ruta = (xsd1+".xsd");

InputSource inso = new InputSource();

// Creación del objeto XML Schema

XMLSchema schemadoc1= (XMLSchema) builder.build("proyecto/xsd/"+xsd+".xsd");
XMLSchema schemadoc2= (XMLSchema) builder.build(inso.toString());
DOMParser dp= new DOMParser();

// Configuracion del objeto validador

InputStream in = new ByteArrayInputStream(datosXML.getBytes("ISO-8859-1"));

dp.setXMLSchema(schemadoc1);
dp.setValidationMode(XMLParser.SCHEMA_VALIDATION);
dp.setPreserveWhitespace(true);
dp.setErrorStream(System.out);

//logIN.info("Parseando "+xsd);
System.out.println("Parseando "+xsd);
dp.parse(in);
System.out.println("El fichero introducido ('"+xsd+"') se ha parseado sin errores");

return null;

} catch (XSDException e) {
System.out.println("XSDException: " + e.getMessage());
return e.getMessage();
} catch (MalformedURLException e){
System.out.println("MalformedURLException: " + e.getMessage());
return e.getMessage();
} catch (XMLParseException e) {
System.out.println("Parser Exception: " + e.getMessage());
return e.getMessage();
}catch (Exception e) {
System.out.println("NonParserException: " + e.getMessage());
return e.getMessage();
}

}//Fin validarXSD

Casi siempre me da este error al llegar a la linea que he marcado:

: XML-0220: (Fatal Error) Invalid InputSource.

¿Alguien me puede echar un cable?

MUCHAS GRACIAS!!
  #2 (permalink)  
Antiguo 28/11/2011, 13:39
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

Revisa los parámetros de ubicación del archivo, puedes probar primero a ver si existe ese fichero, si no existe te dirá donde lo está buscando.

La palabra proyecto no me tiene pinta de indique bien la ubicación del archivo.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #3 (permalink)  
Antiguo 29/11/2011, 02:52
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

Cita:
Iniciado por Xerelo Ver Mensaje
Revisa los parámetros de ubicación del archivo, puedes probar primero a ver si existe ese fichero, si no existe te dirá donde lo está buscando.

La palabra proyecto no me tiene pinta de indique bien la ubicación del archivo.
Buenas,

Muchas gracias por contestar. El fichero existe y lo he guardado en una carpeta del mismo proyecto desde el que estoy llamando a la función de validación, por eso al estar llamando desde una clase que esta alojada al mismo nivel que la carpeta donde esta guardado el xml y el xsd lo llamo con la ruta "proyecto/etc....." siendo proyecto en este caso el entorno. No sé si me he explicado bien, espero que sí.

Una vez más gracias por la ayuda.
  #4 (permalink)  
Antiguo 29/11/2011, 03:03
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

La ruta empieza a construirse desde el path, y no creo que tu path sea el directorio que contiene a proyecto.

Repito, prueba mediante código (File) que con esa ruta estás llegando al fichero. Si llega, entonces el problema puede estar en el código del xsd.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #5 (permalink)  
Antiguo 29/11/2011, 04:09
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

Cita:
Iniciado por Xerelo Ver Mensaje
La ruta empieza a construirse desde el path, y no creo que tu path sea el directorio que contiene a proyecto.

Repito, prueba mediante código (File) que con esa ruta estás llegando al fichero. Si llega, entonces el problema puede estar en el código del xsd.

Por lo que he podido comprobar, no encuentra el fichero o no lo crea bien, no sabría decir porque no pega ninguna torta, coge bien la ruta que le especifico pero luego f1.exists es igual a false...

File f1 = new File("http://localhost:9080/contexto/xsd/schema.xsd");
boolean existe = f1.exists();

También he probado con esta otra ruta

f1 = new File("contexto/xsd/schema.xsd");

y lo mismo, ¿alguna idea?.

Gracias otra vez.
  #6 (permalink)  
Antiguo 29/11/2011, 18:58
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

No es lo mismo acceder a un archivo desde una aplicación de escritorio que en un servidor. Cuanta más información des, mejor.

En un servidor creas la ruta absoluta del fichero a partir del contexto usando getServletContext().getRealPath() o en tu caso podrías usar también alguno de los getServletContext().getResource
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #7 (permalink)  
Antiguo 30/11/2011, 06:20
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

Cita:
Iniciado por Xerelo Ver Mensaje
No es lo mismo acceder a un archivo desde una aplicación de escritorio que en un servidor. Cuanta más información des, mejor.

En un servidor creas la ruta absoluta del fichero a partir del contexto usando getServletContext().getRealPath() o en tu caso podrías usar también alguno de los getServletContext().getResource
Estoy trabajando con Websphere y creo que llevas razón y el problema es que no consigo referenciar el xsd correctamente, ya que lo he intentado dejando el xsd en una carpeta en el escritorio y referenciandola con la ruta absoluta y si funcionaba, el problema es que sigo sin saber como referenciar el fichero xsd que tengo en el mismo proyecto.

Lo que me comentas del getServletContext tiene buena pinta pero no consigo que funcione...

Gracias por la ayuda!!
  #8 (permalink)  
Antiguo 02/12/2011, 03:29
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

Buenas,

Sigo con el problema de referenciar el fichero XSD que tengo en una carpeta del proyecto. Necesito ayuda, estoy trabajando con un servicio web en websphere. ¿alguien me puede ayudar?.

Un saludo y gracias.
  #9 (permalink)  
Antiguo 02/12/2011, 09:11
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

¿Has probado getServletContext().getRealPath()? Eso te tiene que devolver la ruta absoluta a tu proyecto, mira lo que devuelve y modifícalo para dar la ruta absoluta al xsd.

Y te vuelvo a repetir, tienes que dar datos de lo que estás haciendo, diciendo solo no me funciona, es imposible ayudarte.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #10 (permalink)  
Antiguo 09/12/2011, 02:27
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

Cita:
Iniciado por Xerelo Ver Mensaje
¿Has probado getServletContext().getRealPath()? Eso te tiene que devolver la ruta absoluta a tu proyecto, mira lo que devuelve y modifícalo para dar la ruta absoluta al xsd.

Y te vuelvo a repetir, tienes que dar datos de lo que estás haciendo, diciendo solo no me funciona, es imposible ayudarte.
Buenas,

A ver, tengo un método que recibe un xml formateado en un string y que debo validar con un xsd. Estoy trabajando con Rational y servidor Websphere. No sé qué más te puedo decir que sea relevante.

Lo de getServletContext no me funciona, no lo reconoce, básicamente porque no estoy usando ningún request.

Un saludo y muchas gracias por la ayuda.
  #11 (permalink)  
Antiguo 09/12/2011, 08:04
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

Básicamente con este código he conseguido que funcione, siempre y cuando le indique la ruta absoluta del fichero xsd.


String rutaXSD = "C:/Documents and Settings/user/Escritorio/DOC/Nueva carpeta/validateXML.xsd";

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
File schemaLocation = new File(rutaXSD);

Schema schema = factory.newSchema(schemaLocation);


// 3. Get a validator from the schema.
Validator validator = schema.newValidator();

// 4. Parse the document you want to check.
InputStream in = new ByteArrayInputStream(param.getBytes("ISO-8859-1"));
Source sourceP = new StreamSource(in);

// 4. Parse the document you want to check.
//String input = "C:/Documents and Settings/user/Escritorio/Nueva carpeta (2)/validateXML.xml";
//Source source = new StreamSource(input);


// 5. Check the document
try {
validator.validate(sourceP);
System.out.println("El xml recibido por parámetros es valido.");
} catch (SAXException ex) {
System.out.println("El xml recibido por parámetros no es valido porque ");
System.out.println(ex.getMessage());
} catch (Exception e) {
System.out.println("Ha ocurrido una excepción no controlada: ");
System.out.println(e.getMessage());
}


Como digo, este código funciona y valida correctamente si le indico la ruta absoluta, pero el problema es que así no me sirve ya que tanto los xsd como los xml tienen que estar alojados en la carpeta del proyecto, probablemente en una carpeta al mismo nivel que la de jsp, dentro de WEB-INF.

Así que necesito poder referenciar de alguna manera la ruta relativa de los ficheros xsd y xml.

Estoy trabajando en java con el rational y con el servidor Websphere Application Server v.7 o WAS 7. Necesito ayuda, please!!.

PD: El getServletContext no lo reconoce y no puedo usarlo, no sabe lo que es y me dice que lo implemente yo.
  #12 (permalink)  
Antiguo 09/12/2011, 11:39
Avatar de Xerelo  
Fecha de Ingreso: mayo-2009
Mensajes: 2.175
Antigüedad: 15 años, 6 meses
Puntos: 306
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

Lo que está dentro del WEB-INF hay que referenciarlo obteniendo la ruta del proyecto en el servidor.

Dices que estás usando Websphere y Rational, yo no los he usado, pero si estás usando un servidor, el ServletContext tiene que existir. Si no es en la clase donde haces el parseo, en la clase que lo llama.

Yo no te puedo decir más, no he usado Websphere, pero si no consigues obtenerlo desde código, pon la ubicación en un properties, tendrán que cambiar esa property en cada servidor donde se despliegue, pero no es algo extraño.
__________________
Cada vez que solucionas los problemas de alguien que no se esfuerza, piensa en que el día de mañana puede llegar a ser tu compañero de trabajo, o peor, tu jefe.
  #13 (permalink)  
Antiguo 12/12/2011, 10:25
 
Fecha de Ingreso: junio-2009
Mensajes: 9
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Problema al validar XML con XSD en JAVA. Dejo código.

Cita:
Iniciado por Xerelo Ver Mensaje
Lo que está dentro del WEB-INF hay que referenciarlo obteniendo la ruta del proyecto en el servidor.

Dices que estás usando Websphere y Rational, yo no los he usado, pero si estás usando un servidor, el ServletContext tiene que existir. Si no es en la clase donde haces el parseo, en la clase que lo llama.

Yo no te puedo decir más, no he usado Websphere, pero si no consigues obtenerlo desde código, pon la ubicación en un properties, tendrán que cambiar esa property en cada servidor donde se despliegue, pero no es algo extraño.

Vale, el problema es que no tengo servlet porque estoy trabajando con un Web Service. Así que la solución del ServletContext.getRealPath(nombrefichero) no me vale porque no tengo un servlet del que coger esa información...hay alguna manera de hacerlo sin el ServletContext??

Un saludo y gracias.

Etiquetas: string, xml, xsd
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:30.