Qual é a melhor maneira (ou são as várias) de imprimir bastante XML em Python?
python
xml
pretty-print
Hortitude
fonte
fonte
O lxml é recente, atualizado e inclui uma bonita função de impressão
Confira o tutorial do lxml: http://lxml.de/tutorial.html
fonte
aptitude install
fora. No OS / X, não tenho certeza.print(etree.tostring(x, pretty_print=True, encoding="unicode"))
. A gravação em um arquivo de saída é possível em apenas uma linha, não sendo necessária nenhuma variável intermediária:etree.parse("filename").write("outputfile", encoding="utf-8")
Outra solução é pegar emprestada essa
indent
função , para uso com a biblioteca ElementTree incorporada ao Python desde a versão 2.5. Aqui está o que isso seria:fonte
tree.write([filename])
escrever para o arquivo (tree
sendo a instância do ElementTree).tree = ElementTree.parse('file) ; root = tree.getroot() ; indent(root); tree.write('Out.xml');
Aqui está minha solução (hacky?) Para solucionar o problema feio do nó de texto.
O código acima produzirá:
Em vez disso:
Isenção de responsabilidade: Provavelmente existem algumas limitações.
fonte
re.compile
antes dasub
operação (eu estava usandore.findall()
duas vezes,zip
e umfor
laço comstr.replace()
...)Como outros apontaram, o lxml possui uma bonita impressora embutida.
Esteja ciente de que, por padrão, ele altera as seções CDATA para texto normal, o que pode ter resultados desagradáveis.
Aqui está uma função Python que preserva o arquivo de entrada e altera apenas o recuo (observe o
strip_cdata=False
). Além disso, garante que a saída use UTF-8 como codificação em vez do ASCII padrão (observe oencoding='utf-8'
):Exemplo de uso:
fonte
BeautifulSoup tem um
prettify()
método fácil de usar .Recua um espaço por nível de recuo. Funciona muito melhor que o pretty_print do lxml e é curto e agradável.
fonte
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: xml. Do you need to install a parser library?
Se você tiver,
xmllint
pode gerar um subprocesso e usá-lo.xmllint --format <file>
imprime bastante seu XML de entrada na saída padrão.Observe que esse método usa um programa externo ao python, o que o torna uma espécie de hack.
fonte
Tentei editar a resposta de "ade" acima, mas o Stack Overflow não me permitiu editar depois que eu havia inicialmente fornecido o feedback anonimamente. Esta é uma versão menos complicada da função para imprimir um ElementTree com bastante facilidade.
fonte
Se você estiver usando uma implementação DOM, cada um terá sua própria forma de impressão bonita embutida:
Se você estiver usando outra coisa sem a sua própria impressora bonita - ou essas impressoras bonitas não fizerem exatamente da maneira que você deseja - você provavelmente terá que escrever ou subclassificar seu próprio serializador.
fonte
Eu tive alguns problemas com as bonitas impressões do minidom. Eu recebia um UnicodeError sempre que tentava imprimir um documento com caracteres fora da codificação especificada, por exemplo, se eu tivesse um β em um documento e tentasse
doc.toprettyxml(encoding='latin-1')
. Aqui está minha solução alternativa para isso:fonte
Ele não adicionará espaços ou novas linhas dentro de nós de texto, a menos que você solicite com:
Você pode especificar como deve ser a unidade de indentação e como deve ser a nova linha.
O documento está na página inicial http://www.yattag.org .
fonte
Eu escrevi uma solução para percorrer um ElementTree existente e usar texto / cauda para identá-lo como normalmente se espera.
fonte
A impressão bonita de XML para python parece muito boa para esta tarefa. (Também chamado apropriadamente.)
Uma alternativa é usar pyXML , que possui uma função PrettyPrint .
fonte
HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/xmlpp/
Pense que o projeto está no sótão hoje em dia, que vergonha.Você pode usar a biblioteca externa popular xmltodict , com
unparse
epretty=True
obterá o melhor resultado:full_document=False
contra<?xml version="1.0" encoding="UTF-8"?>
no topo.fonte
Aqui está uma solução Python3 que elimina o feio problema de nova linha (toneladas de espaço em branco) e usa apenas bibliotecas padrão, diferente da maioria das outras implementações.
Eu descobri como corrigir o problema comum de nova linha aqui .
fonte
Dê uma olhada no módulo vkbeautify .
É uma versão python do meu popular plugin javascript / nodejs com o mesmo nome. Pode imprimir / reduzir bastante o texto XML, JSON e CSS. Entrada e saída podem ser string / arquivo em qualquer combinação. É muito compacto e não tem nenhuma dependência.
Exemplos :
fonte
Uma alternativa, se você não quiser revisar novamente , existe a biblioteca xmlpp.py com a
get_pprint()
função Funcionou bem e sem problemas nos meus casos de uso, sem ter que revisar novamente para um objeto lxml ElementTree.fonte
Você pode tentar esta variação ...
Instale
BeautifulSoup
e aslxml
bibliotecas de back-end (analisador):Processe seu documento XML:
fonte
'lxml'
usa o analisador HTML do lxml - consulte os documentos do BS4 . Você precisa'xml'
ou'lxml-xml'
para o analisador XML.lxml’s XML parser BeautifulSoup(markup, "lxml-xml") BeautifulSoup(markup, "xml")
lxml-xml
) e, em seguida, passou a votar no mesmo dia. Enviei uma reclamação oficial à S / O, mas eles se recusaram a investigar. De qualquer forma, desde então "adulterei" minha resposta, que agora está correta novamente (e especificalxml-xml
como originalmente). Obrigado.Eu tive esse problema e resolvi-o assim:
No meu código, esse método é chamado assim:
Isso funciona apenas porque etree, por padrão, usa
two spaces
indentação, o que não acho muito enfatizar a indentação e, portanto, não é bonito. Não consegui identificar nenhuma configuração para etree ou parâmetro para qualquer função para alterar o recuo etree padrão. Eu gosto de como é fácil usar etree, mas isso foi realmente me irritando.fonte
Para converter um documento xml inteiro em um documento xml bonito
(por exemplo: supondo que você tenha extraído [descompactado] um arquivo .odt ou .ods do LibreOffice Writer e que você deseje converter o arquivo "content.xml" feio em um arquivo bonito para controle de versão git automatizado e
git difftool
ing de arquivos .odt / .ods , como eu estou implementando aqui )Referências:
- Graças à resposta de Ben Noland nesta página, que me levou a maior parte do caminho até lá.
fonte
Está funcionando bem para o xml com chinês!
fonte
Se, por algum motivo, você não conseguir colocar em mãos nenhum dos módulos Python mencionados por outros usuários, sugiro a seguinte solução para o Python 2.7:
Até onde eu sei, esta solução funcionará em sistemas baseados em Unix que possuem o
xmllint
pacote instalado.fonte
check_output
porque você não precisa fazer a verificação de errosResolvi isso com algumas linhas de código, abrindo o arquivo, passando por ele e adicionando recuo e salvando-o novamente. Eu estava trabalhando com pequenos arquivos xml e não queria adicionar dependências ou mais bibliotecas para instalar para o usuário. Enfim, aqui está o que eu acabei com:
Funciona para mim, talvez alguém tenha alguma utilidade :)
fonte