1 | import xml, string, collections |
---|
2 | import xml.dom |
---|
3 | import xml.dom.minidom |
---|
4 | class dreqItemBase(object): |
---|
5 | def __init__(self,dict=None,xmlMiniDom=None,id='defaultId'): |
---|
6 | dictMode = dict != None |
---|
7 | mdMode = xmlMiniDom != None |
---|
8 | assert not( dictMode and mdMode), 'Mode must be either dictionary of minidom: both assigned' |
---|
9 | assert dictMode or mdMode, 'Mode must be either dictionary of minidom: neither assigned' |
---|
10 | self.defaults = {} |
---|
11 | self.globalDefault = '__unset__' |
---|
12 | if dictMode: |
---|
13 | self.dictInit( dict ) |
---|
14 | elif mdMode: |
---|
15 | self.mdInit( xmlMiniDom ) |
---|
16 | |
---|
17 | def dictInit( self, dict ): |
---|
18 | for a in self.attributes: |
---|
19 | if dict.has_key(a): |
---|
20 | self.__dict__[a] = dict[a] |
---|
21 | else: |
---|
22 | self.__dict__[a] = self.defaults.get( a, self.globalDefault ) |
---|
23 | |
---|
24 | def mdInit( self, el ): |
---|
25 | __doc__ = """Initialisation from a mindom XML element. The list of attributes must be set by the class factory before the class is initialised""" |
---|
26 | for a in self.attributes: |
---|
27 | if el.hasAttribute( a ): |
---|
28 | v = el.getAttribute( a ) |
---|
29 | self.__dict__[a] = v |
---|
30 | else: |
---|
31 | self.__dict__[a] = self.defaults.get( a, self.globalDefault ) |
---|
32 | |
---|
33 | class config(object): |
---|
34 | |
---|
35 | def __init__(self): |
---|
36 | self.vdef = 'out/dreqDefn.xml' |
---|
37 | self.vsamp = 'out/vocabSample.xml' |
---|
38 | self.vsamp = '../workbook/trial.xml' |
---|
39 | self.vsamp = '../workbook/trial_20150724.xml' |
---|
40 | self.nts = collections.namedtuple( 'sectdef', ['tag','label','title','id','itemLabelMode'] ) |
---|
41 | self.nti = collections.namedtuple( 'itemdef', ['tag','label','title','type','rClass','techNote'] ) |
---|
42 | self.ntt = collections.namedtuple( 'sect', ['header','attributes'] ) |
---|
43 | |
---|
44 | doc = xml.dom.minidom.parse( self.vdef ) |
---|
45 | self.contentDoc = xml.dom.minidom.parse( self.vsamp ) |
---|
46 | ##<vocab label="institute" title="Institute" id="cmip.drv.001" itemLabelMode="def"> |
---|
47 | ## <itemAttribute label="label"/> |
---|
48 | vl = doc.getElementsByTagName( 'table' ) |
---|
49 | print len(vl) |
---|
50 | self.slist = [] |
---|
51 | self.tables = {} |
---|
52 | tables = {} |
---|
53 | self.tableClasses = {} |
---|
54 | self.tableItems = collections.defaultdict( list ) |
---|
55 | for v in vl: |
---|
56 | t = self.parsevcfg(v) |
---|
57 | tables[t[0].label] = t |
---|
58 | self.tableClasses[t[0].label] = self.itemClassFact( t.header.itemLabelMode, t.attributes.keys() ) |
---|
59 | self.slist.append( t ) |
---|
60 | |
---|
61 | for k in tables.keys(): |
---|
62 | vl = self.contentDoc.getElementsByTagName( k ) |
---|
63 | if len(vl) == 1: |
---|
64 | v = vl[0] |
---|
65 | t = v.getAttribute( 'title' ) |
---|
66 | i = v.getAttribute( 'id' ) |
---|
67 | il = v.getElementsByTagName( 'item' ) |
---|
68 | print k, t, i, len(il) |
---|
69 | self.tables[k] = (i,t,len(il)) |
---|
70 | |
---|
71 | for i in il: |
---|
72 | ii = self.tableClasses[k](xmlMiniDom=i) |
---|
73 | self.tableItems[k].append( ii ) |
---|
74 | elif len(vl) > 1: |
---|
75 | l1 = [] |
---|
76 | l2 = [] |
---|
77 | print '#### %s: %s' % (k,len(vl) ) |
---|
78 | for v in vl: |
---|
79 | t = v.getAttribute( 'title' ) |
---|
80 | i = v.getAttribute( 'id' ) |
---|
81 | il = v.getElementsByTagName( 'item' ) |
---|
82 | print k, t, i, len(il) |
---|
83 | l1.append( (i,t,len(il)) ) |
---|
84 | |
---|
85 | l2i = [] |
---|
86 | for i in il: |
---|
87 | ii = self.tableClasses[k](xmlMiniDom=i) |
---|
88 | l2i.append( ii ) |
---|
89 | l2.append( l2i ) |
---|
90 | self.tables[k] = l1 |
---|
91 | self.tableItems[k] = l2 |
---|
92 | |
---|
93 | def itemClassFact(self,itemLabelMode,attributes): |
---|
94 | class dreqItem(dreqItemBase): |
---|
95 | """Inherits all methods from dreqItemBase""" |
---|
96 | |
---|
97 | dreqItem.itemLabelMode = itemLabelMode |
---|
98 | dreqItem.attributes = attributes |
---|
99 | return dreqItem |
---|
100 | |
---|
101 | def parsevcfg(self,v): |
---|
102 | l = v.getAttribute( 'label' ) |
---|
103 | t = v.getAttribute( 'title' ) |
---|
104 | i = v.getAttribute( 'id' ) |
---|
105 | ilm = v.getAttribute( 'itemLabelMode' ) |
---|
106 | il = v.getElementsByTagName( 'rowAttribute' ) |
---|
107 | vtt = self.nts( v.nodeName, l,t,i,ilm ) |
---|
108 | ll = [] |
---|
109 | idict = {} |
---|
110 | for i in il: |
---|
111 | tt = self.parseicfg(i) |
---|
112 | idict[tt.label] = tt |
---|
113 | ll.append(tt) |
---|
114 | return self.ntt( vtt, idict ) |
---|
115 | |
---|
116 | def parseicfg(self,i): |
---|
117 | l = i.getAttribute( 'label' ) |
---|
118 | if i.hasAttribute( 'title' ): |
---|
119 | t = i.getAttribute( 'title' ) |
---|
120 | self.lastTitle = t |
---|
121 | else: |
---|
122 | t = None |
---|
123 | if i.hasAttribute( 'type' ): |
---|
124 | ty = i.getAttribute( 'type' ) |
---|
125 | else: |
---|
126 | ty = "xs:string" |
---|
127 | if i.hasAttribute( 'class' ): |
---|
128 | cls = i.getAttribute( 'class' ) |
---|
129 | else: |
---|
130 | cls = None |
---|
131 | if i.hasAttribute( 'techNote' ): |
---|
132 | tn = i.getAttribute( 'techNote' ) |
---|
133 | else: |
---|
134 | tn = None |
---|
135 | return self.nti( i.nodeName, l,t,ty,cls,tn ) |
---|
136 | |
---|
137 | c = config() |
---|