2009-11-04 22 views
5

Estoy tratando de encontrar una forma reutilizable de tomar un archivo CSV y generar un archivo XML que cumpla con un XSD especificado. Realmente no he encontrado un enfoque reutilizable para esto. He usado Altova MapForce, que me permite importar un archivo CSV y XSD, hacer el mapeo que generar código a partir de esto, pero el código debe ser regenerado cada vez que el XSD cambie. Altova también produce una gran cantidad de código.conversión de csv a xml con xsd

Mi solución ideal sería un conjunto de clases de Java a las que pueda dar un archivo CSV, un XSD y obtener un archivo XML de él. Aunque no puedo encontrar nada como esto y estoy pensando en crear algo potencialmente.

Ideas? ¿Hay algo aquí usando XSLT basado en la pregunta this?

Gracias.

+1

¿Ha pensado en utilizar un xkcd? –

+0

También debe especificar qué versión de XSLT tiene restricciones de uso (v1 o v2?): Hace una gran diferencia con la mejor respuesta. Además, ¿está restringido a un proveedor (¿cuál?), O ¿necesita una solución independiente de proveedor/plataforma? –

Respuesta

7

Esto parece algo fácil de hacer, pero no lo es. XML Schema es un lenguaje de validación de documentos, no un lenguaje de producción de documentos. No te dice cómo hacer un nuevo documento; le dice si el documento que hizo es válido o no. Esas no son lo mismo por una posibilidad remota.

Por ejemplo, es trivial crear un tipo complejo en el esquema XML que consiste en una secuencia de opciones opcionales. Un elemento de foo puede tener ya sea un niño bar o baz, entonces o bien un niño baz o bat, a continuación, un niño foo, bar, o bat.Eso hace que para una regla que puede determinar que estos dos elementos son válidos:

<foo> 
    <baz/> 
    <baz/> 
    <bar/> 
</foo> 

<foo> 
    <foo> 
     <bar/> 
    </foo> 
</foo> 

Al mismo tiempo, esa regla le da casi cero ayuda en la determinación de cómo tomar una tupla de elementos de datos y crear un foo elemento de ella.

Generalmente, cuando alguien hace esta pregunta, están viendo uno o dos esquemas que están usando, que definen una estructura de documento relativamente simple. Parece intuitivo que debería ser fácil usar esos esquemas como entrada para un proceso de mapeo. Probablemente lo sea Lo que no es fácil, o incluso posible, es un proceso de asignación que puede tomar como un esquema como entrada.

Lo que he hecho en cambio, en mis proyectos, es simplificar el problema. Creé programas que utilizan CSV y XML y que admiten la validación de esquema, pero en estos programas, el esquema es , salida. He definido un formato de metadatos XML simple, por ejemplo:

<item name="foo" type="string" size="10" allowNulls="true" .../> 
<item name="bar" type="date" allowNulls="false" .../> 

entonces puedo usar que los metadatos XML para controlar la producción desde la entrada CSV, y puedo también utilizarlo para producir un esquema XML que el programa de mi produce se ajustará a. Si cambio mis metadatos, mi XML y mi esquema cambian apropiadamente.

Por supuesto, si los esquemas son realmente una entrada a su proceso (por ejemplo, son proporcionados por un tercero), esto ni siquiera comenzará a ayudarlo.

+0

Me gusta su solución, pero no va a funcionar demasiado bien para mis necesidades actuales. El esquema, aunque no es proporcionado por un tercero, está sujeto a cambios (aunque no muy a menudo), pero los usuarios siempre utilizarán una plantilla de Excel que les proporcionamos. ¡Puedo ver algunas áreas donde creo que esto sería muy útil! ¡Gracias! – Casey

+0

No estoy de acuerdo en que no sea algo fácil de hacer. Es una cosa fácil de hacer. Es un problema común y se ha resuelto (para usuarios de XSLT v2). –

+0

Claro, puede ir a través de un esquema y, omitiendo los elementos opcionales y seleccionando siempre la primera opción cada vez que hay una opción, puede producir un documento que cumpla con el esquema. Pero un esquema solo puede decirle qué documento XML generar a partir de un archivo CSV si hay otros metadatos (por ejemplo, encabezados en los archivos CSV y reglas para asignar encabezados a nombres de elementos y convenciones sobre elementos opcionales) además de lo que contiene un esquema XML. Sin eso, no solo no es fácil, no es posible. –

2

Bueno, yo realmente no tienen una, fuera de la caja de solución lista para esto, pero tal vez:

  • leer el archivo CSV con una biblioteca como FileHelphers; para ello, es necesario crear una clase MyDataType que describe las columnas de la CSV, y se obtiene una serie de MyDataType

  • si decorar la clase con la serialización XML adecuado atributos como [XmlIgnore], [XmlAttribute] y así sucesivamente, se podría simplemente serializar la matriz resultante de MyDataType en un XML que cumpla con su esquema XML

  • o si eso no funciona, podría crear otra clase que se corresponda con sus requisitos XML (generarlo desde el XSD que tiene), y simplemente defina un mapeo entre los dos tipos MyDataType (desde su CSV) y MyXmlDataType (para su XML) con algo como AutoMapper

No es la caldera de la placa - pero bastante cerca, y que posiblemente podría hacer que más o menos un "marco" para simplemente enchufar sus propios tipos (si necesito hacer esto frecuentemente).

0

Lo que tiene es una sola "tabla" (el archivo CSV) que contiene (probablemente) filas desnormalizadas que representan un modelo de datos (probablemente) jerárquico. Desea asignarlo a un documento XML jerárquico arbitrario basado en el XSD.

Necesitará una herramienta que pueda asignar columnas de clave de agrupación a elementos XML y especificar qué columnas de datos van en qué atributos/elementos secundarios. Este es un problema bastante significativo, a menos que sus asignaciones sean triviales.

¿Podría publicar algunas muestras de CSV y XSD? Eso podría ayudar a obtener una respuesta más enfocada.