Skip to content

Instantly share code, notes, and snippets.

@ishikawa
Created August 1, 2008 10:15
Show Gist options
  • Select an option

  • Save ishikawa/3611 to your computer and use it in GitHub Desktop.

Select an option

Save ishikawa/3611 to your computer and use it in GitHub Desktop.
# Apple Property List parser for Python
# (via http://effbot.org/zone/element-iterparse.htm)
#
# ``xml.etree.ElementTree`` is fast (and smart looks) for small xml,
# but for large (more than 5MB) xml, SAX implementation is still fast.
def xml_plist_parse(self, xml_input):
import base64, time, datetime
from xml.etree.ElementTree import iterparse
callbacks = {
'array': lambda x: [v.text for v in x],
'dict': lambda x:
dict((x[i].text, x[i+1].text) for i in range(0, len(x), 2)),
'key': lambda x: x.text or "",
'string': lambda x: x.text or "",
'data': lambda x: base64.b64decode(x.text),
'date': lambda x:
datetime.datetime(
*(time.strptime(x.text, "%Y-%m-%dT%H:%M:%SZ")[0:6])),
'real': lambda x: float(x.text),
'integer': lambda x: int(x.text),
'true': lambda x: True,
'false': lambda x: False,
}
parser = iterparse(xml_input)
for action, element in parser:
callback = callbacks.get(element.tag)
if callback:
data = callback(element)
element.clear()
element.text = data
elif element.tag != 'plist':
raise IOError("unknown plist tag: %s" % element.tag)
return parser.root[0].text
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment