Die tägliche Ration Wahnsinn
Das offene Ohr Mein Icon
spacer
That's me, folks

Partnerprogramme

Buch24.de - Bücher versandkostenfrei

Abebooks.de - Antiquarische und gebrauchte Bücher

shirtcity.de  -  CLICK YOUR SHIRT

spacer spacer

Daily Link Icon Sonntag, 7. April 2002

Im Tagesspiegel von heute gibt es einen netten Artikel über den Schelm und Bildhauer vom Bodensee Peter Lenk. Über dessen Konstanzer Imperia hatte auch ich einmal (1993) etwas verbrochen.

10:48:54 PM | Perma Link Icon | Forum

Mini-Weblog-Tool mit Python & XML [1]

Python & XML Book Cover [Python & XML] (statt einer Besprechung): Das Buch Python & XML von Christopher A. Jones und Fred L. Drake, Jr. ist wunderbar. Doch statt einer ultimativen Lobhudelei möchte ich zwei Scripte veröffentlichen, die ich -- inspiriert durch die Beispiele in Kapitel 4 des Buches -- geschrieben habe. Sie folgen in weiten Teilen dem Buch, sind aber so abgewandelt, daß sie als Grundlage für ein Mini-Weblog-Tool auf XML-Basis benutzt werden können.

[Die Klasse Artikel]: Die Klasse Artikel ist ein kleine Klasse. Sie exportiert nur zwei Methoden, eine Methode, die aus einem Artikel eine XML-Representation erstellt, und eine Methode, die umgekehrt aus einer XML-Representation wieder einen String generiert. Diese Methode arbeitet mit minidom. Die DOM-Implementierung ist Teil der Python-Standard-Distribution.

import xml.dom.minidom
from xml.sax.saxutils import escape

class Article:
""" Ein Artikel und seine Metadaten. """

   def __init__(self):
   """ Alles zurücksetzen. """
      self.reset()

   def reset(self):
      self.title = ""
      self.source = ""
      self.size = 0
      self.when = ""
      self.description = ""
      # self.categories = ""
   def getXML(self):
   """ Generiert das XML für den Artikel. """

      attr = ''
      if self.title:
         attr = ' title="%s"' % escape(self.title)
      s = '<?xml version="1.0"?>\n<item%s>\n' % attr
      if self.source:
         s = '%s\t<source url="%s" />\n' % (s, escape(self.link))
      if self.description:
         s = '%s\t<description>\n%s\n\t</description>\n' % (s, escape(self.description))
      return s + '</item>\n'

   def fromXML(self, data):
   """ data ist ein XML-Dokument, das als String übergeben wird. """
      self.reset()
      dom = xml.dom.minidom.parseString(data)
      self.title = get_attribute(dom, "item", "title")
      self.source = get_attribute(dom, "source", "url")
      self.size = int(get_attribute(dom, "size", "bytes") or 0)
      self.when = get_attribute(dom, "when", "stime")
      nodelist = dom.getElementsByTagName("description")
      if nodelist:
         assert len(nodelist) == 1
         description = nodelist[0]
         description.normalize()
         if description.childNodes:
            self.description = description.firstChild.data.strip()

# Hilfsfunktionen:

def get_attribute(dom, tagname, attrname):
   """ Gibt den Wert eines Attributs zurück, falls vorhanden. """
   nodelist = dom.getElementsByTagName(tagname)
   if nodelist:
      assert len(nodelist) == 1
      node = nodelist[0]
      return node.getAttribute(attrname).strip()
   else:
      return ""

Wir machen hier massiv Gebrauch von Pythons string formatting expressions, die ähnlich funktionieren, wie das von C bekannte sprintf. Dabei werden links vom % stehende %s durch die rechts vom % stehende Strings ersetzt.

Beachtet außerdem die escape-Funktion (aus xml.sax.saxutils), die dafür sorgt, daß eventuelle Zeichen, die in XML maskiert werden müssen, auch maskiert werden.

Die fromXML-Methode benutzt das DOM um die benötigten Informationen aus dem XML herauszuklauben.

Jetzt kann man schon einmal testweise im Interpreter eingeben:

>>> from article import Article
>>> art = Article()
>>> art.title = "Erstes Posting"
>>> art.description = "Dies ist mein erstes Posting."
>>> print art.getXML()
<?xml version="1.0"?>
<item title="Erstes Posting">
   <description>
Dies ist mein erstes Posting.
   </description>
</item>

[Die Klasse Storage]: Jetzt benötigen wir als nächstes eine Klasse, die die generierten XML-Strings als Datei ins Filesystem schreibt und die XML-Dateien lesen und für die weitere Bearbeitung aufbereiten kann. Auch diese Klasse ist wieder sehr klein.

from article import Article
import string, os

class Storage:
""" Speichert und lädt Artikel-Objekte als XML-Files.
    -- sollte einfach für eine Datenbank zu adaptieren sein. """

   def save(self, article):
   """ Speichert als <article.title>.xml. Entfernt vorher alle
       Leerzeichen aus dem Titel. """

      # Einen einigermaßen sicheren Dateinamen aus dem Titel konstruieren:
      sf = string.replace(article.title, " ", "")
      sf = string.replace(sf, os.sep, "")
      sf = string.replace(sf, ".", "")
      sf = sf[:25]
      sf += ".xml"
      fd = open(sf, "w")

      # Schreibt die Daten via getXML() auf die Platte:
      fd.write(article.getXML())
      fd.close()

   def load(self, sName):
      """ sName in der Form *.xml. Gibt ein
          Article Object zurück. """
      fd = open(sName, "r")
      sxml = fd.read()

      # Erzeuge eine Article Instance:
      art = Article()

      # Erzeuge ein Article Object via fromXML():
      art.fromXML(sxml)
      fd.close()

      return art

Beide Methoden sind eigentlich trivial und tun exakt das, was ihr Name sagt: load lädt eine XML-Datei und generiert eine Instanz der Klasse Article und save schreibt eine Instanz der Klasse Article als XML-Datei auf die Festplatte.

Die umständliche Generierung eines Dateinamens aus dem Titel ist aus zweierlei Hinsicht eigentlich unnötig. Einmal wird man bei einer ernsthaften Anwendung sicher nicht einen Dateinamen aus dem Titel generieren, sondern sich irgendetwas anderes -- z.B. eine fortlaufende Numerierung -- überlegen und zweitens erinnere ich mich, irgendwo in der Dokumentation einmal eine Methode in irgendeinem Modul gefunden zu haben, die einen sicheren Dateinamen konstruiert. Nur -- ich konnte diese Methode nicht wiederfinden...

Diese beiden Klassen können auch ohne CGI-Modul lokal auf dem Rechner getestet werden. Sie sind völlig unabhängig von der geplanten Anwendung und daher vielleicht auch anderswo nützlich. Dies ist einer der Vorteile der Objektorientierung, wie Python sie bietet.

In der Fortsetzung dieser kleinen Artikelreihe werden wir ein CGI-Skript entwickeln, das diese beiden Methoden benutzt und mit Hilfe meiner kleinen Template-Engine ein Mini-Weblog-Tool daraus basteln.

Zum Schluß möchte ich noch einmal auf Python & XML hinweisen, das mich zu diesem Artikelchen inspiriert hat und woraus ich auch sehr viel Code geborgt habe. Es ist absolut lesenswert und ein must have für jeden, der sich mit Python und XML beschäftigt oder beschäftigen will.

Wie immer gibt es bei O'Reilly ein Probekapitel online. Diesmal das erste Kapitel Python and XML, das eine kleine Übersicht über XML, SAX, DOM und die Tools, die in Python für die Bearbeitung von XML zur Verfügung stehen, gibt.

Permanenter Link

2:08:24 PM | Perma Link Icon | Forum

Suchbild

Haubentaucher auf dem Schlachtensee, Photo: Gabi Kantel, 04.04.2002

Haubentaucher auf dem Schlachtensee. [Photo: Gabi]

10:07:00 AM | Perma Link Icon | Forum

NetLogo 1.1 Release Announcement.

9:54:13 AM | Perma Link Icon | Forum

Yes, Tkinter works fine with AquaTk in MachoPython. Tony Lownds: Rough notes on getting Tkinter and MachoPython to work.

Den aktuellen Mac OS X Tk-Snapshot gibt es hier.

Python Icon   Script different!

9:52:42 AM | Perma Link Icon | Forum

[Noch ein JavaScript Cross-Browser-API]: TIBET - cross-browser, client-side technology. No applets. No plugins. No kidding. [Sender Traumwind]

9:45:25 AM | Perma Link Icon | Forum

Slashdot thread on Google's SOAP API. [Scripting News]

9:26:25 AM | Perma Link Icon | Forum

Creator 1.1 “is an application that will let you change the default application for files very easily by choosing the name of an application.” [mac.scripting.com]

9:24:05 AM | Perma Link Icon | Forum

[Impressumspflicht]. Noch eine seriöse Quelle zur Impressumspflicht. [.::: robert s. :::.]

9:22:28 AM | Perma Link Icon | Forum

[MacGimp bei MacWelt]. Auf der CD-ROM der neuen Macwelt-Printausgabe gibt es die komplette MacGimp-Distribution inklusive Anleitung im Heft. 250 MB-Download gespart. [Industrial Technology and Witchcraft]

9:17:57 AM | Perma Link Icon | Forum

[Öffentliche Hotspots]. Wo überall in Deutschland man sich in ein öffentliches, drahtloses Local Area Network einloggen kann, erfährt man bei mobileaccess.de: »Im Straßencafés Cappuccino trinken und gleichzeitig im Internet surfen - für UMTS noch ferne Vision, bei wireless LAN tägliche Praxis.« Hauptsächlich Hotels und Unis bieten bisher diesen - meist kostenlosen - Service, aber auch der Aachener Marktplatz. [Industrial Technology and Witchcraft]

9:15:40 AM | Perma Link Icon | Forum

[Abteilung Zensur, die zweite]: Düsseldorfer Demonstration gegen Netzzensur. [heise online news]

Mehr darüber auch im KriTLog.

9:10:56 AM | Perma Link Icon | Forum

Kleinster Webbrowser der Welt [Kleinster Webbrowser der Welt]. KerLone: »Bin heute endlich mal dazugekommen, für meine Armbanduhr OnHand aka Ruputer einen Webbrowser zu installieren (einen Offline-Browser, wohlgemerkt). Das Ding nennt sich Omegascape und ist niedliche 22kb groß. Dabei ist das Ding besser als Lynx, denn meine Spaltenaufteilung ging nicht verloren. Die Datei wird in einzelne Zellen aufgeteilt, und wie man auf dem größeren Bild sieht, beginnt die mittlere Spalte von meiner Seite bei Zelle "L" (wird ganz links oben angezeigt). Das HTML-File wurde unverändert in die Uhr geladen, wohlgemerkt, und der arme 7Mhz-Prozessor muss sich durch 32kb HMTL-Code wühlen. Aber es geht, von den Umlauten mal abgesehen. Hyperlinks könnte man auch folgen, falls man die entsprechenden Dateien "onhand" hätte oder falls es interne Links wären. Tja, ich bin beeindruckt. Jetzt kann ich theoretisch morgens in der S-Bahn den Heise-Ticker lesen. Allerdings ist es vielleicht nicht unklug, vorher irrelevanten Code-Ballast mit einem Skript herauszurippen.

So, wenn jetzt eine neues Weblog auftaucht, sollte es nicht nur W3C- und iCab-konform sein, sondern auch Omegascape-tauglich Smile«
[Mosaikum 1.0 - Aus dem Fluss der Belanglosigkeit]

Ein guter Vorsatz. Leider ist KerLones Weblog nur bedingt iCab-konform.

9:03:52 AM | Perma Link Icon | Forum

Google will eine API anbieten. [monoklon.de]

8:53:58 AM | Perma Link Icon | Forum

Russ Lipton still documents Radio: How To Reinstall Radio. [Russ Lipton Documents Radio]

8:49:28 AM | Perma Link Icon | Forum

Wer einmal so singen möchte wie Daffy Duck: Looney Tunes Lyrics. [bOing bOing]

8:47:31 AM | Perma Link Icon | Forum

[Alte Bücher online suchen]: Willkommen beim Zentralen Verzeichnis Antiquarischer Bücher. Hier finden Sie über 5,2 Millionen antiquarische Bücher, Noten, Graphiken und Postkarten von Antiquariaten aus 18 Ländern. [Mosaikum 1.0 - Aus dem Fluss der Belanglosigkeit]

8:43:53 AM | Perma Link Icon | Forum

Icon Analyst back issues on line. »The full set of back issues of the Icon Analyst, all 66 issues from 1990 - 2001, is now on line in PDF format.

The Icon Analyst provided in-depth coverage of Icon with an emphasis on programming. It ceased publication in 2001.«
[Lambda the Ultimate]

Mehr zu Icon.

8:33:49 AM | Perma Link Icon | Forum

[JavaScript]: CBE is a cross-browser DHTML Javascript library or API. You download CBE to your own computer and use it to develop dynamic web applications (DHTML). You then upload your application and the CBE files to your own site. [brentashley]

8:28:35 AM | Perma Link Icon | Forum

[Abteilung Zensur]: Kollateralschäden bei freiwilligen Internetsperrungen. [heise online news]

8:20:35 AM | Perma Link Icon | Forum

Kran Umfall

[Der Kran-Unfall-Sammler]. CraneAccidents.com is the Official Web-site for reporting crane related accidents on a world wide basis. The site is loaded with photos of crane accidents. [Industrial Technology and Witchcraft]

8:18:35 AM | Perma Link Icon | Forum

Pressemitteilung von attacBerlin zur Krise der Bankgesellschaft (frech aus dem Frame heraus verlinkt). Die Seiten von attacBerlin sind hier.

Rollberg Icon   <-- Hier klicken!

8:06:01 AM | Perma Link Icon | Forum


spacer spacer spacer spacer
April 2002
Sun Mon Tue Wed Thu Fri Sat
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
Mar   May

Interne Links:
 Startseite
 Impressum
 Über mich
 Über Gabi
 Credits
 Sitemap
 Archiv
 Linksammlung
 Gabi gucken
 Gabis lustiger Falthund
 Pythonmania
 Turn Your Radio On!
 Perl(en)
 JavaScript
 Webdesign
 Programmiersprachen
 Mathematik
 Ich habe gelesen
 Alles Kino
 Ausflüge & Reisen
 Bugastadt 2001
 Temporäre Gärten 2001
 Vermischtes
 Tom Tit
 Theater & Kabarett
 Icons
 Bild hochladen
 Wer linkt mich?

 RSS Icon

Andere & Awards
 Krit-Apfel 8/2000
 Wohin heute
 Netzwissenschaft
 Dr. Web
 Webobserver
 cognitive Architects
 nordwest net
 Die Welt
 voices
 Die Zeit
 Berliner Zeitung
 Tagesanzeiger.ch
 c't 2/2002
 Focus
 dpa
 Tagesspiegel

Unser Netzimperium
 Kantel-Chaos-Team
 Gabi
 Zebu
 Jörgs Zope-Site
 Tribute to John Brunner
 Der Rollberg
 Der alte SWR


Letzte Änderung: 14.01.2003; 16:09:14 Uhr | © Copyright: 2003 by Kantel-Chaos-Team | Kontakt: der@schockwellenreiter.de

This site is edited with Radio UserLand, the first personal Web Application server for Windows and Macintosh.  This site is made with a Apple Macintosh Computer and I'm proud about that.  This site was build with BBEdit. It don't sucks!  This site is HTML 4.01 compatible.  This site is made with Cascading Style Sheets.  Let iCab smile  Site Meter