Eu tenho um programa que lê um documento xml de um soquete. Eu tenho o documento xml armazenado em uma string que eu gostaria de converter diretamente em um dicionário Python, da mesma forma que é feito na simplejson
biblioteca do Django .
Tome como exemplo:
str ="<?xml version="1.0" ?><person><name>john</name><age>20</age></person"
dic_xml = convert_to_dic(str)
Então dic_xml
pareceria{'person' : { 'name' : 'john', 'age' : 20 } }
python
xml
json
dictionary
xml-deserialization
user361526
fonte
fonte
Respostas:
Este é um ótimo módulo que alguém criou. Eu usei várias vezes. http://code.activestate.com/recipes/410469-xml-as-dictionary/
Aqui está o código do site, caso o link não funcione.
Exemplo de uso:
// Ou, se você deseja usar uma string XML:
fonte
xmltodict
biblioteca). A desvantagem é que você deve hospedá-lo no seu projeto.cElementTree
, basta alterar primeira linha para:from xml.etree import cElementTree as ElementTree
O xmltodict (divulgação completa: escrevi) faz exatamente isso:
fonte
O seguinte trecho XML-para-Python-dict analisa entidades e atributos após esta "especificação" de XML para JSON . É a solução mais geral que lida com todos os casos de XML.
É usado:
A saída deste exemplo (conforme a "especificação" vinculada acima) deve ser:
Não necessariamente bonito, mas é inequívoco, e entradas XML mais simples resultam em JSON mais simples. :)
Atualizar
Se você deseja fazer o inverso , emita uma sequência XML de um JSON / dict , você pode usar:
fonte
d = {t.tag: {k:v[0] if len(v) == 1 else v for k, v in dd.iteritems()}}
parad = { t.tag: dict( (k, v[0] if len(v) == 1 else v) for k, v in dd.iteritems() ) }
cElementTree
oulxml.etree
. Observe que, ao usar o Python 3, todos.iteritems()
devem ser alterados para.items()
(mesmo comportamento, mas a palavra-chave foi alterada de Python 2 para 3).Esta versão leve, embora não seja configurável, é muito fácil de adaptar, conforme necessário, e funciona em pítons antigos. Também é rígido - o que significa que os resultados são os mesmos, independentemente da existência de atributos.
Assim:
Resulta em:
fonte
As versões mais recentes das bibliotecas PicklingTools (1.3.0 e 1.3.1) suportam ferramentas para a conversão de XML em um ditado Python.
O download está disponível aqui: PicklingTools 1.3.1
Há bastante documentação para os conversores aqui : a documentação descreve em detalhes todas as decisões e problemas que surgirão ao converter entre dicionários XML e Python (há vários casos extremos: atributos, listas, listas anônimas, anônimas dict, eval etc. que a maioria dos conversores não suporta). Em geral, porém, os conversores são fáceis de usar. Se um 'exemplo.xml' contiver:
Em seguida, para convertê-lo em um dicionário:
Existem ferramentas para converter tanto em C ++ quanto em Python: o C ++ e o Python fazem conversão idêntica, mas o C ++ é cerca de 60x mais rápido
fonte
Você pode fazer isso facilmente com o lxml. Primeiro instale-o:
Aqui está uma função recursiva que escrevi que faz o trabalho pesado para você:
A variante abaixo preserva a chave / elemento pai:
Se você deseja retornar apenas uma subárvore e convertê-la em dict, use Element.find () para obter a subárvore e depois convertê-la:
Veja os documentos do lxml aqui . Eu espero que isso ajude!
fonte
Isenção de responsabilidade: este analisador XML modificado foi inspirado em Adam Clark. O analisador XML original funciona na maioria dos casos simples. No entanto, não funcionou para alguns arquivos XML complicados. Eu depurei o código linha por linha e finalmente resolvi alguns problemas. Se você encontrar alguns erros, entre em contato. Fico feliz em corrigi-lo.
fonte
fonte
O analisador XML mais fácil de usar para Python é o ElementTree (a partir de 2.5x e acima, está na biblioteca padrão xml.etree.ElementTree). Eu não acho que exista algo que faça exatamente o que você deseja fora da caixa. Seria bastante trivial escrever algo para fazer o que você deseja usando o ElementTree, mas por que converter em um dicionário e por que não usar diretamente o ElementTree?
fonte
O código de http://code.activestate.com/recipes/410469-xml-as-dictionary/ funciona bem, mas se houver vários elementos iguais em um determinado local da hierarquia, apenas os substituirá.
Eu adicionei um calço entre eles para ver se o elemento já existe antes de self.update (). Nesse caso, aparece a entrada existente e cria uma lista a partir da existente e da nova. Quaisquer duplicatas subsequentes são adicionadas à lista.
Não tenho certeza se isso pode ser tratado com mais facilidade, mas funciona:
fonte
Do @ K3 --- resposta rnc (o melhor para mim), adicionamos pequenas modificações para obter um OrderedDict a partir de um texto XML (algumas vezes o pedido é importante):
Seguindo o exemplo @ K3 --- rnc, você pode usá-lo:
Espero que ajude ;)
fonte
Aqui está um link para uma solução ActiveState - e o código, caso ela desapareça novamente.
fonte
Em um ponto, tive que analisar e escrever XML que consistia apenas em elementos sem atributos, para que um mapeamento 1: 1 de XML para ditar fosse possível facilmente. Isso é o que eu vim no caso de alguém também não precisar de atributos:
fonte
@dibrovsd: A solução não funcionará se o xml tiver mais de uma tag com o mesmo nome
Na sua linha de pensamento, modifiquei um pouco o código e o escrevi para o nó geral, em vez de raiz:
fonte
Modifiquei uma das respostas ao meu gosto e para trabalhar com vários valores com a mesma tag, por exemplo, considere o seguinte código xml salvo no arquivo XML.xml
e em python
a saída é
fonte
Eu tenho um método recursivo para obter um dicionário de um elemento lxml
fonte