XML wandeln in ASCII
ciddy77
- xml
Hi,
zuerst mal, ich bin absoluter Laie auf diesem Gebiet. Zum Thema: Für meine Buchhaltung brauche ich ASCII Dateien, um Sie in meine Software zu importieren. Allerdings funktioniert der Export aus dem Verwaltungsprogramm nur als XML. Kann mir da jemand weiterhelfen? Vielleicht ist es ja leichter, als ich mir das gerade vorstelle.
Danke und beste Grüße,
ciddy
Hallo ciddy77,
Allerdings funktioniert der Export aus dem Verwaltungsprogramm nur als XML.
Bei Kenntnis der XML-Struktur und des auszugebenden Textformats (z. B. CSV) lässt sich eine entsprechende XSL-Transformation aufsetzen (Basis <xsl:output method="text"/>
).
Grüße,
Thomas
Hi Thomas,
erstmal danke für Deine Antwort. Leider versteh ich nur Bahnhof. Es geht um GS-Auftrag. Da kann ich als .xml exportieren. Meine Buchhalterin sagt aber Sie braucht ASCII für den Import. Was kann ich tun?
Grüße, ciddy
Hallo ciddy77,
Es geht um GS-Auftrag. Da kann ich als .xml exportieren. Meine Buchhalterin sagt aber Sie braucht ASCII für den Import. Was kann ich tun?
Zeige mal ein relevantes Stück des exportierten XML-Codes und die Entsprechung in der Textvariante. Dann kann ich daran das formale Prinzip der Transformation näher erläutern.
Grüße,
Thomas
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes" ?>
Hallo ciddy77,
- <FIELDS>
- <!-- Definitionen der exportierten Felder
-->
<FIELD attrname="AUFTRAGSSTATUS" fieldtype="string" WIDTH="6" />
...
Vermutlich sollen die FIELD-Namen die Spalten bilden und die Attribute der ROW-Elemente die einzelnen Daten. Dann passt formal diese Transformation:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="ISO-8859-1"/>
<xsl:template match="DATAPACKET">
<xsl:for-each select="METADATA/FIELDS/FIELD">
<xsl:value-of select="@attrname"/>
<xsl:choose>
<xsl:when test="position()!=last()">
<xsl:text>;</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>
</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<xsl:for-each select="ROWDATA/ROW/@*">
<xsl:value-of select="."/>
<xsl:choose>
<xsl:when test="position()!=last()">
<xsl:text>;</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>
</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
mit dem Ergebnis:
AUFTRAGSSTATUS;AUFTRAGSART;EUROBETRAG;...
OK;RE;113,82;...
Zur Umsetzung bieteten sich XSLT-Prozessoren wie u. a. Saxon oder AltovaXML an.
Grüße,
Thomas
Und mit den Programmen könnte in in ASCII konvertieren?
Hallo ciddy77,
Und mit den Programmen könnte in in ASCII konvertieren?
Mit diesen Tools lassen sich XML-Dokumente auf der Basis von XSLT-Stylesheets in die gewünschten Ausgaben umformen (transformieren). Der Aufruf erfolgt üblicherweise über eine Konsole, z. B. Saxon als Java-Anwendung:
java -jar x:\pfad\zu\saxon\saxon9.jar -s:name.xml -xsl:name.xsl -o:name.out
-s = source (das XML-Dokument als Quelle)
-xsl = XSLT-Stylesheet
-o = output (die Zieldatei)
Grüße,
Thomas
[Nachtrag:]
<xsl:for-each select="ROWDATA/ROW/@*">
<xsl:value-of select="."/>
xsl:choose
<xsl:when test="position()!=last()">
xsl:text;</xsl:text>
</xsl:when>
xsl:otherwise
xsl:text
</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
Ich hatte es nur mit dem einen gegebenen Datensatz probiert, bei mehreren ist noch etwas Feintuning nötig:
~~~xml
<xsl:for-each select="ROWDATA">
<xsl:for-each select="ROW/@*">
<xsl:value-of select="."/>
xsl:choose
<xsl:when test="position()!=last()">
xsl:text;</xsl:text>
</xsl:when>
xsl:otherwise
xsl:text
</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:for-each>
Grüße,
Thomas