Eu já vi uma parte justa do código XML-> JSON desagradável na web e, depois de interagir um pouco com os usuários do Stack, estou convencido de que essa multidão pode ajudar mais do que as primeiras páginas dos resultados do Google.
Portanto, estamos analisando um feed de previsão do tempo e precisamos preencher widgets climáticos em vários sites. Estamos analisando agora as soluções baseadas em Python.
Este feed RSS público do weather.com é um bom exemplo do que estaríamos analisando ( nosso feed real do weather.com contém informações adicionais devido a uma parceria com eles ).
Em poucas palavras, como devemos converter XML para JSON usando Python?
O xmltodict (divulgação completa: escrevi) pode ajudá-lo a converter seu XML em uma estrutura dict + list + string, seguindo este "padrão" . É Expat baseado em , portanto, é muito rápido e não precisa carregar toda a árvore XML na memória.
Depois de ter essa estrutura de dados, você pode serializá-la para JSON:
fonte
bs4
pode fazer o trabalho de xml para dict é extremamente fácil de usar a bibliotecaVocê pode usar a biblioteca xmljson para converter usando diferentes convenções XML JSON .
Por exemplo, este XML:
traduz através da convenção BadgerFish para isso:
e através da convenção GData para isso (atributos não são suportados):
... e através da convenção da Parker para isso (atributos não são suportados):
É possível converter de XML para JSON e de JSON para XML usando as mesmas convenções:
Divulgação: escrevi esta biblioteca. Espero que ajude os futuros pesquisadores.
fonte
Se algum tempo você obtiver apenas o código de resposta em vez de todos os dados, ocorrerá um erro como o json parse , portanto você precisará convertê-lo como texto
fonte
Aqui está o código que eu criei para isso. Não há análise do conteúdo, apenas conversão simples.
fonte
Existe um método para transportar a marcação baseada em XML como JSON, que permite que ela seja convertida sem perdas de volta à sua forma original. Veja http://jsonml.org/ .
É um tipo de XSLT de JSON. Espero que você ache isso útil
fonte
Para qualquer um que ainda precise disso. Aqui está um código simples e mais recente para fazer essa conversão.
fonte
Você pode dar uma olhada em http://designtheory.org/library/extrep/designdb-1.0.pdf . Este projeto começa com uma conversão XML para JSON de uma grande biblioteca de arquivos XML. Houve muita pesquisa realizada na conversão, e o mapeamento XML -> JSON intuitivo mais simples foi produzido (descrito no início do documento). Em resumo, converta tudo em um objeto JSON e coloque blocos repetidos como uma lista de objetos.
objetos que significam pares de chave / valor (dicionário em Python, mapa de hash em Java, objeto em JavaScript)
Não há mapeamento de volta para XML para obter um documento idêntico; o motivo é que não se sabe se um par de chave / valor era um atributo ou um
<key>value</key>
; portanto, essas informações são perdidas.Se você me perguntar, os atributos são um truque para começar; então, novamente, eles funcionaram bem para HTML.
fonte
Bem, provavelmente a maneira mais simples é apenas analisar o XML em dicionários e serializá-lo com o simplejson.
fonte
Eu sugiro não optar por uma conversão direta. Converta XML em um objeto e, em seguida, do objeto em JSON.
Na minha opinião, isso fornece uma definição mais clara de como o XML e o JSON correspondem.
Leva tempo para acertar e você pode até escrever ferramentas para ajudá-lo a gerar parte disso, mas seria mais ou menos assim:
fonte
Eu encontrei para snips XML simples, o uso de expressão regular salvaria problemas. Por exemplo:
Para fazer isso através da análise de XML, como disse @Dan, não existe uma solução completa porque os dados são diferentes. Minha sugestão é usar o lxml. Embora não tenha concluído o json, o lxml.objectify fornece bons resultados silenciosos:
fonte
Enquanto as bibliotecas internas para análise de XML são muito boas, sou parcial com o lxml .
Mas, para analisar feeds RSS, recomendo o Universal Feed Parser , que também pode analisar o Atom. Sua principal vantagem é que ele pode digerir até a maioria dos alimentos malformados.
O Python 2.6 já inclui um analisador JSON, mas uma versão mais recente com velocidade aprimorada está disponível como simplejson .
Com essas ferramentas, o aplicativo não deve ser tão difícil.
fonte
Minha resposta aborda o caso específico (e um tanto comum) em que você realmente não precisa converter o xml inteiro em json, mas o que você precisa é atravessar / acessar partes específicas do xml, e você precisa ser rápido , e simples (usando operações do tipo json / dict).
Abordagem
Para isso, é importante observar que a análise de um xml para etree usando
lxml
é super rápida. A parte lenta na maioria das outras respostas é a segunda passagem: atravessando a estrutura etree (geralmente em python-land), convertendo-a em json.O que me leva à abordagem que achei melhor para este caso: analisar o xml usando
lxml
e, em seguida, agrupar os nós etree (preguiçosamente), fornecendo a eles uma interface semelhante a um ditado.Código
Aqui está o código:
Essa implementação não está completa, por exemplo, não oferece suporte a casos em que um elemento possui texto e atributos, ou texto e filhos (apenas porque eu não precisei quando o escrevi ...) para melhorá-lo, no entanto.
Rapidez
No meu caso de uso específico, onde eu precisava processar apenas elementos específicos do xml, essa abordagem deu uma surpreendente e aceleração impressionante por um fator de 70 (!) Em relação ao uso do @ Martin Blech xmltodict e depois atravessando o dict diretamente.
Bônus
Como bônus, como nossa estrutura já é semelhante a um ditado, obtemos outra implementação alternativa de
xml2json
graça. Só precisamos passar nossa estrutura semelhante a um ditado parajson.dumps
. Algo como:Se o seu xml incluir atributos, você precisará usar alguns caracteres alfanuméricos
attr_prefix
(por exemplo, "ATTR_"), para garantir que as chaves sejam chaves json válidas.Eu não comparei essa parte.
fonte
json.dumps(tree)
ele diz Objeto do tipo 'ETreeDictWrapper' não é JSON serializadoQuando faço qualquer coisa com XML em python, quase sempre uso o pacote lxml. Eu suspeito que a maioria das pessoas usa lxml. Você pode usar xmltodict, mas terá que pagar a penalidade de analisar o XML novamente.
Para converter XML para json com lxml, você:
Eu uso a seguinte classe em meus projetos. Use o método toJson.
A saída do main embutido é:
O que é uma transformação desse xml:
fonte
jsonpickle ou se você estiver usando o feedparser, tente feed_parser_to_json.py
fonte
Esse material aqui é mantido ativamente e até agora é o meu favorito: xml2json in python
fonte
confira lxml2json (divulgação: eu escrevi)
https://github.com/rparelius/lxml2json
é muito rápido, leve (requer apenas lxml) e uma vantagem é que você tem controle sobre a conversão de determinados elementos em listas ou dictos
fonte
Você pode usar declxml. Possui recursos avançados, como vários atributos e suporte aninhado complexo. Você só precisa escrever um processador simples para isso. Também com o mesmo código, você pode converter novamente em JSON. É bastante simples e a documentação é impressionante.
Link: https://declxml.readthedocs.io/en/latest/index.html
fonte
Prepare dados em Python : Para criar JSON primeiro, você precisa preparar os dados no python. Podemos usar Lista e Dicionário em Python para preparar os dados.
Lista Python <==> Matriz JSON
Dicionário Python <==> Objeto JSON (formato do valor da chave) Verifique isso para obter mais detalhes
https://devstudioonline.com/article/create-json-and-xml-in-python
fonte
Para representar dados no formato JSON
Em json , representamos os dados no formato de chave e valor
Para representar dados no formato XML
fonte