Created
August 1, 2008 10:15
-
-
Save ishikawa/3611 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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