CSV nach XML Konverter

Autoren:
Steffen Schluff
Orientation in Objects GmbH
Kristian Köhler
Orientation in Objects GmbH
Steffen Schluff
Steffen Schluff
Kristian Köhler
Kristian Köhler
Datum:Oktober 2002

Tool für die Konvertierung CSV nach XML

Konverter

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:
Klassendiagramm

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.

csv2xml Konverter

Werden über den Optionsdialog keine Änderungen vorgenommen gelten beim Import folgende Standardeinstellungen.

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:

Konverter-Optionen

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:

Java Web Start Logo

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)

Zum Geschaeftsbreich Competence Center
XML Konverter
CSV2XML Konverter als Ant Task
Der CSV nach XML Konverter ist nun auch als Ant Task verfügbar.
Newsletter abonnieren