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 # Remember the last row element. 51 52 self.last_row_element = None 53 54 def add_rows(self, rows): 55 for row in rows: 56 self.add_row(row) 57 58 def add_row(self, row, index=-1, row_element_name="row", use_key_as_element_name=0): 59 self.last_row_element = self.doc.createElementNS(self.ns, self.prefix+row_element_name) 60 if index == -1: 61 self.root.appendChild(self.last_row_element) 62 else: 63 self.root.insertBefore(self.last_row_element, self.root.xpath("*[%s]" % (index + 1))[0]) 64 65 # Permit dictionaries. 66 67 if hasattr(row, "items"): 68 for name, value in row.items(): 69 if use_key_as_element_name: 70 column_element = self.doc.createElementNS(self.ns, self.prefix+unicode(name)) 71 else: 72 column_element = self.doc.createElementNS(self.ns, self.prefix+"column") 73 column_element.setAttributeNS(self.ns, self.prefix+"name", unicode(name)) 74 self.last_row_element.appendChild(column_element) 75 text = self.doc.createTextNode(unicode(value)) 76 column_element.appendChild(text) 77 78 # As well as sequences. 79 80 else: 81 for column in row: 82 column_element = self.doc.createElementNS(self.ns, self.prefix+"column") 83 self.last_row_element.appendChild(column_element) 84 text = self.doc.createTextNode(unicode(column)) 85 column_element.appendChild(text) 86 87 def last_row(self): 88 if self.last_row_element is not None: 89 return Converter(self.ns, self.prefix, self.doc, self.last_row_element) 90 else: 91 return None 92 93 if __name__ == "__main__": 94 from rdflib.TripleStore import TripleStore 95 import sys 96 s = TripleStore() 97 s.load(sys.argv[1]) 98 converter = Converter() 99 converter.add_rows(s.triples((None, None, None))) 100 libxml2dom.toStream(converter.doc, sys.stdout) 101 102 # vim: tabstop=4 expandtab shiftwidth=4