2011-07-29 57 views
5

Estoy intentando crear dinámicamente un archivo XML en Java para mostrar un cronograma. He creado una DTD para mi archivo XML y tengo un archivo XSL que me gustaría usar para transformar el XML. No sé exactamente cómo continuar.Creación de XML dinámico en Java

Lo que he intentado hasta ahora es hacer clic en un botón al que se llama un Servlet que genera la cadena del contenido del archivo XML (insertando las partes dinámicas del XML en la Cadena. Ahora tengo una Cadena que contiene contenido del archivo XML. Ahora me gustaría transformar el archivo XML utilizando un archivo XSL que tengo en mi servidor y mostrar el resultado en la página que ha llamado al Servlet (haciendo esto a través de AJAX)

Estoy No estoy seguro de si estoy en la dirección, quizás ni siquiera debería crear el código XML en forma de cadena desde el principio. Así que mi pregunta es, ¿cómo puedo continuar desde aquí? ¿Cómo puedo transformar la cadena XML, utilizando el XSL? archivo, y enviarlo como una respuesta a la llamada AJAX para que pueda plantar el código generado en la página? O si esta no es la forma de hacerlo ¿Cómo creo un archivo XML dinámico de una manera diferente produciendo el mismo resultado?

+0

¿Desea un método para crear el XML o un método para hacer el XSLT? – atrain

+0

No estoy muy seguro ... Estoy un poco perdido, ¿tal vez ambos? – Nayish

+0

¿Los datos están almacenados como XML? – atrain

Respuesta

5

Puede usar JAXP para esto. Es parte de la API Java SE estándar.

StringReader xmlInput = new StringReader(xmlStringWhichYouHaveCreated); 
InputStream xslInput = getServletContext().getResourceAsStream("file.xsl"); // Or wherever it is. As long as you've it as an InputStream, it's fine. 

Source xmlSource = new StreamSource(xmlInput); 
Source xslSource = new StreamSource(xslInput); 
Result xmlResult = new StreamResult(response.getOutputStream()); // XML result will be written to HTTP response. 

Transformer transformer = TransformerFactory.newInstance().newTransformer(xslSource); 
transformer.transform(xmlSource, xmlResult); 
+0

¡Genial! esto funcionó perfectamente, gracias – Nayish

+0

De nada. – BalusC

1

Dependiendo de lo complicado y grande que sea su XML, sugeriría dos opciones. Para estructuras pequeñas y simples, la implementación DOM de Java (Document) será suficiente.

Si su XML es más elaborado, buscaría en JAXB. El beneficio es que hay herramientas que crean automáticamente clases de Java a partir de un esquema XML (XSD). Entonces, primero tendría que transformar su DTD en un XSD, pero eso no debería ser un problema. Usted termina con objetos simples de transferencia de datos (objetos simples con getters/setters para los valores de los elementos XML correspondientes) y se realiza el análisis/codificación más el ajuste de los espacios de nombres correctamente. Es bastante conveniente, pero también puede ser un poco exagerado para estructuras XML simples.

En ambos casos, terminará con una instancia Document que finalmente puede transformar utilizando JAXP.

+0

¿Qué quiere decir con API? Bibliotecas adicionales? Entonces tengo buenas noticias, todas estas tecnologías tienen implementaciones incorporadas que vienen con su JDK estándar. – emboss

0

Los Apache XMLBeans son una buena solución para serializar hacia y desde XML. Esto es lo que tiene que hacer:

  • Descarga XMLBeans de http://www.apache.org/dyn/closer.cgi/xmlbeans/binaries
  • Uso los XMLBeans inst2xsd ejecutable (en el dir0 depósito para convertir su DTD a un XSD
  • Utilice la tarea XMLBeans ANT para convertir el XSD en clases que se pueden utilizar en su aplicación

Aquí hay un script ANT ejemplo para utilizar XMLBeans para crear las clases:

<project name="my_project" basedir=".."> 
<property name="my_project.project.path" value="${basedir}"/> 
<property name="xbean.dir" value="C:/lib/xmlbeans-2.2.0/lib" /> 
<path id="classpath"> 
    <fileset dir="${xbean.dir}" includes="**/*.jar" /> 
</path> 
<taskdef name="xmlbean" classname="org.apache.xmlbeans.impl.tool.XMLBean" classpathref="classpath" /> 
<xmlbean schema="${testing_project.project.path}/my.xsd" srcgendir="${my_project.project.path}/src-tms-template-filter-fields" classgendir="${my_project.project.path}/bin"> 
    <classpath><path refid="classpath" /></classpath> 
</xmlbean> 

Ahora tendrá buenas clases de Java que puede usar para limpiar el código para crear el XML a partir de los datos almacenados en su base de datos. Usa la respuesta de BalusC para XSLT.