Skip to content

Commit f46c13b

Browse files
committed
🐛 Preserve value order in xml to json
1 parent 3d33cae commit f46c13b

File tree

2 files changed

+76
-71
lines changed

2 files changed

+76
-71
lines changed

resources/lib/shortcuts/template.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def get_conditional_value(self, items):
6969
for i in items:
7070
if isinstance(i, str):
7171
return self.get_formatted(i)
72-
if self.parse_condition(i['condition']):
72+
if self.parse_condition(i.get('condition', 'true')):
7373
return self.get_formatted(i['value'])
7474
return ''
7575

resources/lib/shortcuts/xmltojson.py

Lines changed: 75 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def set_itemtext(self, tag, key=None):
5757
self.meta[key or tag] = value
5858
return value
5959

60-
def set_value(self):
60+
def set_value(self, root):
6161
"""
6262
XML:
6363
<value name="N1">
@@ -71,16 +71,52 @@ def set_value(self):
7171
}
7272
}
7373
"""
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
82118

83-
def set_items(self):
119+
def set_items(self, root):
84120
"""
85121
XML:
86122
<items node="N1" mode="M1" item="I1">
@@ -107,32 +143,31 @@ def set_items(self):
107143
]
108144
}
109145
"""
110-
root = next((i for i in self.root.findall('items')), None)
111-
if not root:
112-
return []
146+
items = []
113147

114148
for k, v in root.attrib.items():
115149
self.meta[k] = v
116150

117-
items = []
118151
self.meta['for_each'] = []
119152
for item in root.findall('item'):
120153
meta = {}
121154
self.meta['for_each'].append(meta)
122155
items.append(Meta(item, meta))
123156
return items
124157

125-
def set_lists(self):
158+
def set_lists(self, root):
126159
"""
127160
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>
136171
137172
JSON:
138173
{
@@ -144,7 +179,7 @@ def set_lists(self):
144179
"""
145180
items = []
146181
self.meta['list'] = []
147-
for item in self.root.findall('list'):
182+
for item in root.findall('list'):
148183
meta = {}
149184
pair = [item.attrib['name'], meta]
150185
self.meta['list'].append(pair)
@@ -154,46 +189,16 @@ def set_lists(self):
154189
return []
155190
return items
156191

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>
170192

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():
194194

195+
routes = {
196+
'value': 'set_value',
197+
'items': 'set_items',
198+
'rules': 'set_rules',
199+
'lists': 'set_lists'
200+
}
195201

196-
class XMLtoJSON():
197202
def __init__(self, filecontent):
198203
self.root = ET.fromstring(filecontent)
199204
self.meta = {}
@@ -203,17 +208,17 @@ def get_meta(self):
203208
return self.meta
204209

205210
def get_contents(self, meta):
211+
meta.set_listtext('condition')
206212
meta.set_itemtext('template')
207213
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)
217222

218223

219224
def xml_to_json(filecontent):

0 commit comments

Comments
 (0)