|
@@ -0,0 +1,44 @@
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+
|
|
|
+import dateutil.parser
|
|
|
+import xml.etree.ElementTree
|
|
|
+
|
|
|
+
|
|
|
+class XmlDict:
|
|
|
+
|
|
|
+ def __init__(self, node):
|
|
|
+ assert isinstance(node, xml.etree.ElementTree.Element), node
|
|
|
+ assert node.tag == 'dict', node.tag
|
|
|
+ self._node = node
|
|
|
+
|
|
|
+ def _get_value_node(self, key):
|
|
|
+ # WORKAROUND method getnext() is sadly not available
|
|
|
+ for child_idx, child_node in enumerate(self._node):
|
|
|
+ if child_node.tag == 'key' and child_node.text == key:
|
|
|
+ return self._node[child_idx + 1]
|
|
|
+ raise KeyError(key)
|
|
|
+
|
|
|
+ def __getitem__(self, key):
|
|
|
+ value_node = self._get_value_node(key)
|
|
|
+ if value_node.tag == 'string':
|
|
|
+ return value_node.text
|
|
|
+ elif value_node.tag == 'integer':
|
|
|
+ return int(value_node.text)
|
|
|
+ elif value_node.tag == 'date':
|
|
|
+ return dateutil.parser.parse(value_node.text)
|
|
|
+ else:
|
|
|
+ return value_node
|
|
|
+
|
|
|
+
|
|
|
+class XmlLibrary:
|
|
|
+
|
|
|
+ def __init__(self, path):
|
|
|
+ self._tree = xml.etree.ElementTree.parse(path)
|
|
|
+ self._root_dict = XmlDict(self._tree.find('./dict'))
|
|
|
+ self._id = self._root_dict['Library Persistent ID']
|
|
|
+ assert isinstance(self._id, str), self._id
|
|
|
+ assert len(self._id) > 4
|
|
|
+
|
|
|
+ @property
|
|
|
+ def id(self):
|
|
|
+ return self._id
|