Thema: templates nach tags abgrasen

hallo..
ich habe eine datei mit ungefähr folgendem inhalt:

<template>
  <playlist>Playliste<table><loop argument="playlist"><tr><td><name><artist></td></tr></loop argument="playlist"></table></playlist>
</template>

so. ich möchte mittels regexp den wert zwischen template haben, dann den wert zwischen playlist, dann was in loop steht, und schließlich die werte name und artist durch 2 variablen ersetzten.. (in dem späteren Loop)..

dazu müssen alle "werte" oder taginhalte in variablen gesetzt werden.. wie geht sowas?

cybersys
anything you want to

2

Re: templates nach tags abgrasen

Moin,

"...ich habe eine datei mit ungefähr folgendem inhalt: ..."

Diese Angabe ist wenig nützlich.

Man sollte zB. wissen: können verschachtelte tags der gleichen Art
vorkommen?, also zB:

<table>
    <table>
        <table>
        </table>
    </table>
</table>

Warum hat der loop-Endtag ein Attribut?

</loop argument="playlist">

Warum haben die alleinstehenden tags keinen End-slash?

<name><artist>

Zwar kannst Du Dein Problem mit regexes angehn, allerdings müsstest Du
dann schon einiges darüber wissen. Deine Fragestellung lässt vermuten,
daß das nicht der Fall ist.
Und es gibt wesentlich einfachere Möglichkeiten. Mal angenommen, Deine
Datei wäre einigermaßen well-formed, zB. (template.txt):

<template>
    <playlist>Playliste
        <table>
            <loop argument="playlist">
                <table>schataratachtel
                </table>
                <tr>
                    <td>
                        <name1_1 />
                        <artist1_1 />
                    </td>
                    <td>
                        <name1_2 />
                        <artist1_2 />
                    </td>
                </tr>
                <tr>
                    <td>
                        <name2_1 />
                        <artist2_1 />
                    </td>
                    <td>
                        <name2_2 />
                        <artist2_2 />
                    </td>
                </tr>
            </loop>
        </table>
    </playlist>
</template>

Dann könntest Du in python zB. sagen:

import xml.dom.minidom as x

f = file('template.txt')
T = x.parseString(f.read())
f.close()

for i in T.getElementsByTagName('*') :
    try    : t = i.firstChild.data
    except : t = ''
    print '%-10s => %-10s => %s' % (i.parentNode.nodeName, i.nodeName, t)

Oder:

import xml.dom.minidom as x

f = file('template.txt')
T = x.parseString(f.read())
f.close()

def N(n):
    t = []
    def N(n):
        for i in n.childNodes :
            if i.nodeType == 1 :
                t.append((i.tagName, i.getElementsByTagName('*')))
                N(i)               
    N(n)
    return t
        
for i in N(T) : print i, 'n'

Soll heißen, es liegt eigentlich alles (und noch ein bissel mehr) bereits
vor, Du brauchst Dir bloß rauspicken, was Dir wichtig ist, und kannst damit
anstellen, was Du willst (in Variablen packen, irgendwo abspeichern, sonstwie
weiterverwursten).

Damit kannst Du Dir ne Menge Arbeit sparen, und Du brauchst Dir um den korrekten
Entwurf der notwendigen regexes und deren Weiterbehandlung nicht den Kopf
zerbrechen.

gruß

matho

3

Re: templates nach tags abgrasen

Moin zusammen,

andere Frage:
Sowohl für Python, als auch für Perl und PHP gibt?s bereits x-Dutzend Template Engines, die auch Loops beherrschen...
warum also YATE (Yet Another Template Engine) erstellen? smile

MfG, tink
der-der-dagegen-ist-das-Rad-nochmal-neu-zu-erfinden wink

Beleidigungen sind die Argumente derer, die keine Argumente haben

4

Re: templates nach tags abgrasen

@ Tink

die Frage war schließlich:

"...wie geht sowas?..."

gruß

matho

5

Re: templates nach tags abgrasen

@Matho:

Und meinst Du dann nicht, dass es praktikabler wäre, sich eine solche Klasse/Engine runterzuladen und sich das Ding vorzunehmen?
So schwer kann es nicht sein, die Stelle(n) zu finden, die für das Aufspüren und Ersetzen der Template-Tags (natürlich hier abhängig von der eingesetzten Engine) zuständig sind und diese zu analysieren/anzupassen/zu kopieren? (letzterer Fall natürlich nur von OS-Produkten, ich will hier niemanden anstiften, Copyrights zu verletzen! smile )

MfG, tink

Beleidigungen sind die Argumente derer, die keine Argumente haben

6

Re: templates nach tags abgrasen

@ Tink

Selbstverständlich ist das praktikabler (einfacher).
Es ist halt jedes mal aufs Neue die Frage, wie man am
besten auf Fragen antwortet. Ich hab sozusagen den
Mittelweg gewählt.
cybersys hatte ja eigentlich eine Lösung mit regexes
haben wollen. Wenn ich tatsächlich ausführlich hätte
antworten wollen, wäre dieser Beitrag doch entschieden
länger geworden, weil er sich offenbar der anstehenden
Probleme nicht vollends bewußt ist. Ich hätte über
Sachen reden müssen, für die Jeffrey Friedl so ca. sein
halbes Buch braucht, um's mal salopp zu formuliern.
Andrerseits wollte ich aber nichts fertiges hierhinsetzen,
dabei lernt man weniger.
Wenn er ein bissel in den Modulen stöbert, wird er natürlich
eine ganze Menge entdecken, um sich's absolut easy zu machen.
Mir geht's nicht drum, irgendwelche Räder neu zu erfinden,
ich denke aber, daß ein wenig Problembewußtsein in keinem
Fall schaden kann.

gruß

matho

7

Re: templates nach tags abgrasen

Auch noch ein paar Anregungen:

Falls du das Template-Design selbst kontrollierst, dann ist es ev. sinnvoller, die Template-Tags in eckige Klammern zu setzen (wie z.B. bei der Auszeichnungssprache hier). Dann hast du eine klarere Unterscheidung.

Wenn du z.B. PHP benutzt, dann brauchst du im einfachsten Fall einfach nur die Templte-Tags durch PHP-Code ersetzen. Ob das natürlich reicht, du also auf eine weitere Überprüfung verzichten kannst, musst du selbst beurteilen.

Falls die Templates korrektes XML sind, kannst du auch in PHP mit XML-Parsern arbeiten (mathos Python-Beispiel is ja sowas), z.B. mit expat.

Aber, wahrscheinlich ist es echt geschickter, wie Tink schon sagt, einfach eine der hunderten Template-Engines runterzuladen und dich dazu nicht vom ewigen Streit verwirren zu lassen, welche Template-Engine denn nun den 'richtigen' Ansatz verfolgt, welche Darstellung und Business-Logik korrekt trennt, ob eine solchge Trennung überhaupt möglich ist etc. pp. Für PHP empfehle ich einen Blick nach Smarty, PHPLIB, IT[X] und Fast-Template.

Basti