2 # -*- coding: iso-8859-1 -*-
4 from xml.sax import saxutils
16 # Caracteres a eliminar
19 class ObjFinder(saxutils.DefaultHandler):
25 def startElement(self, name, attrs):
26 #print " #### Start <%s %s>" % (name, dict(attrs))
27 if name == 'dia:object': # Comienzo de una clase
28 if attrs.get('type', None) == 'UML - Class':
31 elif name == 'dia:attribute':
32 name = attrs.get('name', None)
33 if self.estado == E_CLASS: # Datos de la clase
34 if name == 'name': # Nombre de la clase
35 self.curr['name'] = ''
36 self.estado = E_CLASS_NAME
37 elif name == 'comment': # Es la descripción de la clase
38 self.curr['comment'] = ''
39 self.estado = E_CLASS_COMMENT
40 elif name == 'attributes': # Paso empezó a encontrar atributos
41 self.curr['attrs'] = []
43 elif self.estado == E_ATTR: # Datos del atributo
44 if name == 'name': # Nombre del atributo
45 self.curr_attr['name'] = ''
46 self.estado = E_ATTR_NAME
47 elif name == 'type': # Es el tipo del atributo
48 self.curr_attr['type'] = ''
49 self.estado = E_ATTR_TYPE
50 elif name == 'comment': # Es la descripción del atributo
51 self.curr_attr['comment'] = ''
52 self.estado = E_ATTR_COMMENT
53 elif name == 'dia:composite': # Comienzo de attributos de clase
54 if self.estado == E_ATTRS: # Si estoy en una clase
56 self.estado = E_ATTR # Paso a buscar sus atributos
57 def characters(self, data):
58 if self.estado == E_CLASS_NAME:
59 self.curr['name'] += data.strip(STRIPCHARS)
60 elif self.estado == E_CLASS_COMMENT:
61 self.curr['comment'] += data.strip(STRIPCHARS)
62 elif self.estado == E_ATTR_NAME:
63 self.curr_attr['name'] += data.strip(STRIPCHARS)
64 elif self.estado == E_ATTR_TYPE:
65 self.curr_attr['type'] += data.strip(STRIPCHARS)
66 elif self.estado == E_ATTR_COMMENT:
67 self.curr_attr['comment'] += data.strip(STRIPCHARS)
68 def endElement(self, name):
69 #print " #### Endt </%s>" % name
70 if name == 'dia:object':
71 if self.estado == E_CLASS:
72 self.clases.append(self.curr)
75 elif name == 'dia:attribute':
76 if self.estado == E_CLASS_NAME:
78 if self.estado == E_CLASS_COMMENT:
80 if self.estado == E_ATTR_NAME:
82 if self.estado == E_ATTR_TYPE:
84 if self.estado == E_ATTR_COMMENT:
86 if self.estado == E_ATTRS:
88 elif name == 'dia:composite':
89 if self.estado == E_ATTR:
90 self.curr['attrs'].append(self.curr_attr)
95 if __name__ == '__main__':
97 from xml.sax import make_parser
98 from xml.sax.handler import feature_namespaces
100 # Verifica parámetros
101 if len(sys.argv) < 2:
102 print >>sys.stderr, 'Uso:', sys.argv[0], 'archivo.dia'
106 parser = make_parser()
108 # Tell the parser we are not interested in XML namespaces
109 parser.setFeature(feature_namespaces, 0)
114 # Tell the parser to use our handler
115 parser.setContentHandler(dh)
118 parser.parse(sys.argv[1])
120 # Recorro clases obtenidas
123 print 'Clase:', c['name']
124 print 'Descripción:', c['comment']
127 print ' %(name)s (%(type)s): %(comment)s' % a
130 # vim: set et sw=4 sts=4 :