Processamento de XML em Python

votos
61

Estou prestes a construir um pedaço de um projeto que vai precisar para construir e publicar um documento XML para um serviço web e eu gostaria de fazê-lo em Python, como um meio de expandir minhas habilidades nele.

Infelizmente, enquanto eu sei o modelo XML razoavelmente bem em .NET, eu sou incerto o que os prós e contras são dos modelos XML em Python.

Alguém tem experiência fazendo o processamento XML em Python? Onde é que você sugere que eu comece? Os arquivos XML Eu vou estar edifício será bastante simples.

Publicado 02/08/2008 em 04:35
fonte usuário
Em outras línguas...                            


16 respostas

votos
30

ElementTree tem um bom pythony API. Eu acho que é ainda enviado como parte do Python 2.5

É em python puro e como eu digo, muito bom, mas se você acabar precisando de mais desempenho, então lxml expõe a mesma API e usa libxml2 sob o capô. Você pode, teoricamente, apenas trocá-lo em quando você descobre que você precisar.

Respondeu 02/08/2008 em 16:21
fonte usuário

votos
22

Pessoalmente, eu joguei com várias opções embutidas em um projeto XML-pesado e se instalaram em pulldom como a melhor escolha para documentos menos complexos.

Especialmente para pequenas coisas simples, eu gosto da teoria orientada a eventos de analisar em vez de criação de uma enorme quantidade de chamadas de retorno para uma estrutura relativamente simples. Aqui está uma boa discussão rápida de como usar a API .

O que eu gosto: você pode lidar com a análise em um forcircuito em vez de usar retornos de chamada. Você também atrasar completo de análise (a "puxar" parte) e só obter detalhes adicionais quando você chamar expandNode(). Isso satisfaz minha obrigação geral de eficiência "responsável", sem sacrificar a facilidade de utilização e simplicidade.

Respondeu 02/08/2008 em 05:01
fonte usuário

votos
6

Dive Into Python tem um capítulo. Não consigo atestar para o quão bom seria embora.

Respondeu 02/08/2008 em 04:43
fonte usuário

votos
5

Depende um pouco sobre como é complicado o documento precisa ser.

Eu usei minidom muito para escrever XML, mas que geralmente sido apenas a leitura de documentos, fazendo algumas transformações simples, e escrevê-los de volta para fora. Isso funcionou muito bem até que eu precisava da capacidade de encomendar os atributos do elemento (para satisfazer um pedido antigo que não analisa XML corretamente). Nesse ponto eu desisti e escreveu o XML mim.

Se você está trabalhando apenas em documentos simples, em seguida, fazê-lo sozinho pode ser mais rápido e mais simples do que aprender um quadro. Se você pode conseguir escrever o XML à mão, então provavelmente você pode codificá-lo à mão, bem como (lembre-se de escapar corretamente caracteres especiais, e usar str.encode(codec, errors="xmlcharrefreplace")). Para além destas confusões, XML é regular o suficiente para que você não precisa de uma biblioteca especial para escrevê-lo. Se o documento for muito complicado para escrever à mão, então você provavelmente deve olhar para um dos quadros já mencionadas. Em nenhum momento se você precisar escrever um escritor XML geral.

Respondeu 14/10/2008 em 19:26
fonte usuário

votos
5

Eu usei ElementTree para diversos projetos e recomendo.

É pythônico, vem 'na caixa' com Python 2.5, incluindo o c versão cElementTree (xml.etree.cElementTree), que é 20 vezes mais rápido do que a versão Python puro, e é muito fácil de usar.

lxml tem algumas vantagens perfomance, mas eles são desiguais e você deve verificar primeiro os pontos de referência para o seu caso de uso.

Pelo que entendi, código ElementTree pode ser facilmente portado para lxml.

Respondeu 23/09/2008 em 20:42
fonte usuário

votos
5

Existem 3 principais formas de lidar com XML, em geral: dom, sax, e XPath. O modelo dom é bom se você pode pagar para carregar o arquivo xml inteiro na memória de uma vez, e você não se importa lidar com estruturas de dados, e você está olhando muito / a maior parte do modelo. O modelo sax é grande se você só se preocupam com algumas tags, e / ou você está lidando com arquivos grandes e pode processá-los sequencialmente. O modelo XPath é um pouco de cada - você pode escolher e escolher caminhos para os elementos de dados que você precisa, mas requer mais bibliotecas de usar.

Se você quiser simples e embalados com Python, minidom é a sua resposta, mas é muito manco, ea documentação é "aqui está docs on dom, vão descobrir isso". É realmente irritante.

Pessoalmente, eu gosto cElementTree, que é uma mais rápida implementação (c-based) de ElementTree, que é um modelo dom-like.

Eu usei sistemas sax, e de muitas maneiras eles são mais "pythônico" em sua sensação, mas eu geralmente acabam criando sistemas baseados no estado de lidar com eles, e de que maneira se encontra a loucura (e erros).

Eu digo ir com minidom se você gosta de pesquisa, ou ElementTree se desejar boa código que funciona bem.

Respondeu 16/09/2008 em 05:35
fonte usuário

votos
4

Você também pode tentar desembaraçar para analisar documentos XML simples.

Respondeu 31/10/2011 em 15:05
fonte usuário

votos
4

Eu escrevo um servidor SOAP que recebe solicitações XML e cria respostas XML. (Infelizmente, não é meu projeto, por isso é de código fechado, mas isso é outro problema).

Descobriu-se para mim que a criação de documentos XML (SOAP) é bastante simples, se você tem uma estrutura de dados que "encaixa" no esquema.

I manter o envelope, uma vez que o envelope de resposta é (quase) o mesmo que o envelope pedido. Então, desde a minha estrutura de dados é um dicionário (possivelmente nested), eu criar uma cadeia que transforma este dicionário em <key> valor </ key> itens.

Esta é uma tarefa que recursão torna simples, e eu acabar com a estrutura certa. Isso tudo é feito em código python, e atualmente é rápido o suficiente para uso em produção.

Você pode também (relativamente) fácil construir listas, bem como, embora dependendo do seu cliente, você pode bater problemas a menos que você dar dicas de comprimento.

Para mim, isso era muito mais simples, uma vez que um dicionário é uma maneira muito mais fácil de trabalhar do que alguns classe personalizada. Para os livros, gerando XML é muito mais fácil do que analisar!

Respondeu 03/08/2008 em 09:34
fonte usuário

votos
3

Para um trabalho sério com XML em Python uso lxml

Python vem com ElementTree construído em biblioteca, mas lxml estende-lo em termos de velocidade e funcionalidade (validação de esquema, análise sax, XPath, vários tipos de iteradores e muitas outras características).

Você tem que instalá-lo, mas em muitos lugares que já é considerado parte do equipamento padrão (por exemplo, Google AppEngine não permite pacotes Python baseadas em C, mas faz exceção para lxml, PyYAML e alguns outros).

Construção de documentos XML com E-fábrica (de lxml)

A sua pergunta é sobre a construção de documento XML.

Com lxml existem muitos métodos e ele me levou algum tempo para encontrar o caminho, o que parece ser fácil de usar e também fácil de ler.

Exemplo de código de doc lxml sobre a utilização E-fábrica (ligeiramente simplificado):


O E-fábrica fornece uma sintaxe simples e compacto para a geração de XML e HTML:

>>> from lxml.builder import E

>>> html = page = (
...   E.html(       # create an Element called "html"
...     E.head(
...       E.title("This is a sample document")
...     ),
...     E.body(
...       E.h1("Hello!"),
...       E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
...       E.p("This is another paragraph, with a", "\n      ",
...         E.a("link", href="http://www.python.org"), "."),
...       E.p("Here are some reserved characters: <spam&egg>."),
...     )
...   )
... )

>>> print(etree.tostring(page, pretty_print=True))
<html>
  <head>
    <title>This is a sample document</title>
  </head>
  <body>
    <h1>Hello!</h1>
    <p>This is a paragraph with <b>bold</b> text in it!</p>
    <p>This is another paragraph, with a
      <a href="http://www.python.org">link</a>.</p>
    <p>Here are some reserved characters: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

Eu aprecio sobre E-fábrica-lo seguindo as coisas

Código lê quase como o documento XML resultante

Readibility conta.

Permite a criação de qualquer conteúdo XML

Suporta coisas como:

  • uso de namespaces
  • começando e terminando nós de texto dentro de um elemento
  • funções de formatação de conteúdo atributo (ver CLASSE func na amostra lxml completa )

Permite construções muito legível com listas

por exemplo:

from lxml import etree
from lxml.builder import E
lst = ["alfa", "beta", "gama"]
xml = E.root(*[E.record(itm) for itm in lst])
etree.tostring(xml, pretty_print=True)

resultando em:

<root>
  <record>alfa</record>
  <record>beta</record>
  <record>gama</record>
</root>

conclusões

Eu recomendo a leitura lxml tutorial - é muito bem escrito e lhe dará muitas mais razões para usar esta biblioteca poderosa.

A única desvantagem de lxml é, que deve ser compilado. Veja SO responder por mais dicas como instalar lxml do pacote formato roda dentro de fração de segundo.

Respondeu 17/04/2014 em 22:32
fonte usuário

votos
3

Eu pessoalmente acho que o capítulo de Dive Into Python é grande. Verifique se a primeira - ele usa o módulo minidom e é um bom pedaço de escrita.

Respondeu 11/08/2008 em 19:02
fonte usuário

votos
3

Desde que você mencionou que você estará construindo XML "bastante simples", o módulo minidom (parte da biblioteca padrão do Python) provavelmente vai atender às suas necessidades. Se você tem alguma experiência com a representação DOM de XML, você deve encontrar o API bastante simples.

Respondeu 02/08/2008 em 19:04
fonte usuário

votos
1

Eu acho que você deve usar lxml para este functionallity

Respondeu 08/10/2014 em 06:58
fonte usuário

votos
1

Eu recomendo fortemente SAX - API simples para XML - implementação nas bibliotecas Python. Eles são bastante fáceis de configurar e grande XML processo pelo API mesmo conduzido, como discutido por cartazes anteriores aqui, e tem baixo consumo de memória ao contrário validar analisadores XML estilo DOM.

Respondeu 12/12/2012 em 04:25
fonte usuário

votos
1

Se você estiver indo para ser a construção de mensagens SOAP, consulte a soaplib . Ele usa ElementTree sob o capô, mas fornece uma interface mais limpa para serialização e desserialização mensagens.

Respondeu 13/10/2008 em 23:17
fonte usuário

votos
1

Presumo que o Net-way de processamento XML baseia-se em versão'som ​​de MSXML e nesse caso eu supor que usando, por exemplo minidom faria você se sentir um pouco em casa. No entanto, se ele é simples de processamento você está fazendo qualquer biblioteca provavelmente irá fazer.

Eu também prefere trabalhar com ElementTree ao lidar com xml em Python, é uma biblioteca muito arrumado.

Respondeu 16/09/2008 em 07:20
fonte usuário

votos
1

Eu recentemente comecei a usar Amara com sucesso.

Respondeu 11/08/2008 em 23:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more