2009-11-04 4 views
5

Ich versuche, eine wiederverwendbare Art der Aufnahme einer CSV-Datei zu finden und eine XML-Datei daraus zu generieren, die einer bestimmten XSD entspricht. Ich habe dafür keinen wiederverwendbaren Ansatz gefunden. Ich habe Altova MapForce verwendet, mit dem ich eine CSV-Datei und XSD importieren kann, die Mapping als Code daraus generieren, aber der Code muss neu generiert werden, wenn der XSD ändert. Altova produziert auch viel Code.Umwandlung von CSV in xml mit einem xsd

Meine ideale Lösung wäre eine Reihe von Java-Klassen, denen ich eine CSV-Datei geben kann, eine XSD und eine XML-Datei daraus. Ich kann jedoch nichts dergleichen finden und denke darüber nach, etwas zu erschaffen.

Ideen? Gibt es hier etwas mit XSLT basierend auf this Frage?

Danke.

+1

Haben Sie sich Gedanken über eine xkcd mit? –

+0

Sie sollten auch angeben, auf welche Version von XSLT Sie beschränkt sind (v1 oder v2?) - es macht einen großen Unterschied zur besten Antwort. Sind Sie auf einen Anbieter beschränkt (welcher?), Oder benötigen Sie eine hersteller-/plattformunabhängige Lösung? –

Antwort

7

Dies scheint wie etwas, das leicht zu tun wäre, aber es ist nicht. XML-Schema ist eine Dokumentüberprüfungssprache, keine Dokumentproduktionssprache. Sie erfahren nicht, wie Sie ein neues Dokument erstellen. Sie erfahren, ob das von Ihnen erstellte Dokument gültig ist. Das sind bei weitem nicht die gleichen Dinge.

Zum Beispiel ist es einfach, einen komplexen Typ im XML-Schema zu erstellen, der aus einer Reihe von optionalen Optionen besteht. Ein foo Element kann entweder ein bar oder baz Kind, dann entweder ein baz oder bat Kind, dann ein foo, bar oder bat Kind.Das für eine Regel macht, die bestimmen kann, dass diese beiden Elemente sind gültig:

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

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

Zugleich, diese Regel gibt man so ziemlich Null Hilfe bei der Bestimmung, wie ein Tupel von Datenelementen zu nehmen und erstellen Sie ein foo Element von ihm.

Im Allgemeinen, wenn jemand diese Frage stellt, betrachten sie ein oder zwei Schemas, die sie verwenden, die eine relativ einfache Dokumentenstruktur definieren. Es scheint intuitiv, dass es einfach sein sollte, diese Schemata als Eingabe für einen Mapping-Prozess zu verwenden. Es ist wahrscheinlich. Was nicht einfach oder sogar möglich ist, ist ein Mapping-Prozess, der irgendein Schema als eine Eingabe annehmen kann.

Was ich in meinen Projekten stattdessen getan habe, ist das Problem zu vereinfachen. Ich habe Programme erstellt, die CSV und XML verwenden und Schema-Validierung unterstützen, aber in diesen Programmen ist das Schema eine Ausgabe. Ich habe ein einfachen XML-Metadatenformat definiert, zB:

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

Dann kann ich diese Metadaten verwenden, um XML-Produktion aus CSV-Eingang zu steuern, und ich kann es auch ein Schema, das die XML mein Programm zu produzieren verwenden produziert wird entsprechen. Wenn ich meine Metadaten ändere, ändert sich mein XML und Schema entsprechend.

Natürlich, wenn die Schemas wirklich eine Eingabe für Ihren Prozess sind (z. B. werden sie von einer dritten Partei zur Verfügung gestellt), wird dies nicht einmal anfangen, Ihnen zu helfen.

+0

Ich mag Ihre Lösung, aber es wird nicht gut für meine aktuellen Bedürfnisse funktionieren. Obwohl das Schema nicht von Dritten bereitgestellt wird, kann es geändert werden (wenn auch nicht sehr oft), aber die Benutzer werden immer eine Excel-Vorlage verwenden, die wir ihnen zur Verfügung stellen. Ich kann ein paar Bereiche sehen, in denen ich denke, dass dies sehr nützlich wäre! Vielen Dank! – Casey

+0

Ich stimme nicht zu, dass es keine leichte Sache ist. Es ist eine einfache Sache zu tun. Es ist ein häufiges Problem und wurde gelöst (für Benutzer von XSLT v2). –

+0

Sicher, Sie können ein Schema durchlaufen, und indem Sie optionale Elemente überspringen und immer die erste Option auswählen, wenn Sie eine Auswahl haben, können Sie ein Dokument erstellen, das dem Schema entspricht. Ein Schema kann Ihnen jedoch nur mitteilen, welches XML-Dokument aus einer CSV-Datei generiert wird, wenn andere Metadaten (z. B. Überschriften in den CSV-Dateien und Regeln zum Zuordnen von Überschriften zu Elementnamen und Konventionen zu optionalen Elementen) neben dem XML-Schema vorhanden sind. Ohne das ist es nicht nur nicht einfach, es ist nicht möglich. –

2

Nun, ich habe nicht wirklich eine fertige, out-of-the-Box-Lösung für diese, aber vielleicht:

  • lesen Sie Ihre CSV mit einer Bibliothek wie FileHelphers Datei; Dazu benötigen Sie eine Klasse MyDataType zu schaffen, die die Spalten in der CSV beschreibt, und Sie eine Reihe von MyDataType

  • , wenn man diese Klasse mit der richtigen XML-Serialisierung dekorieren Attribute wie [XmlIgnore], [XmlAttribute] und so weiter, Sie ist vielleicht in der Lage, einfach das resultierende Array von MyDataType in eine XML, die Ihrem XML - Schema entspricht, zu serialisieren. Wenn das nicht funktioniert, können Sie eine andere Klasse erstellen, die Ihren XML - Anforderungen entspricht (generieren Sie sie aus die XSD, die Sie haben), und definieren Sie einfach eine Zuordnung zwischen den beiden Typen MyDataType (aus Ihrer CSV) und MyXmlDataType (für XML) mit so etwas wie AutoMapper

Es ist nicht Kesselblech - aber ziemlich nah, und man kann möglicherweise so ziemlich einen „Rahmen“ machen, um einfach nur in Ihrer eigenen Art Stecker (wenn Sie muss dies häufig tun).

0

Was Sie haben, ist eine einzelne "Tabelle" (die CSV-Datei), die (wahrscheinlich) denormalisierte Zeilen enthält, die ein (wahrscheinlich) hierarchisches Datenmodell darstellen. Sie möchten das einem beliebigen hierarchischen XML-Dokument zuordnen, das auf dem XSD basiert.

Sie benötigen ein Werkzeug, das Gruppierungsschlüsselspalten zu XML-Elementen zuordnen und angeben kann, welche Datenspalten in welche Attribute/untergeordneten Elemente gehören. Dies ist ein ziemlich signifikantes Problem, sofern Ihre Zuordnungen nicht trivial sind.

Können Sie einige Beispiele der CSV und XSD? Das könnte helfen, eine fokussiertere Antwort zu bekommen.