A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Um parser XML simples e robusto Vitor Pastor Baracho.

Apresentações semelhantes


Apresentação em tema: "Um parser XML simples e robusto Vitor Pastor Baracho."— Transcrição da apresentação:

1 um parser XML simples e robusto Vitor Pastor Baracho

2 Em resumo, o TinyXML analisa uma sequência de entrada (no caso um documento XML) e determina uma estrutura independente de plataforma ou linguagem: um Modelo de Objeto de Documentos (DOM), que permite trabalhar com os elementos de modo altamente dinâmico e independente. Isto significa que o TinyXML armazena a informação do documento XML em objetos C++ que podem ser manipulados livremente.

3 Ao analisar o problema da CEMIG, percebemos que era necessário um mecanismo capaz de retirar os dados da entrada XML e transferi-los para a estrutura de dados da OGDF. A TinyXML mostrou ser a biblioteca ideal para a tarefa, visto que ela é extremamente compacta, elaborada para um rápido e fácil aprendizado, e robusta (o código foi muito testado e é bastante maduro e estável). Além disto, ela é distribuída sob a licença Zlib e pode ser usada para fins de código aberto ou comerciais.

4 A TinyXML pode ser compilada para utilizar ou não a STL. TinyXML é compatível com UTF-8, de modo a permitir que arquivos XML sejam manipulados em qualquer linguagem.

5 A TinyXML reconhece os seguintes caracteres especiais pré-definidos: & & < < > > " " ' ' Eles são reconhecidos quando o documento XML é lido.

6 A saída pode ser gerada de várias maneiras diferentes, que possuem vantagens e limitações: 1- Print( FILE* ). Saída para um std-C stream, que incluem todos os arquivos de C assim como stdout. 2- Operador <<. Saída para um C++ stream. 3- Objeto TiXmlPrinter. Saída para um std::string ou buffer de memória. É uma classe da TinyXML que permite diversas funções de formatação e é útil quando se deseja uma saída para memória.

7 Caso TIXML_USE_STL esteja ativado, a biblioteca é compatível com os operadores de fluxo em C++ (>>, <<) além dos C(FILE*) streams. A seguir, algumas diferenças que devem ser consideradas:

8 Em C: Entrada: Baseada em FILE*; Métodos Parse() e LoadFile(); Saída: Baseada em FILE*; Métodos Print() e SaveFile(); São métodos rápidos e tolerantes a erros no documento XML. A saída gerada é de leitura facilitada para humanos. Devem ser usados quando não se precisar dos streams de C++.

9 Em C++: Entrada: Baseada em std::istream; Operador >>; Saída: Baseada em std::ostream; Operador <<; São métodos mais lentos, porém úteis para transmissões na rede. Não são tolerantes a erros, como por exemplo dois elementos root em um documento XML.

10 A TinyXML é compatível com a remoção de espaços duplicados, e com a manutenção destes. Por exemplo: Caso a função estática global TiXmlBase::SetCondeseWhiteSpace(bool) seja setada, a biblioteca irá condensar todos os espaços em branco em um só, caso contrário não. Ela é setada como default.

11 Handles permitem acesso direto a elementos do documento XML, de modo a permitir a verificação de código (retornos nulos de funções) e ainda permitir que o código continue limpo. Para mais informações, vale a pena consultar a classe TiXmlHandle, na documentação da biblioteca.

12 A TinyXML permite que nós e atributos sejam rastreados no documento fonte. Para isto, são utilizados os métodos TiXmlBase::Row() e TiXmlBase::Column(). As tabulações corretas podem ser configuradas utilizando o método TiXmlDocument::SetTabSize().

13 Um Makefile em Linux e uma solução para o Visual C++ estão disponíveis no site, e podem ser compilados e executados. Para utilizar a biblioteca em uma aplicação, como no problema da CEMIG, basta adicionar os arquivos tinyxml.cpp, tinyxml.h, tinyxmlerror.cpp, tinyxmlparser.cpp, tinystr.cpp, e tinystr.h para o projeto ou makefile.

14 O exemplo disponível na documentação, utiliza o seguinte documento XML como entrada: Go to the Toy store! Do bills

15 Para ler este exemplo, de um arquivo (digamos exemplo.xml), cria-se um documento e carrega o arquivo nele: TiXmlDocument doc( exemplo.xml" ); doc.LoadFile(); Com isto, o documento já está carregado na estrutura, e pronto para ser manipulado.

16 Vamos dar uma olhada nas linhas do documento, e como elas se relacionam com a estrutura: A primeira linha do documento é uma declaração e se transforma em um objeto da classe TiXmlDeclaration. Ele vai ser o primeiro filho do nó documento. Esta é a única tag diretiva/especial cujo parse é feito pela biblioteca. Normalmente as tags são armazenadas em um objeto TiXmlUnknown.

17 A próxima linha é: Este comentário irá se tornar um objeto da classe TiXmlComment.

18 Continuando... Esta tag define um objeto da classe TiXmlElement. Este especificamente não contém atributos, porém contém outros dois elementos: Cria outro elemento TiXmlElement que é um filho do elemento ToDo. Este elemento possui um atributo com o nome (name) priority e o valor (value) 1.

19 Go to the Um TiXmlText. Este objeto é um nó folha (leaf node) e não pode conter outros elementos. Ele é filho do TiXmlElement Item. Outro TiXmlElement, também é filho do TiXmlElement Item. E assim sucessivamente...

20 Olhando a árvore final dos objetos instanciados, obtém-se: |TiXmlDocument "demo.xml" |TiXmlDeclaration "version='1.0'" "standalone=no" |TiXmlComment "Our to do list data" |TiXmlElement "ToDo" |TiXmlElement "Item" Attributes: priority = 1 |TiXmlText "Go to the" |TiXmlElement "bold" |TiXmlText "Toy store!" |TiXmlElement "Item" Attributes: priority= 2 |TiXmlText "Do bills"

21 Dado um arquivo XML, será mostrado como extrair informação do mesmo para ser utilizado em um aplicação. Estas informações são extraídas utilizando principalmente a classe TiXmlHandle. O exemplo foi adaptado do Tutorial fornecido pelos autores da TinyXML

22

23 TiXmlDocument doc( "entrada_teste.xml" ); doc.LoadFile(); TiXmlHandle hDoc(&doc); TiXmlElement* pElem; TiXmlHandle hRoot(0); cout << "Teste! Leitura do arquivo XML!" << endl << endl; pElem = hDoc.FirstChildElement().Element(); hRoot = TiXmlHandle(pElem); AppName = pElem->Value(); cout << "Primeira TAG do arquivo XML: " << AppName << endl;

24 cout << "Mostrando todas as TAGs filhas de \"GOPACApp\":" << endl; pElem = hRoot.FirstChildElement().Element(); for ( pElem; pElem; pElem = pElem->NextSiblingElement() ) cout Value() << endl; cout << endl << "Mostrando todas as mensagens:\n"; pElem = hRoot.FirstChild("Messages").FirstChildElement().Element(); for ( pElem; pElem; pElem = pElem->NextSiblingElement() ) cout Value() GetText() << endl;

25 cout << endl << "Informacoes sobre FRAMES:\n"; pElem = hRoot.FirstChild("Windows").FirstChildElement().Element(); for ( pElem; pElem; pElem = pElem->NextSiblingElement() ) { cout Value() Attribute("name") << endl; cout Attribute("x") << endl; cout Attribute("y") << endl; cout Attribute("w") << endl; cout Attribute("h") << endl << endl; }


Carregar ppt "Um parser XML simples e robusto Vitor Pastor Baracho."

Apresentações semelhantes


Anúncios Google