Você está na página 1de 7

Exemplo de manipulao de XML via AdvPL | T... https://terminaldeinformacao.com/2016/11/01/...

TERMINAL DE INFORMAO

HOME ADVPL CONTATO MDIA KIT (ANUNCIE) PARCEIROS SOBRE

AUTOR POSTADO EM CATEGORIAS


DAN_ATILIO NOVEMBRO 1, 2016 DESENVOLVIMENTO
COMENTRIOS
0 COMMENTS

EXEMPLO DE MANIPULAO DE XML


VIA ADVPL
Ol pessoal

Hoje vou mostrar dois exemplos em AdvPL para manipular arquivos XML, um gerando o
arquivo e outro lendo o contedo.

Para gerar o arquivo em XML, voc pode utilizar as funes padro para criao de
arquivos (como MemoWrite, Fwrite e FWFileWriter), escrevendo as tags e seu contedo, por
exemplo:

1 fWrite(nHdl, "<data>"+dToC(dDataBase)+"</data>"+Chr(13)+Chr(10))

Agora, para ler, necessrio usar a funo XMLParser, ou a XMLParserFile, a diferena,


que a primeira converte uma string da memria, e a segunda, um arquivo estando dentro
da Protheus Data. Em ambas, so passados 3 parmetros, qual ser a substituio logo no
primeiro caracter dos ns (geralmente utilizado o underscore / underline), em seguida por
referncia uma varivel que identica os erros e outra os avisos. Por exemplo:

1 oLido := XmlParser(MemoRead(cDirect+cArquivo), cReplace, @cErros, @cAvisos)

No exemplo desenvolvido, a estrutura do XML bem simples, tendo apenas uma lista de
produtos.

1 de 7 01-11-2016 08:19
Exemplo de manipulao de XML via AdvPL | T... https://terminaldeinformacao.com/2016/11/01/...

Arquivo XML gerado

Debugando o fonte, podemos ver a estrutura do nosso objeto.

Objeto gerado pelo XMLParser

E ao nalizar, mostrado uma mensagem dos produtos encontrados no objeto.

2 de 7 01-11-2016 08:19
Exemplo de manipulao de XML via AdvPL | T... https://terminaldeinformacao.com/2016/11/01/...

Mensagem de encerramento da Rotina

Abaixo o exemplo desenvolvido.

1 //Bibliotecas
2 #Include "Protheus.ch"
3 #Include "TopConn.ch"
4
5 /*/{Protheus.doc} zTstXML
6 Funo que testa a Criao e Leitura de um arquivo XML
7 @type function
8 @author Atilio
9 @since 17/08/2016
10 @version 1.0
11 @example
12 u_zTstXML()
13 /*/
14
15 User Function zTstXML()
16 Local aArea := GetArea()
17 Private cDirect := GetTempPath()
18 Private cArquivo := "teste.xml"
19
20 //Criao do arquivo XML
21 fCriaXML()
22
23 //Leitura do arquivo XML
24 fLeXML()
25
26 RestArea(aArea)
27 Return
28
29 /*---------------------------------------------------------------------*
30 | Func: fCriaXML |
31 | Autor: Daniel Atilio |
32 | Data: 17/08/2016 |
33 | Desc: Funo que cria o arquivo XML |
34 *---------------------------------------------------------------------*/
35
36 Static Function fCriaXML()
37 Local nHdl := 0
38 Local aArea := GetArea()
39 Local cQry := ""
40 Local nAtu := 1
41
42 //Cria o arquivo
43 nHdl := fCreate(cDirect+cArquivo)
44
45 //Se houve erro na criao
46 If nHdl == -1
47 MsgStop("No foi possvel gerar o arquivo!")
48
49 Else
50 //Monta a query de produtos (pega at o recno 50)

3 de 7 01-11-2016 08:19
Exemplo de manipulao de XML via AdvPL | T... https://terminaldeinformacao.com/2016/11/01/...

51 cQry := " SELECT "


52 cQry += " B1_COD, B1_DESC "
53 cQry += " FROM "
54 cQry += " "+RetSQLName('SB1')+" SB1 "
55 cQry += " WHERE "
56 cQry += " B1_FILIAL = '"+FWxFilial('SB1')+"' "
57 cQry += " AND R_E_C_N_O_ <= 50 "
58 cQry += " AND SB1.D_E_L_E_T_ = ' ' "
59 TCQuery cQry New Alias "QRY_SB1"
60
61 //Monta o XML
62 fWrite(nHdl, "<?xml version='1.0' encoding='UTF-8' ?>"+Chr(13)+Chr(10)
63 fWrite(nHdl, "<dados>"+Chr(13)+Chr(10))
64 fWrite(nHdl, "<data>"+dToC(dDataBase)+"</data>"+Chr(13)+Chr(10))
65 fWrite(nHdl, "<hora>"+Time()+"</hora>"+Chr(13)+Chr(10))
66 fWrite(nHdl, "<produtos>"+Chr(13)+Chr(10))
67 While !QRY_SB1->(EoF())
68 fWrite(nHdl, ' <produto id="'+cValToChar(nAtu)+'">'
69 fWrite(nHdl, " <codigo>"+QRY_SB1->B1_COD+"</codigo>"
70 fWrite(nHdl, " <descricao>"+QRY_SB1->B1_DESC+"</descricao>"
71 fWrite(nHdl, " </produto>"+Chr(13)+Chr(10))
72
73 nAtu++
74 QRY_SB1->(DbSkip())
75 EndDo
76 QRY_SB1->(DbCloseArea())
77 fWrite(nHdl, "</produtos>"+Chr(13)+Chr(10))
78 fWrite(nHdl, "</dados>"+Chr(13)+Chr(10))
79
80 //Finalizando o Handle
81 fClose(nHdl)
82
83 //Abrindo o arquivo
84 ShellExecute("OPEN", cArquivo, "", cDirect, 0 )
85 EndIf
86
87 RestArea(aArea)
88 Return
89
90 /*---------------------------------------------------------------------*
91 | Func: fLeXML |
92 | Autor: Daniel Atilio |
93 | Data: 17/08/2016 |
94 | Desc: Funo que faz a leitura do arquivo XML |
95 *---------------------------------------------------------------------*/
96
97 Static Function fLeXML()
98 Local oLido := Nil
99 Local oProds := Nil
100 Local nAtual := 0
101 Local cReplace := "_"
102 Local cErros := ""
103 Local cAvisos := ""
104 Local cMsg := ""
105
106 //Se o arquivo existir
107 If File(cDirect+cArquivo)
108 //Lendo o arquivo com XMLParser (l a string), caso queira ler o arqui
109 oLido := XmlParser(MemoRead(cDirect+cArquivo), cReplace, @cErros, @cAv
110
111 //Se tiver erros, mostra ao usurio
112 If !Empty(cErros)
113 Aviso('Ateno', "Erros: "+cErros, {'Ok'}, 03)
114 EndIf
115
116 //Se tiver avisos, mostra ao usurio

4 de 7 01-11-2016 08:19
Exemplo de manipulao de XML via AdvPL | T... https://terminaldeinformacao.com/2016/11/01/...

117 If !Empty(cAvisos)
118 Aviso('Ateno', "Avisos: "+cAvisos, {'Ok'}, 03)
119 EndIf
120
121 //Montando a Mensagem, data e hora
122 cMsg := "Data: "+oLido:_Dados:_Data:Text + Chr(13)+Chr(10)
123 cMsg := "Hora: "+oLido:_Dados:_Hora:Text + Chr(13)+Chr(10)
124
125 //Percorrendo os produtos
126 oProds := oLido:_Dados:_Produtos:_Produto
127 For nAtual := 1 To Len(oProds)
128 cMsg += "ID: "+oProds[nAtual]:_ID:Text+", "
129 cMsg += "Cdigo: "+oProds[nAtual]:_Codigo:Text+", "
130 cMsg += "Descrio: "+oProds[nAtual]:_Descricao:Text
131 cMsg += Chr(13)+Chr(10)
132 Next
133
134 //Mostrando a mensagem do xml lido
135 Aviso('Ateno', cMsg, {'Ok'}, 03)
136 EndIf
137 Return

Esses e outros cdigos, esto disponveis gratuitamente no nosso GitHub, acesse em


github.com/dan-atilio/AdvPL.

Bom pessoal, por hoje s.


Abraos e at a prxima.

Sobre o Autor

About Dan_Atilio
Analista e desenvolvedor de sistemas na TOTVS Oeste Paulista
Bauru. Tcnico em Informtica pelo CTI da Unesp. Graduado em
Banco de Dados pela Fatec Bauru. Entusiasta de solues Open
Source e blogueiro nas horas vagas. Autor do projeto Terminal de Informao,
onde so postados tutoriais e notcias envolvendo o mundo da tecnologia.

Compartilhe isso:

Tweetar Compartilhar 0 0

Curtir isso:

Curda
Seja o primeiro a curr este post.

5 de 7 01-11-2016 08:19
Exemplo de manipulao de XML via AdvPL | T... https://terminaldeinformacao.com/2016/11/01/...

Relacionado

AdvPL

Como visualizar o Editor de Aparncia no


WordPress

Deixe uma resposta

Pesquisar

REDES SOCIAIS

RECEBA NOVIDADES DO TI
Seja VIP e receba novidades exclusivas por e-Mail gratuitamente.

6 de 7 01-11-2016 08:19
Exemplo de manipulao de XML via AdvPL | T... https://terminaldeinformacao.com/2016/11/01/...

e-Mail Ok

AJUDE O TI
Se voc gosta do contedo divulgado no Ti, por favor, nos ajude com uma pequena doao via PayPal.

POSTAGENS EM DESTAQUE

Ordenando vetores usando Linguagem C

Manipulando Arquivos Texto no Terminal Linux

Discusso: Bugs e Erros estranhos no Windows 8

Como instalar e congurar o GCC no Windows (MinGW)

Tutorial: Importando arquivos .pst no Thunderbird

Copyright 2016 Terminal de Informao - Terminal Linux, Tutoriais, AdvPL, OpenSUSE,


Notcias e muito mais!.
| Zoren WordPress Theme

Seguir
Receba novidades exclusivas por e-Mail gratuitamente.

Insira seu e-Mail

Ok

7 de 7 01-11-2016 08:19