Ma modification de la réponse de Daniel, pour donner un marginall y plus propre dictionnaire:
def xml_to_dictionary(element):
l = len(namespace)
dictionary={}
tag = element.tag[l:]
if element.text:
if (element.text == ' '):
dictionary[tag] = {}
else:
dictionary[tag] = element.text
children = element.getchildren()
if children:
subdictionary = {}
for child in children:
for k,v in xml_to_dictionary(child).items():
if k in subdictionary:
if (isinstance(subdictionary[k], list)):
subdictionary[k].append(v)
else:
subdictionary[k] = [subdictionary[k], v]
else:
subdictionary[k] = v
if (dictionary[tag] == {}):
dictionary[tag] = subdictionary
else:
dictionary[tag] = [dictionary[tag], subdictionary]
if element.attrib:
attribs = {}
for k,v in element.attrib.items():
attribs[k] = v
if (dictionary[tag] == {}):
dictionary[tag] = attribs
else:
dictionary[tag] = [dictionary[tag], attribs]
return dictionary
espace de noms
est la chaîne xmlns, y compris des accolades, qui elementtree précèder à tous les tags, alors voici j'ai effacé comme il y a un espace de noms pour le document entier
NB que je ajusté les données XML brutes aussi, de sorte que les étiquettes « vides » produirait au plus un « » propriété de texte dans la représentation elementTree
spacepattern = re.compile(r'\s+')
mydictionary = xml_to_dictionary(ElementTree.XML(spacepattern.sub(' ', content)))
donnerait par exemple
{'note': {'to': 'Tove',
'from': 'Jani',
'heading': 'Reminder',
'body': "Don't forget me this weekend!"}}
il est conçu pour XML spécifique qui est essentiellement équivalente à JSON, doit gérer attributs d'éléments tels que
<elementName attributeName='attributeContent'>elementContent</elementName>
trop
il y a la possibilité de fusionner le dictionnaire dictionnaire d'attributs/sous-élément de façon similaire à la façon dont répéter subtags sont fusionnés, bien que l'imbrication des listes semble plutôt appropriée :-)
BeautifulSoup convertit tout en minuscules. C'est vraiment nul. Je dois préserver les cas d'étiquettes et de valeurs! – user236215
L'auteur de BeautifulSoup dit qu'il fait cela parce que HTMLParser le fait. "Si vous devez conserver le cas de tag, essayez lxml". – nealmcb