CSV nach XML Konverter
| Autoren: | Steffen Schluff Orientation in Objects GmbH Kristian Köhler Orientation in Objects GmbH | ![]() Steffen Schluff ![]() Kristian Köhler |
| Datum: | Oktober 2002 |
Tool für die Konvertierung CSV nach XML

Abstract
Eine Konvertierung oder Weiterverarbeitung von Daten, die im XML Format vorliegen, ist relativ einfach. Über die eXtensible Stylesheet Language (XSL) lassen sich XML Dokumente regelbasiert in so gut wie jedes andere Format transformieren. So kann man z. B. aus einer bestehenden XML Datenquelle recht schnell ansprechende HTML oder PDF Dateien erstellen, bzw. sie in andere Systeme importieren. Eine leichte Umwandlung anderer Formaten wie z. B. des weitverbreiteten CSV Formates ist im Gegensatz dazu meist nicht so einfach möglich.
Mit dem vorliegenden CSV2XML Konverter wurde eine Möglichkeit geschaffen bestehende CSV Dateien in das XML Format zu übertragen und somit für eine leichte Weiterverarbeitung zur Verfügung zu stellen.
Motivation
Für eine eigenentwickelte Katalogsoftware mussten bestehende Artikeldaten aus verschieden Altsystemen importiert werden. Die Daten lagen meist im CSV Format vor und konnten somit nicht direkt eingespielt werden. Da es sich bei der Katalogsoftware um eine vollständige J2EE Anwendung handelt, die über eine XML basierte BMECat Import-Schnittstelle verfügt, musste also nur die Möglichkeit geschaffen werden, die CSV Daten in ein XML Format zu bringen und mittels XSLT in eine valides BMECat Format zu transformieren.
Da es sich bei der Problematik des Umwandelns von CSV in XML um ein recht allgemeingültiges Problem handelt wurde ein kleines SwingGUI entwicklet, mit dem man diese Aufgabe recht einfach erledigen kann.
Verwendete Technologien
Nachfolgend werden kurz die einzelnen Technologien beschrieben, die während der Umsetzung zum Einsatz kamen.
SAX
Bei SAX handelt es sich um das S imple A PI for X ML processing, das ein ereignisorientiertes, serielles Verarbeiten von XML Daten unter Java ermöglicht.
Swing
Die Java Foundation Classes (JFC) dienen der Erstellung grafischen Oberflächen. Sie werden auch als Swing Klassen bezeichnet.
JUnit
Bei JUnit handelt es sich um ein Open Source Unit Testing Framework mit dessen Hilfe man seinen Code besser testen und weiter verbessern kann. Die Testresultate lassen sich als XML Dateien erzeugen und über mitgelieferte Sytlesheets in HTML Seiten transformieren.
Java Help
Java Help ist ein plattformunabhängiges erweiterbares Hilfesystem, das von Entwicklern und Hilfeauthoren leicht in Applets, Komponenten, Anwendungen und Betriebssysteme eingebaut werden kann.
Apache Ant
Ant ist ein auf Java basiertes Build Tool für Java Softwareprojekte und läßt sich entfernt mit Make vergleichen, ist jedoch vor allem durch seine XML Builddateien ungleich einfacher in der Handhabung. Darüberhinaus läßt sich Ant in fast alle populäre integrierten Entwicklungsumgebungen integrieren und ist bei Bedarf beliebig um eigene Tasks erweiterbar.
Realisierung
Folgendes UML Diagramm stellt den Kern der Anwendung dar: 
CSVTokenizer
In Standardumfang von Java ist ein StringTokenizer enthalten, mit dem man Strings, die durch ein bestimmtes Zeichen getrennt sind, einlesen kann. Leider funktioniert diese Klasse nicht in alle Situationen. Es werden z. B. leere Elemente nicht "richtig "beachtet bzw. übergangen. Die Klasse CSVTokenizer stellt ähnliche Funktionalität wie die Klasse StringTokenizer zur Verfügung. Sie kann allerdings mit leeren Elementen umgehen. Für diese Klasse wurde ein JUnit Test geschrieben, der die Funktionalität überprüft.
Beispiel:
public void testSimpleTokenizerNextTokenWithEmptyValues(){
tokenizer = new CSVTokenizer("Das ist mein;;;zu trennender Text; hallo;", ';');
assertEquals("Das ist mein", tokenizer.nextElement());
assertEquals("", tokenizer.nextElement());
assertEquals("", tokenizer.nextElement());
assertEquals("zu trennender Text", tokenizer.nextElement());
assertEquals(" hallo", tokenizer.nextElement());
assertEquals("", tokenizer.nextElement());
assertEquals(null, tokenizer.nextElement());
assertEquals(null, tokenizer.nextElement());
}CSVReader
Die Klasse CSVReader liest über den CSVTokenizer die einzelnen Zeilen der CSV Datei ein und erzeugt über einen ContentHandler SAX Events.
SAX2Writer
Der SAX2Writer stellt ein ContentHandler dar, der über die SAX Callback-Methoden ein neues XML Dokument erzeugt.
Beispiel:
/* * @see ContentHandler#startDocument() */
public void startDocument() throws SAXException {
String documentStartString = "<?xml version=\"1.0\" encoding=\""
+ encoding + "\"?><" + ROOTELEMENTNAME + ">";
try {
out.write(documentStartString, 0, documentStartString.length());
out.flush();
}
catch(IOException e) {
fatalError(new SAXParseException("", new LocatorImpl(), e));
}
}Anwendung
Nach dem Start der Anwendung öffnet sich das Hauptfenster, in dem man eine Ein- und eine Ausgabedatei definieren kann. Die Auswahl erfolgt über die beiden Schaltflächen Import Datei auswählen und Export Datei auswählen. Bei der ersten Datei muss es sich um eine CSV Datei handeln, die in XML transformiert werden soll. Sind beide Dateien angegeben, so ist die dritte Schaltfläche aktiviert und der Transformationsvorgang kann angestoßen werden.

Werden über den Optionsdialog keine Änderungen vorgenommen gelten beim Import folgende Standardeinstellungen.
- die einzelnen Werte sind durch
;getrennt - Textwerte sind durch
"voneinander getrennt - ein Datensatz wird in der XML Datei als
rowElement importiert - die CSV Datei enthält in der ersten Zeile die Splatennamen
- die CSV Datei enthält am Anfang eine Füllzeile.
Beispiel:
Vorname;Name;Ort;PLZ;Strasse;Text;Bemerkung Max;Mustermann;Mannheim;68209;Musterstrasse 23;\ "Mein Text mit ;Sonderzeichen";"meine Bemerkungen" Gerda;Gans;Mannheim;68209;Musterstrasse 20;\ "mein";"meine zweiten Bemerkungen";
wird zur folgenden XML Datei:
<?xml version="1.0" encoding="UTF-8"?>
<csvimport>
<row>
<Vorname>Max</Vorname>
<Name>Mustermann</Name>
<Ort>Mannheim</Ort>
<PLZ>68209</PLZ>
<Strasse>Musterstrasse 23</Strasse>
<Text>mein Text mit ;Sonderzeichen</Text>
<Bemerkung>meine Bemerkungen</Bemerkung>
</row>
<row>
<Vorname>Gerda</Vorname>
<Name>Gans</Name>
<Ort>Mannheim</Ort>
<PLZ>68209</PLZ>
<Strasse>Musterstrasse 20</Strasse>
<Text>mein</Text>
<Bemerkung>meine zweiten Bemerkungen</Bemerkung>
</row>
</csvimport>Über den Optionsdialog lassen sich folgende Werte änhelp\html\dern:
- das Trennzeichen läßt sich über eine Auswahlbox ändern (
|,;,,stehen zur Verfügung) - das Texttrennzeichen läßt sich konfigurieren (
"oder') - der Elementname läßt sich angeben (Freitext)
- es läßt sich angeben, ob die Spaltennamen in der ersten Zeile stehen. Wenn dies nicht der Fall ist, muss man die Anzahl der Spalten angeben werden.
Es ist prinzipiell möglich, dass sich ein Datensatz, wenn er über Textelemente verfügt, sich über mehrere Zeilen erstreckt! - es kann angegeben werden, ob die Datei eine Füllzeile enthält oder nicht.

Verwenden
Den CSV2XML Konverter gibt es als Java Web Start Anwendung, zum Download oder zum Einbinden in eigene Programme! Lesen Sie hierzu sorgfältig unsere Nutzungsbedingungen
1. Als Java Web Start Anwendung
Falls Sie noch kein Java Web Start installiert haben können Sie Java Web Start hier downloaden und installieren:
Den CSV2XML Konverter als Java Web Start Anwendung starten Sie durch folgenden Link: CSV2XML Konverter als Java Web Start Anwendung
2. Als Standalone Java Archiv
Alles was sie benötigen ist ein installiertes Java(TM) Runtime Environment (JRE) und dieses Java Archiv. Sie können die Anwendung durch folgenden Kommandozeilenaufruf starten:
java -jar CSV2XML.jar
Falls Sie unter Windows arbeiten und die Dateiendung jar mit Java verknüpft haben, können Sie die Anwendung auch über einen Doppelklick im Datei-Explorer starten.
download Java Archiv CSV2XML.jar (ca. 500 kb)
3. Zum Einbinden in eigene Programme
Falls Sie den CSV2XML Konverter in eigenen Programmen einsetzen möchten, könne Sie folgendes Java Archiv herunterladen und die Klasse de.oio.util.xml.CSVReader in ihren eigenen Code einbinden. (Archiv (ca. 9 kb))
Die Klasse de.oio.util.xml.CSVReader ist in folgenden JavaDoc Dokumenten beschrieben (online HTML, Download JavaDoc ).
Referenzen
SAX Project
(http://www.saxproject.org/)
The Swing Connection
(http://java.sun.com/products/jfc/tsc/index.html)
JUnit.org
(http://www.junit.org)
Java(TM) Help
(http://java.sun.com/products/javahelp/index.html)
Apache Ant - Ant
(http://jakarta.apache.org/ant)















