14. Processamento de documentos XML
![]() |
Considere o seguinte documento XML:
<tribu>
<enseignant>
<personne sexe="M">
<nom>dupont</nom>
<prenom>jean</prenom>
<age>28</age>
ceci est un commentaire
</personne>
<section>27</section>
</enseignant>
<etudiant>
<personne sexe="F">
<nom>martin</nom>
<prenom>charline</prenom>
<age>22</age>
</personne>
<formation>dess IAIE</formation>
</etudiant>
</tribu>
Analisamos este documento para produzir a seguinte saída na consola:
tribu
enseignant
(personne,(sexe,M) )
nom
[dupont]
/nom
prenom
[jean]
/prenom
age
[28]
/age
/personne
section
[27]
/section
/enseignant
etudiant
(personne,(sexe,F) )
nom
[martin]
/nom
prenom
[charline]
/prenom
age
[22]
/age
/personne
formation
[dess IAIE]
/formation
/etudiant
/tribu
Precisamos de saber como reconhecer:
- uma tag de início, como <training>;
- uma tag de encerramento, como </teacher>;
- uma tag de início com atributos, como <person gender="F">;
- o corpo de uma tag, como «martin» em <name>martin</name>.
Um programa que analisa código XML é chamado de analisador XML. Dois módulos fornecem a funcionalidade necessária para analisar código XML: xml.sax e xml.sax.handler.
O módulo [xml.sax] fornece-nos um analisador XML utilizando a seguinte instrução:
Este analisador analisa o texto XML sequencialmente. Ele chama métodos definidos pelo utilizador em eventos:
- o método startElement numa tag de início;
- o método endElement numa tag de fecho;
- o método characters no corpo de uma tag.
Precisamos indicar ao analisador qual a classe que implementa estes métodos:
Passamos uma instância de uma classe que implementa os métodos startElement, endElement e characters para o método setContentHandler do analisador. A classe utilizada é uma subclasse da classe xml.sax.handler.ContentHandler. Os métodos anteriores são chamados com parâmetros:
- name é o nome da tag de início. attributes é o dicionário dos atributos da tag. Assim, para a tag <person sex="M">, teremos name="person" e attributes={'sex':'M'}
- name é o nome da tag de encerramento. Assim, para a tag </student>, teremos name='student'.
- data é o corpo da tag. Assim, se a tag for
teremos data='\r\n dupont\r\n '. Geralmente, removemos os espaços em branco que precedem e seguem os dados.
Agora que isto está explicado, podemos passar ao script para analisar um documento XML:
Notas:
- O script utiliza a biblioteca de funções dos módulos xml.sax e xml.sax.handler (linha 3);
- linha 62: o ficheiro XML analisado;
- linha 68: o analisador XML;
- Linha 70: O manipulador para eventos emitidos pelo analisador será uma instância da classe XmlHandler;
- linha 72: a análise do documento XML começa;
- linha 6: a classe que implementa os métodos startElement, endElement e characters. É derivada da classe xml.sax.handler.ContentHandler, que implementa métodos utilizados pelo analisador;
- linha 9: o método startElement;
- linha 30: o método endElement;
- linha 41: o método characters.
Os resultados são os apresentados no início deste parágrafo.
