home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / python-support / python-rdflib / rdflib / syntax / serializers / XMLWriter.py < prev   
Encoding:
Python Source  |  2007-04-04  |  2.2 KB  |  73 lines

  1. import codecs
  2. from xml.sax.saxutils import quoteattr, escape
  3.  
  4.  
  5. class XMLWriter(object):
  6.     def __init__(self, stream, namespace_manager, encoding=None, decl=1):
  7.         encoding = encoding or 'utf-8'
  8.         encoder, decoder, stream_reader, stream_writer = codecs.lookup(encoding)
  9.         self.stream = stream = stream_writer(stream)
  10.         if decl:
  11.             stream.write('<?xml version="1.0" encoding="%s"?>' % encoding)
  12.         self.element_stack = []
  13.         self.nm = namespace_manager
  14.         self.closed = True
  15.  
  16.     def __get_indent(self):
  17.         return "  " * len(self.element_stack)
  18.     indent = property(__get_indent)
  19.  
  20.     def __close_start_tag(self):
  21.         if not self.closed: # TODO:
  22.             self.closed = True
  23.             self.stream.write(">")
  24.  
  25.     def push(self, uri):
  26.         nm = self.nm
  27.         self.__close_start_tag()
  28.         write = self.stream.write
  29.         write("\n")
  30.         write(self.indent)
  31.         write("<%s" % nm.qname(uri))
  32.         self.element_stack.append(uri)
  33.         self.closed = False
  34.         self.parent = False
  35.  
  36.     def pop(self, uri=None):
  37.         top = self.element_stack.pop()
  38.         if uri:
  39.             assert uri==top
  40.         write = self.stream.write
  41.         if not self.closed:
  42.             self.closed = True
  43.             write("/>")
  44.         else:
  45.             if self.parent:
  46.                 write("\n")
  47.                 write(self.indent)
  48.             write("</%s>" % self.nm.qname(uri))
  49.         self.parent = True
  50.  
  51.     def namespaces(self, namespaces):
  52.         write = self.stream.write
  53.         write("\n")
  54.         for prefix, namespace in namespaces:
  55.             if prefix:
  56.                 write("  xmlns:%s='%s'\n" % (prefix, namespace))
  57.             else:
  58.                 write("  xmlns='%s'\n" % namespace)
  59.  
  60.     def attribute(self, uri, value):
  61.         write = self.stream.write
  62.         write(" %s=%s" % (self.nm.qname(uri), quoteattr(value)))
  63.  
  64.  
  65.     def text(self, text):
  66.         self.__close_start_tag()
  67.         if "<" in text and ">" in text and not "]]>" in text:
  68.             self.stream.write("<![CDATA[")
  69.             self.stream.write(text)
  70.             self.stream.write("]]>")
  71.         else:
  72.             self.stream.write(escape(text))
  73.