Merge lp:~uninja/python-snippets/xml-snippets into lp:~jonobacon/python-snippets/trunk

Proposed by Travis Nicholl
Status: Needs review
Proposed branch: lp:~uninja/python-snippets/xml-snippets
Merge into: lp:~jonobacon/python-snippets/trunk
Diff against target: 160 lines (+145/-0)
3 files modified
xml/dom_parser.py (+29/-0)
xml/sax_parser.py (+53/-0)
xml/ubuntu_releases.xml (+63/-0)
To merge this branch: bzr merge lp:~uninja/python-snippets/xml-snippets
Reviewer Review Type Date Requested Status
Jono Bacon Pending
Review via email: mp+61688@code.launchpad.net

Description of the change

SAX and DOM based examples of XML parsing

To post a comment you must log in.

Unmerged revisions

100. By Travis Nicholl

Adding XML snippets

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added directory 'xml'
2=== added file 'xml/dom_parser.py'
3--- xml/dom_parser.py 1970-01-01 00:00:00 +0000
4+++ xml/dom_parser.py 2011-05-20 01:55:54 +0000
5@@ -0,0 +1,29 @@
6+#!/usr/bin/env python
7+#
8+# [SNIPPET_NAME: DOM based XML Parser]
9+# [SNIPPET_CATEGORIES: xml]
10+# [SNIPPET_DESCRIPTION: Parsing XML with DOM]
11+# [SNIPPET_AUTHOR: Travis Nicholl <uninja@enigma9.org>]
12+# [SNIPPET_LICENSE: GPL]
13+
14+from xml.dom.minidom import parse
15+
16+def print_releases(doc):
17+ releases = doc.getElementsByTagName('release')
18+ for release in releases:
19+ print_release(release)
20+
21+def print_release(release):
22+ """ Print information about Ubuntu releases"""
23+ print '\nRelease'
24+ attrs = release.attributes
25+ keys = attrs.keys()
26+ keys.sort()
27+ for key in keys:
28+ print '\t%s: %s' % (key, attrs[key].value)
29+
30+ print '\tyear: %s' % release.getElementsByTagName('year')[0].childNodes[0].data
31+ print '\tmonth: %s' % release.getElementsByTagName('month')[0].childNodes[0].data
32+
33+doc = parse('ubuntu_releases.xml')
34+print_releases(doc)
35
36=== added file 'xml/sax_parser.py'
37--- xml/sax_parser.py 1970-01-01 00:00:00 +0000
38+++ xml/sax_parser.py 2011-05-20 01:55:54 +0000
39@@ -0,0 +1,53 @@
40+#!/usr/bin/env python
41+#
42+# [SNIPPET_NAME: SAX based XML Parser]
43+# [SNIPPET_CATEGORIES: xml]
44+# [SNIPPET_DESCRIPTION: Parsing XML with SAX]
45+# [SNIPPET_AUTHOR: Travis Nicholl <uninja@enigma9.org>]
46+# [SNIPPET_LICENSE: GPL]
47+
48+from xml.sax import make_parser, handler
49+
50+class TestHandler(handler.ContentHandler):
51+ """Class that contains callbacks for parsing events"""
52+
53+ def __init__(self):
54+ self.indent_level = 0
55+ self.buffer = ""
56+ self.in_element = False
57+
58+ def startElement(self, name, attrs):
59+ """Called when the start of an element is found"""
60+ print self.indent_level * ' ', name,
61+
62+ if len(attrs) > 0:
63+ print "{",
64+ for key in sorted(attrs.keys()):
65+ print '%s=\'%s\'' % (key, attrs[key]),
66+ print "}"
67+
68+ self.indent_level += 3
69+
70+ if name == 'year' or name == 'month' or name == 'lts':
71+ self.in_element = True
72+ self.buffer = ""
73+ elif name == 'releases':
74+ print
75+
76+ def endElement(self, name):
77+ """Called when the end of an element is found"""
78+ if name == 'year' or name == 'month' or name == 'lts':
79+ print self.buffer
80+ else:
81+ print
82+
83+ self.indent_level -= 3
84+
85+ def characters(self, chars):
86+ """Called when character data is found"""
87+ if self.in_element:
88+ self.buffer += chars
89+
90+parser = make_parser()
91+parser.setContentHandler(TestHandler())
92+parser.parse('ubuntu_releases.xml')
93
94=== added file 'xml/ubuntu_releases.xml'
95--- xml/ubuntu_releases.xml 1970-01-01 00:00:00 +0000
96+++ xml/ubuntu_releases.xml 2011-05-20 01:55:54 +0000
97@@ -0,0 +1,63 @@
98+<?xml version='1.0' encoding='UTF-8'?>
99+<releases>
100+ <release codename='Warty Warthog' lts='False'>
101+ <year>4</year>
102+ <month>10</month>
103+ </release>
104+ <release codename='Hoary Hedgehog' lts='False'>
105+ <year>5</year>
106+ <month>04</month>
107+ </release>
108+ <release codename='Breezy Badger' lts='False'>
109+ <year>5</year>
110+ <month>10</month>
111+ </release>
112+ <release codename='Dapper Drake' lts='True'>
113+ <year>6</year>
114+ <month>06</month>
115+ </release>
116+ <release codename='Edgy Eft' lts='False'>
117+ <year>6</year>
118+ <month>10</month>
119+ </release>
120+ <release codename='Feisty Fawn' lts='False'>
121+ <year>7</year>
122+ <month>04</month>
123+ </release>
124+ <release codename='Gutsy Gibbon' lts='False'>
125+ <year>7</year>
126+ <month>10</month>
127+ </release>
128+ <release codename='Hardy Heron' lts='True'>
129+ <year>8</year>
130+ <month>04</month>
131+ </release>
132+ <release codename='Intrepid Ibex' lts='False'>
133+ <year>8</year>
134+ <month>10</month>
135+ </release>
136+ <release codename='Jaunty Jackalope' lts='False'>
137+ <year>9</year>
138+ <month>04</month>
139+ </release>
140+ <release codename='Karmic Koala' lts='False'>
141+ <year>9</year>
142+ <month>10</month>
143+ </release>
144+ <release codename='Lucid Lynx' lts='True'>
145+ <year>10</year>
146+ <month>04</month>
147+ </release>
148+ <release codename='Maverick Meerkat' lts='False'>
149+ <year>10</year>
150+ <month>10</month>
151+ </release>
152+ <release codename='Natty Narwhal' lts='False'>
153+ <year>11</year>
154+ <month>04</month>
155+ </release>
156+ <release codename='Oneiric Ocelot' lts='False'>
157+ <year>11</year>
158+ <month>10</month>
159+ </release>
160+</releases>

Subscribers

People subscribed via source and target branches