Моя модификация ответа Даниила, чтобы дать marginall у аккуратнее словарь:
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
пространства имен является строкой XMLNS, включая скобки, то ElementTree удлинение всех тег, так что здесь я отдал его, как есть одно пространства имен для всего документа
Н.Б., что я отрегулирован сырье XML тоже, так что «пустые» теги будут производить самое большее «» текстового свойства в представлении ElementTree
spacepattern = re.compile(r'\s+')
mydictionary = xml_to_dictionary(ElementTree.XML(spacepattern.sub(' ', content)))
дал бы, например
{'note': {'to': 'Tove',
'from': 'Jani',
'heading': 'Reminder',
'body': "Don't forget me this weekend!"}}
он предназначен для конкретного XML, который в основном эквивалентен JSON, должен обрабатывать атрибуты элементов, таких как
<elementName attributeName='attributeContent'>elementContent</elementName>
слишком
есть возможность объединения словаря атрибут/словарь Subtag аналогично тому, как повтор субтегов объединены, хотя вложенные списки кажутся подходящими :-)
BeautifulSoup преобразует все в нижний регистр. Это действительно отстой. Я должен сохранять случаи тегов и ценностей! – user236215 2010-05-19 21:13:51
Автор BeautifulSoup говорит, что он делает это, потому что это делает HTMLParser. «Если вам нужно сохранить тег тега, попробуйте lxml». – nealmcb 2012-03-21 18:14:35