@@ -57,7 +57,7 @@ def set_itemtext(self, tag, key=None):
57
57
self .meta [key or tag ] = value
58
58
return value
59
59
60
- def set_value (self ):
60
+ def set_value (self , root ):
61
61
"""
62
62
XML:
63
63
<value name="N1">
@@ -71,16 +71,52 @@ def set_value(self):
71
71
}
72
72
}
73
73
"""
74
- values = []
75
- for root in self .root .findall ('value' ):
76
- name = root .attrib ['name' ] if 'name' in root .attrib else 'value'
77
- if not list (root ):
78
- self .meta [name ] = root .text
79
- continue
80
- values .append (Meta (root , self .meta .setdefault (name , {})))
81
- return values
74
+ items = []
75
+ name = root .attrib ['name' ] if 'name' in root .attrib else 'value'
76
+ if not list (root ):
77
+ self .meta [name ] = root .text
78
+ return items
79
+ items .append (Meta (root , self .meta .setdefault (name , {})))
80
+ return items
81
+
82
+ def set_rules (self , root ):
83
+ """
84
+ XML:
85
+ <rules name="N1">
86
+ <rule>
87
+ <condition>C1</condition>
88
+ <value>V1</value>
89
+ </rule>
90
+ <rule>
91
+ <condition>C2</condition>
92
+ <value>V2</value>
93
+ </rule>
94
+ </rules>
95
+
96
+ JSON:
97
+ {
98
+ "N1": [
99
+ {
100
+ "condition": "C1",
101
+ "value": "V1"
102
+ },
103
+ {
104
+ "condition": "C2",
105
+ "value": "V2"
106
+ }
107
+ ]
108
+ }
109
+ """
110
+ items = []
111
+ name = root .attrib ['name' ]
112
+ self .meta [name ] = []
113
+ for item in root .findall ('rule' ):
114
+ meta = {}
115
+ self .meta [name ].append (meta )
116
+ items .append (Meta (item , meta ))
117
+ return items
82
118
83
- def set_items (self ):
119
+ def set_items (self , root ):
84
120
"""
85
121
XML:
86
122
<items node="N1" mode="M1" item="I1">
@@ -107,32 +143,31 @@ def set_items(self):
107
143
]
108
144
}
109
145
"""
110
- root = next ((i for i in self .root .findall ('items' )), None )
111
- if not root :
112
- return []
146
+ items = []
113
147
114
148
for k , v in root .attrib .items ():
115
149
self .meta [k ] = v
116
150
117
- items = []
118
151
self .meta ['for_each' ] = []
119
152
for item in root .findall ('item' ):
120
153
meta = {}
121
154
self .meta ['for_each' ].append (meta )
122
155
items .append (Meta (item , meta ))
123
156
return items
124
157
125
- def set_lists (self ):
158
+ def set_lists (self , root ):
126
159
"""
127
160
XML:
128
- <list name="N1">
129
- <value name="K1">V1</value>
130
- <value name="K2">V2</value>
131
- </list>
132
- <list name="N2">
133
- <value name="K3">V3</value>
134
- <value name="K4">V4</value>
135
- </list>
161
+ <lists>
162
+ <list name="N1">
163
+ <value name="K1">V1</value>
164
+ <value name="K2">V2</value>
165
+ </list>
166
+ <list name="N2">
167
+ <value name="K3">V3</value>
168
+ <value name="K4">V4</value>
169
+ </list>
170
+ </lists>
136
171
137
172
JSON:
138
173
{
@@ -144,7 +179,7 @@ def set_lists(self):
144
179
"""
145
180
items = []
146
181
self .meta ['list' ] = []
147
- for item in self . root .findall ('list' ):
182
+ for item in root .findall ('list' ):
148
183
meta = {}
149
184
pair = [item .attrib ['name' ], meta ]
150
185
self .meta ['list' ].append (pair )
@@ -154,46 +189,16 @@ def set_lists(self):
154
189
return []
155
190
return items
156
191
157
- def set_rules (self ):
158
- """
159
- XML:
160
- <variable name="N1">
161
- <rule>
162
- <condition>C1</condition>
163
- <value>V1</value>
164
- </rule>
165
- <rule>
166
- <condition>C2</condition>
167
- <value>V2</value>
168
- </rule>
169
- </variable>
170
192
171
- JSON:
172
- {
173
- "N1": [
174
- {
175
- "condition": "C1",
176
- "value": "V1"
177
- },
178
- {
179
- "condition": "C2",
180
- "value": "V2"
181
- }
182
- ]
183
- }
184
- """
185
- items = []
186
- for root in self .root .findall ('variable' ):
187
- name = root .attrib ['name' ]
188
- self .meta [name ] = []
189
- for item in root .findall ('rule' ):
190
- meta = {}
191
- self .meta [name ].append (meta )
192
- items .append (Meta (item , meta ))
193
- return items
193
+ class XMLtoJSON ():
194
194
195
+ routes = {
196
+ 'value' : 'set_value' ,
197
+ 'items' : 'set_items' ,
198
+ 'rules' : 'set_rules' ,
199
+ 'lists' : 'set_lists'
200
+ }
195
201
196
- class XMLtoJSON ():
197
202
def __init__ (self , filecontent ):
198
203
self .root = ET .fromstring (filecontent )
199
204
self .meta = {}
@@ -203,17 +208,17 @@ def get_meta(self):
203
208
return self .meta
204
209
205
210
def get_contents (self , meta ):
211
+ meta .set_listtext ('condition' )
206
212
meta .set_itemtext ('template' )
207
213
meta .set_listtext ('datafile' )
208
- meta .set_listtext ('condition' )
209
- for i in meta .set_rules ():
210
- self .get_contents (i )
211
- for i in meta .set_value ():
212
- self .get_contents (i )
213
- for i in meta .set_lists ():
214
- self .get_contents (i )
215
- for i in meta .set_items ():
216
- self .get_contents (i )
214
+
215
+ for i in meta .root :
216
+ func = self .routes .get (i .tag )
217
+ if not func :
218
+ continue
219
+ func = getattr (meta , func )
220
+ for j in func (i ):
221
+ self .get_contents (j )
217
222
218
223
219
224
def xml_to_json (filecontent ):
0 commit comments