Given XML file snippet is:
<?xml version="1.0" standalone="yes"?>
<event_configuration family="21" version="2">
<pqr subtype="abc">
<event val="73002" name="$MyCpu"> </event>
<event val="73003" name="$MyCpuKernel"> </event>
<metric name="Ratio" expression="$MyCpuKernel / $MyCpu"> </metric>
</pqr>
</event_configuration>
I have parsed this xml file using "ElementTree" library in Python, please find the code below:
def parse_xml_to_json(self):
data = {'metric': []}
root = ET.fromstring(self.xml_file)
for element in root.findall('.//*'):
element_type = element.tag
if element_type not in ["pqr", "stu", "vwx"]:
continue
subtype_name = element.attrib['subtype']
event_map = {}
for event in element.findall('.//event'):
event_name = event.attrib['name']
val_value = event.attrib['val']
event_map[event_name] = val_value
for metric in element.findall('metric'):
expression = metric.attrib['expression']
metric_name = metric.attrib['name']
for event_name, val_value in event_map.items():
expression = expression.replace(event_name, val_value)
data['metric'].append({
'Name': metric_name,
'Expression': expression,
'Type': element_type
})
return data
I am getting the output, but this code is unable to replace the event name present inside "Expression" with the val_value as shown below:-
Output:
{
"metric": [
{
"Name": "Ratio",
"Expression": "73002Kernel / 73002",
"Type": "pqr"
},
....
....
]
}
Here, we can see in the "Expression" it should print "73003 / 73002".
I am unable to think of how to solve this issue. Is it possible to use regex here, how to apply it? Please suggest.
2
Answers
You can change the XML and create than your JSON. The XML attribute values can be
.get()
and.set()
For the expression attribute you can use anf-string
with the values:Suggested solution in your code:
Output:
Here is an example how you can use
re.sub
to replace the values in expression:Prints: