1 #!/usr/bin/env python 2 3 "A list of tuples to XML document converter." 4 5 import libxml2dom 6 from UserDict import UserDict 7 8 class OrderedDict(UserDict): 9 10 "A dictionary with keys in the order in which they were given." 11 12 def __init__(self, *args): 13 UserDict.__init__(self, *args) 14 self._keys = self.data.keys() 15 16 def __setitem__(self, key, value): 17 UserDict.__setitem__(self, key, value) 18 if key not in self._keys: 19 self._keys.append(key) 20 21 def __delitem__(self, key): 22 UserDict.__delitem__(self, key) 23 del self._keys[key] 24 25 def keys(self): 26 return self._keys 27 28 def items(self): 29 l = [] 30 for key in self._keys: 31 l.append((key, self.data[key])) 32 return l 33 34 def values(self): 35 return [value for key, value in self.items()] 36 37 class Converter: 38 def __init__(self, ns=None, prefix="", doc=None, root=None): 39 self.ns = ns 40 self.prefix = prefix 41 if doc is not None: 42 self.doc = doc 43 else: 44 self.doc = libxml2dom.createDocument(ns, prefix+"table", None) 45 if root is not None: 46 self.root = root 47 else: 48 self.root = self.doc.xpath("*")[0] 49 50 def add_rows(self, rows): 51 for row in rows: 52 self.add_row(row) 53 54 def add_row(self, row, index=-1, row_element_name="row", use_key_as_element_name=0): 55 row_element = self.doc.createElementNS(self.ns, self.prefix+row_element_name) 56 if index == -1: 57 self.root.appendChild(row_element) 58 else: 59 self.root.insertBefore(row_element, self.root.xpath("*[%s]" % (index + 1))[0]) 60 61 # Permit dictionaries. 62 63 if hasattr(row, "items"): 64 for name, value in row.items(): 65 if use_key_as_element_name: 66 column_element = self.doc.createElementNS(self.ns, self.prefix+unicode(name)) 67 else: 68 column_element = self.doc.createElementNS(self.ns, self.prefix+"column") 69 column_element.setAttributeNS(self.ns, self.prefix+"name", unicode(name)) 70 row_element.appendChild(column_element) 71 text = self.doc.createTextNode(unicode(value)) 72 column_element.appendChild(text) 73 74 # As well as sequences. 75 76 else: 77 for column in row: 78 column_element = self.doc.createElementNS(self.ns, self.prefix+"column") 79 row_element.appendChild(column_element) 80 text = self.doc.createTextNode(unicode(column)) 81 column_element.appendChild(text) 82 83 if __name__ == "__main__": 84 from rdflib.TripleStore import TripleStore 85 import sys 86 s = TripleStore() 87 s.load(sys.argv[1]) 88 converter = Converter() 89 converter.add_rows(s.triples((None, None, None))) 90 libxml2dom.toStream(converter.doc, sys.stdout) 91 92 # vim: tabstop=4 expandtab shiftwidth=4