https://lxml.de/xpathxslt.html
https://www.w3schools.com/xml/xpath_syntax.asp
Read a file with xml, convert it to a string from bytes:
pip install lxml
from lxml import etree as et

def pack_xml(xmlfile):
msg = {}
count = 1
with open(xmlfile) as r:
xml = r.read()
print(type(xml))
parser = et.XMLParser(recover=True)
# params
# https://lxml.de/api/lxml.etree.XMLParser-class.html
root = et.fromstring(bytes(xml, encoding="utf-8"), parser)
# tree = et.tostring(root) # byte
tree = et.tostring(root).decode("utf-8")# str
print(len(tree))
msg = {"msg1":tree}
with open("rv.xml", "w") as w:
w.write(tree)
print(msg)
Make dictionary (duplicate keys, get atr)


result:

Code:
def xml_to_dict(xmlfile):
msg = {}
count = 1
with open(xmlfile) as r:
xml = r.read()
print(type(xml))
parser = et.XMLParser(recover=True, collect_ids=True)
root = et.fromstring(bytes(xml, encoding="utf-8"), parser)
x = root.xpath("//*")# get all
#x = root.xpath("//*[@id]")# get all
for y in x:
key = et.QName(y).localname
value = y.text
i = y.attrib.get("id")
if i is not None:
print(i)
if key in msg:
key = key + str(count)
count += 1
tmp = {key:value}
msg.update(tmp)
for k, v in msg.items():
print(k, ":", v)