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

Leer XML en Java

Estas en el tema de Leer XML en Java en el foro de Java en Foros del Web. Hola. Como puedo leer mediante Java un fichero XML si esté fichero XML tiene esquemas, es decir, tiene archivos XSD para validar los documentos XML ...
  #1 (permalink)  
Antiguo 10/01/2008, 06:17
 
Fecha de Ingreso: diciembre-2007
Mensajes: 10
Antigüedad: 16 años, 4 meses
Puntos: 0
Pregunta Leer XML en Java

Hola.

Como puedo leer mediante Java un fichero XML si esté fichero XML tiene esquemas, es decir, tiene archivos XSD para validar los documentos XML y especificar las restricciones en la estructura de dicho fichero XML??

Si el fichero XML no contiene los ficheros que especifican las restricciones, si lo se leer, pero si el XML contiene esos ficheros, pues no se...


Muchas gracias.
Un saludo.
  #2 (permalink)  
Antiguo 11/01/2008, 03:01
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Leer XML en Java

¿Que quieres decir con "no se leerlo"? ¿Que te da errores por que al no tener los XSD no lo puede validar? Por que el proceso para leerlo es exactamente el mismo.

Si ese es el caso, normalmente los parsers XML tienen una serie de propiedades que se les pueden configurar y alguna de ellas suele ser "no valides contra DTDs/XSDs" para poder leer ficheros en esos casos.

Si en cambio tienes que validarlos pero no te encuenta los XSD donde los pones, entonces lo habitual es usar un EntityResolver para que cuando busque el XSD, en vez de usar la URL que pones en el documento te lo busque donde tu lo digas.

S!
  #3 (permalink)  
Antiguo 16/01/2008, 01:45
 
Fecha de Ingreso: diciembre-2007
Mensajes: 10
Antigüedad: 16 años, 4 meses
Puntos: 0
Pregunta Re: Leer XML en Java

Hola.

Muchas gracias por responder.

Si es eso lo que me pasa, tengo que validar los documentos XML contra archivos XSD, para después leer el contenido del XML e interpretarlo en Java, es decir, que lo tengo que leer en Java. Un XML sencillo, que no tiene que ser validado contra un archivo o archivos XSD si lo se leer, es decir, interpreto o leo todo el documento en Java. Sin embargo, cuando tengo un XML que lo tengo que validar contra un archivo XSD no se interpretarlo o leerlo, ese es mi problema.

Entonces necesito ayuda para poder hacer eso, validar un archivo XML contra un XSD en Java, para luego leerlo o interpretarlo.

Que quieres decir con que tengo que usar un EntityResolver ??

Un saludo y muchas gracias.
  #4 (permalink)  
Antiguo 17/01/2008, 11:41
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Re: Leer XML en Java

Hola,

Se me habia traspapelado este mensaje, jejeje.

Aqui tienes un ejemplo de como definir un EntityResolver:
http://www.thescripts.com/forum/thread86290.html

Basicamente la idea es que al buscar un DTD/XSD, llama a tu clase con unos parametros y le tienes que devolver la direccion del XSD o donde lo has puesto.

S!
  #5 (permalink)  
Antiguo 18/01/2008, 01:55
 
Fecha de Ingreso: diciembre-2007
Mensajes: 10
Antigüedad: 16 años, 4 meses
Puntos: 0
Re: Leer XML en Java

Hola,

Sigo sin tener muy claro como lo tengo que hacer :(.
El código que me has puesto tengo unas dudas:

public class validate
{
static public class ResolverImpl implements EntityResolver
{
public InputSource resolveEntity(String publicId, String
systemId)
throws SAXException, IOException
{
System.out.println("resolving " + systemId + " : " +
publicId);
System.out.flush();
return new InputSource(new FileInputStream(
"c:\\somedirectory\\" + systemId));
}
}


static class ErrorHandlerImpl implements ErrorHandler
{
List errors = new LinkedList();

public void fatalError(SAXParseException e)
{
errors.add(e);
}

public void warning(SAXParseException e)
{
}

public void error(SAXParseException e)
{
errors.add(e);
}

boolean hasErrors()
{
if (errors.size() > 0)
return true;
else
return false;
}

void printErrors()
{
Iterator it = errors.iterator();
while (it.hasNext())
System.out.println(it.next());
}
}

static void validateContents(byte[] contents)
{
try
{
ErrorHandlerImpl handler = new ErrorHandlerImpl();

ByteArrayInputStream stream = new
ByteArrayInputStream(contents);
DocumentBuilderFactory docBuilderFactory
= DocumentBuilderFactory.newInstance();
docBuilderFactory.setValidating(true);
docBuilderFactory.setNamespaceAware(true);

DocumentBuilder docBuilder =
docBuilderFactory.newDocumentBuilder();
docBuilder.setErrorHandler(handler);
docBuilder.setEntityResolver(new ResolverImpl());
Document document = docBuilder.parse(stream);
Element rootElement = document.getDocumentElement();

System.out.println("errors = " + handler.hasErrors());
handler.printErrors();
}
catch (ParserConfigurationException e)
{
System.out.println("parse error:" + e);
}
catch (SAXException e)
{
System.out.println("parse error:" + e);
}
catch (IOException e)
{
System.out.println("parse error:" + e);
}
}

public static void main (String[] args)
{
try
{
validateContents(Util.readFile(args[0]));
}
catch (Exception e)
{
System.out.println("exception:" + e);
}
}
}

En la clase public InputSource resolveEntity(String publicId, String systemId), publicId y systemId que valores tienen que tener, o que tienen que tener??

En la clase static void validateContents(byte[] contents), contents que valor o parametro tiene que tener??

Dentro de la clase static void validateContents(byte[] contents), cuando se declara Element rootElement = document.getDocumentElement();, rootElement para que se utiliza??

En general me gustaría que me explicaras como funciona la clase en sí, que no me aclaro mucho.

Muchas gracias por responder.

Un saludo.
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 10:41.