PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Von .txt in eine .xml schreiben



nalye
17.02.09, 13:53
Und zwar nicht der Reihenfolge nach, sondern so, daß ich z.Bsp. die 3. Zeile in der Textdatei als 1. Zeile in die .xml schreiben kann.

Konkret will ich dieses Format

Beispiel
Username Beispiel
1.Passwort Beispiel
notepad.exe
13.01.2009 19:51:01
Dies ist ein Beispieleintrag
2.Passwort Beispiel
nie
E-Mail
Feld1
FeldWert1
Feld2
FeldWert2

in folgendes wandeln:

<group>General</group>
<title>Beispiel</title>
<username>Username Beispiel</username>
<url>http://www.web.com</url>
<password>1.Passwort Beispiel</password>
<notes>Dies ist ein Beispieleintrag</notes>
<creationtime>-aktuelles Datum-</creationtime>
<lastmodtime>-aktuelles Datum-</lastmodtime>
<lastaccesstime>-aktuelles Datum-</lastaccesstime>
<expiretime expires="false">never(das nie aus o.g. Beispiel)</expiretime>

marce
17.02.09, 13:56
klingt nach einer idealen Aufgabe für Perl.

waxolunist
17.02.09, 14:32
Ich würde das mit xslt versuchen.
Mit 2 XSLT-Durchläufen sollte das kein Problem sein.
Im ersten Durchgang transformierst du die Textdatei in ein allgemeines XML.

Ich habe dafür z.B. folgendes XSL:


<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:str="http://exslt.org/Strings"
version="2.0">

<xsl:output method="xml"
version="1.0"
encoding="UTF-8"
indent="yes"
omit-xml-declaration="no" />

<!-- Delimiters are regular expressions, so for one ore more spaces use the +
For more than one delimiter use the OR-sign.
You can also use instead of the unicode-character the real sign. But behave of the stylesheet-encoding.
&#44; -> ,
&#59; -> ;
&#124; -> |

see http://www.tony-franks.co.uk/UTF-8.htm for more Unicode-Characters
-->

<!--
Settings
-->
<xsl:variable name="linedelims" select="'\n'"/>
<xsl:variable name="itemdelims">&#59;</xsl:variable>
<xsl:variable name="omitfirstline" select="false()"/>

<xsl:template match="/root">

<!--
Init variables
-->
<xsl:variable name="lines" select="tokenize(., $linedelims)"/>
<xsl:variable name="startline">
<xsl:choose>
<xsl:when test="$omitfirstline">
<xsl:value-of select="1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="0"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>

<csv>
<xsl:for-each select="$lines">
<xsl:variable name="linenumber" select="position()+$startline" />
<row>
<xsl:variable name="items" select="tokenize($lines[$linenumber], $itemdelims)"/>
<xsl:for-each select="$items">
<xsl:variable name="itemnumber" select="position()" />
<cell>
<xsl:value-of select="$items[$itemnumber]"/>
</cell>
</xsl:for-each>
</row>
</xsl:for-each>
</csv>

</xsl:template>

</xsl:stylesheet>


Dann kannst du leicht mit einem 2. XSLT dein XML erzeugen.

Lg, Christian

waxolunist
17.02.09, 14:33
Und zwar nicht der Reihenfolge nach, sondern so, daß ich z.Bsp. die 3. Zeile in der Textdatei als 1. Zeile in die .xml schreiben kann.


Wieso willst du eine Reihenfolge in dem XML?
XML ist das egal und i.R. für die weitere Verarbeitung ebenso.

Lg, Christian

nalye
17.02.09, 14:42
Echt? Okay... Das soll nämlich von onepw in Keepass exportiert werden, und ich wußte nicht, daß da die Reihenfolge keine Rolle spielt.

//Edit @ waxolunist: Blöde Frage, aber wie führe ich das aus?

waxolunist
17.02.09, 15:17
Echt? Okay... Das soll nämlich von onepw in Keepass exportiert werden, und ich wußte nicht, daß da die Reihenfolge keine Rolle spielt.

//Edit @ waxolunist: Blöde Frage, aber wie führe ich das aus?

Kommt natürlich drauf an, wie gut der XML-Reader ist. Aber für normal greife ich auf ein XML Tag via Namen zu und nicht via Index.

Ich habe da ein Programm in Java geschrieben, das mehrere XSLT hintereinander ausführt wahlweise mit Xalan oder Saxon. Das darf ich hier aber nicht hochladen.

Aber im Grunde geht das auch mit dem hier: http://xml.apache.org/xalan-j/commandline.html

Du musst natürlich das XML noch ein wenig anpassen. Vor allem bei den Delimitern.

waxolunist
17.02.09, 16:17
Ok.
Ich könnte dir das Progrämmchen schicken.
Schreib mir einfach eine private Nachricht mit deiner Mailadresse und ich kann es dir zuschicken.
Ich habe es von allem proprietären befreit. Ging ziemlich schnell. ;)

Irgendwann, wenn ich mal Zeit habe werde ich es auf Sourceforge und unter die GPL stellen - ganz bestimmt irgendwann, ich habe es ja erst vor 4 Jahren geschrieben. ;)

Lg, Christian