ElementTree, XML, Namespaces e Prefixos

Essa semana eu precisei lidar com alguns arquivos XMI usando Python. Usei o ElementTree, que é uma API pra XML que foi incorporada recentemente ao core do Python (Python2.4).

Uma das coisas legais do elementTree é a forma de encontrar elementos: o método find. Porém, com o arquivo XMI não estava funcionando. O problema: XML Namespaces.

Namespaces em XML são uma recomendação da W3C. Por exemplo, você pode ter um XML que use partes para representar partes de um avião, um outro que use partes para representar partes de uma escrivaninha e outro que use partes para representar partes de um carro. A solução, descrita por James Clark, é adicionar antes da tag uma URI que seja o namespace dela.

Isso posto, voltemos ao meu querido XMI :P .

Lá no começo do arquivo XMI, tem xmlns:UML=”http://schema.omg.org/spec/UML/1.3″.

A busca:

content.find(‘Model’)
 

não funciona.

O correto é:

print(content.find(‘{http://schema.omg.org/spec/UML/1.3}Model’)
 

Coloquei um arquivo xmi de exemplo junto com um script python pra quem quiser testar. O xmi foi gerado com o Umbrello.

Não era tão difícil quanto parecia. Mas que espeta, espeta.B)

This entry was posted in Programação, Python and tagged , , , , . Bookmark the permalink.

2 Responses to ElementTree, XML, Namespaces e Prefixos

  1. Parabéns pelo post Walter.
    Mas só uma dúvida que não quer calar: – Tu estava tentando gerar código Python através de um diagrama de classes ?

    Um abraço,
    Leandro.

  2. Oi Leandro! Bem que eu gostaria de gerar o código Python através do diagrama de classes :)

    Na verdade, eu tava dando uma curiada no Gaphor – que é uma ferramenta de modelagem escrita em Python.

    Sobre geração de código, o desenvolvimento com Plone usando archetypes é feito em cima desse conceito: você cria o modelo e o ArchGenXML gera o código Archetypes.

    Corre a história que um dia o Genesis (sucessor do ArchGenXML) gerará código para TurboGears e Django.

    Por falar em TurboGears, me interessei pelo curso na página de vocês! Vou conferir!

Deixe um Comentário

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>