« Übersicht Projekte

Python: XML-Dom

../../_images/beeren-im-herbst.jpg

Lernziel

Neben dem SAX-Parser können Sie auch einen DOM-Parser zur Bearbeitung von XML-Dateien einsetzen. Das XML-Dokument wird als Baum-Struktur im Speicher gehalten. Im Unterschied zum SAX-Parser kann der DOM-Baum manipuliert werden, z.B. durch hinzufügen, entfernen oder ändern von Elementen und Attributen.

Aufgaben

  1. Erstellen Sie mit Hilfe des minidom-Modules eine eigene XML-Datei.

  2. Speichern Sie diese nach der Erstellung in einer Datei ab.

Beispiele zum Öffnen einer Datei

Für die Bearbeitung einer XML-Datei muß diese geöffnet und eingelesen werden. Die Beispiele mit dom1 und dom2 benutzen Dateien, dom3 erhält ein neues XML-Dokument aus einer Zeichenkette.

1
2
3
4
5
6
7
8
from xml.dom.minidom import parse, parseString

dom1 = parse('c:\\temp\\mydata.xml')

datasource = open('c:\\temp\\mydata.xml')
dom2 = parse(datasource)

dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')

Ausgabe der Teile eines DOM

Hier ein Beispiel, wie ein XML-Baum ausgegeben werden kann.

 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import xml.dom.minidom

document = """\
<slideshow>
<title>Demo slideshow</title>
<slide><title>Slide title</title>
<point>This is a demo</point>
<point>Of a program for processing slides</point>
</slide>

<slide><title>Another demo slide</title>
<point>It is important</point>
<point>To have more than</point>
<point>one slide</point>
</slide>
</slideshow>
"""

dom = xml.dom.minidom.parseString(document)

def getText(nodelist):
    rc = ""
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc = rc + node.data
    return rc

def handleSlideshow(slideshow):
    print "<html>"
    handleSlideshowTitle(slideshow.getElementsByTagName("title")[0])
    slides = slideshow.getElementsByTagName("slide")
    handleToc(slides)
    handleSlides(slides)
    print "</html>"

def handleSlides(slides):
    for slide in slides:
        handleSlide(slide)

def handleSlide(slide):
    handleSlideTitle(slide.getElementsByTagName("title")[0])
    handlePoints(slide.getElementsByTagName("point"))

def handleSlideshowTitle(title):
    print "<title>%s</title>" % getText(title.childNodes)

def handleSlideTitle(title):
    print "<h2>%s</h2>" % getText(title.childNodes)

def handlePoints(points):
    print "<ul>"
    for point in points:
        handlePoint(point)
    print "</ul>"

def handlePoint(point):
    print "<li>%s</li>" % getText(point.childNodes)

def handleToc(slides):
    for slide in slides:
        title = slide.getElementsByTagName("title")[0]
        print "<p>%s</p>" % getText(title.childNodes)

handleSlideshow(dom)