Você está na página 1de 13

FUNES TRATAMENTO XML

Sintaxe
XmlChildCount ( < oParent > ) --> nChild
Parmetros
Argumento Tipo Descri!o
oParent "#$eto
%ndica o node X&' no (ual ele ir) *a+er a contagem dos
*ilhos,
-etorno
Tipo Descri!o
.um/rico -etorna o numero de elementos encontrados,
Descri!o
A *un!o tem o o#$eti0o de retornar a (uantidade de n1s existentes2 a partir de um nodo
pai in*ormado como argumento,
A *un!o n!o *a+ essa contagem recursi0amente pela estrutura2 ou se$a2 ela nao 0arre a
estrutura entrando em todos subNodos a partir do elemento passado como rai+ para a
contagem e sim apenas os *ilhos de primeiro n30el,
4ssa *un!o / util para manipularmos os o#$etos X&' diretamente2 sem
necessariamente conhecermos o conte5do do o#$eto,
Sintaxe
XmlChild4x ( < "Parent > 2 < cProcura > ) --> retorno
Parmetros
Argumento Tipo Descri!o
"Parent "#$eto
.odo usado para indicar o inicio da procura do elemento
re(uerido,
cProcura Caracter -epresenta o nome do elemento (ue dese$amos encontrar,
-etorno
Tipo Descri!o
(6ual(uer) 6uando a *unao encontrar apenas um elemento ser) retornado o o#$eto
node2 caso possua mais de um elemento do mesmo nome ir) retornar um
arra7 dos nodes2 caso contr)rio retorna .%',
Descri!o
A *un!o tem o o#$eti0o de retornar um ou mais *ilhos da estrutura2 de acordo com o
nome do elemento procurado,
4speci*icando um elemento (ual(uer do o#$eto para a *un!o2 na (ual ser) usado como
#ase para #usca apenas em seu primeiro su#-n30el a *un!o ir) retornar todos os
nodos *ilhos (ue encontar,
8 5til (uando (uando (ueremos #uscar por um elemento *ilho e exista mais de um
elemento do mesmo tipo,
Sintaxe
XmlClone.ode ( < oParent > 2 < c.e9.ame > ) --> .il
Parmetros
Argumento Tipo Descri!o
oParent "#$eto -epresenta o o#$eto node X&' no (ual ser) colando
c.e9.ame Caracter %ndica o nome no (ual ser) atri#uido o node clonado
-etorno
Tipo Descri!o
(.:'") .il
Descri!o
A *un!o tem o o#$eti0o de criar um clone2 do n1 in*ormado pelo parametro2
especi*icando um no0o nome para o elemento2 de *orma (ue a *un!o clona apenas o
node2 as propriedades n!o,
6uando o nodo clonado esta com o mesmo nome de um existente2 ent!o / criado um
arra7 automaticamente com os nodos,
4la pode ser utili+ada para acrescentarmos dados em um modelo de xml $) existente,
Sintaxe
XmlDel.ode ( < oParent > 2 < c.ode > ) --> .il
Parmetros
Argumento Tipo Descri!o
oParent "#$eto -epresenta o .ode pai do elemento (ue ser) remo0ido,
c.ode Caracter
-epresenta o -eal name do elemento node (ue ser)
remo0ido,
-etorno
Tipo Descri!o
(.:'") .il
Descri!o
A *un!o tem o o#$eti0o de deletar um nodo de um o#$eto xml,
Para isto in*ormamos passando por parametro um elemento do o#$eto (ue cont/m a
estrutura do xml(um nodo (ual(uer)2 este nao precisa ser o#rigat1riamente o root da
estrutura,
4m seguida in*ormamos o nome do nodo (ue dese$amos deletar2 pois a *un!o ir)
procurar recursi0amente a partir do nodo in*ormado2 o elemento (ue possu3 o nome do
nodo a ser deletado dentro da estrutura,
A xmlDel.ode ir) deletar todos nodos (ue contenham o nome igual ao do nodo
in*ormado para ser deletado a partir do nodo in*ormado para pes(uisa,
A *un!o retorna true caso consiga encontrar um elemento e deleta-lo2 false caso
contr)rio,
4xemplos
.este exemplo2 criamos uma string contendo o xml2 em seguida parseamos ele2 e agora
0amos deletar um nodo do o#$eto retornado pela xmlParser2 note (ue no exemplo passei
o nodo ;<itens>; como rai+ da estrutura a ser pes(uisada e (ueremos deletar o nodo
;<item>;2 (ue / elemento de ;<itens>;,
A *un!o xmlDel.ode tem como o#$eti0o deletar todos os elementos ;<item>; (ue
encontrar dentro da estrutura passada para inicio da pes(uisa,
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function getObXML!"
Loc#$ cError %& ""
Loc#$ c'#rning %& ""
Loc#$ oX($ %& NIL
))*er# o Obeto XML
oX($ %& X($P#rser! *er#XML!"+ ","+ -cError+ -c'#rning "

i. /X($De$No0e! oScri1t%,PEDIDO%,ITENS+ ",ITEM" "
conout!"N#o .oi 1ossi2e$ e3c$uir""
En0I.
)) Tr#n.or(# o Obeto XML e( #r4ui2o ou string
)) *r#2# o #r4ui2o e( u( 0iret5rio 63($ # 1#rtir 0o rootP#t7
S89E oX($ XMLFILE "63($6teste.3($"
Return oX($
)) .un:;o 1#r# ger#r u(# string conten0o u( 3($
St#tic Function *er#XML!"
Loc#$ cScri1t %& <=>3($ 2ersion&"?.@" enco0ing&"UTFAB">C<
cScri1t D& "=1e0i0oC"
cScri1t D& " =No(e C$ienteCMicrosig# So.tE#re S)8=)No(e
C$ienteC"
cScri1t D& " =En0erecoC82. Fr#G Le(e=)En0erecoC"
cScri1t D& " =Nu(eroC?HI?=)Nu(eroC"
cScri1t D& " =D#t#CJJA@HAJ@@K=)D#t#C"
cScri1t D& " =ItensC"
cScri1t D& " =Ite(C"
cScri1t D& " =Pro0utoCProt7ues=)Pro0utoC"
cScri1t D& " =Lu#nti0#0eC?=)Lu#nti0#0eC"
cScri1t D& " =PrecoC?@@.@@=)PrecoC"
cScri1t D& " =)Ite(C"
cScri1t D& " =Ite(C"
cScri1t D& " =Pro0utoCERP=Pro0utoC"
cScri1t D& " =Lu#nti0#0eC@=)Lu#nti0#0eC"
cScri1t D& " =PrecoC@=)PrecoC"
cScri1t D& " =)Ite(C"
cScri1t D& " =)ItensC"
cScri1t D& "=)1e0i0oC"
Return cScri1t
Sintaxe
Xml<etChild ( ) --> .il
-etorno
Tipo Descri!o
(.:'") .il
Descri!o
A *un!o tem o o#$eti0o de retornar um elemento *ilho da estrutura,
4speci*icando um elemento (ual(uer do o#$eto para a *un!o2 na (ual ir) usar como
#ase para retornar o nodo *ilho de n5mero indicado pelo segundo parametro passado
para a *un!o,
8 5til (uando (ueremos mudar o posicionamento do o#$eto2 para algum nodo *ilho
do atual na estrutura do o#$eto X&',
.o 4xemplo seguinte usamos a *un!o para nos posicionar no nodo <itens>2 em seguida
apagamos todos os nodos *ilhos com a xmlDel.ode,
:sando o comando SA=4 criamos um ar(ui0o teste,xml ao *inal da execu!o do
programa,
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function E3eXML!"
Loc#$ cError %& ""
Loc#$ c'#rning %& ""
Loc#$ oScri1t
Loc#$ cFi$e %& ""

))# 1#rtir 0o root1#t7 0o #(biente
cFi$e %& "63($61e0i0o.3($"
))*er# o Obeto XML re.. #o scri1t
oScri1t %& X($P#rser! *er#XML!"+ ","+ -cError+ -c'#rning "

oScri1t %& X($*etc7i$0! oScri1t%,PEDIDO +
X($C7i$0Count! oScri1t%,PEDIDO ""
)) 8gor# 2ou #1#g#r u( no0e
i. /X($De$No0e! oScri1t + ",ITEM" "
conout!"N#o .oi 1ossi2e$ #1#g#r o no0o""
En0I.
)) Tr#n.or(# o Obeto XML e( #r4ui2o
S89E oScri1t XMLFILE "63($6teste.3($"
Return oScri1t
St#tic Function *er#XML!"
)) Scri1t XML # ger#r obeto
Loc#$ cScri1t %& <=>3($ 2ersion&"?.@" enco0ing&"UTFAB">C<
cScri1t D& "=1e0i0oC"
cScri1t D& " =No(e C$ienteCMicrosig# So.tE#re S)8=)No(e
C$ienteC"
cScri1t D& " =En0erecoC82. Fr#G Le(e=)En0erecoC"
cScri1t D& " =Nu(eroC?HI?=)Nu(eroC"
cScri1t D& " =D#t#CJJA@HAJ@@K=)D#t#C"
cScri1t D& " =ItensC"
cScri1t D& " =Ite(C"
cScri1t D& " =Pro0utoCProt7ues=)Pro0utoC"
cScri1t D& " =Lu#nti0#0eC?=)Lu#nti0#0eC"
cScri1t D& " =PrecoC?@@.@@=)PrecoC"
cScri1t D& " =)Ite(C"
cScri1t D& " =Ite(C"
cScri1t D& " =Pro0utoCERP=Pro0utoC"
cScri1t D& " =Lu#nti0#0eC@=)Lu#nti0#0eC"
cScri1t D& " =PrecoC@=)PrecoC"
cScri1t D& " =)Ite(C"
cScri1t D& " =)ItensC"
cScri1t D& "=)1e0i0oC"
Return cScri1t
Sintaxe
Xml<etParent ( < o.ode > ) --> oParent
Parmetros
Argumento Tipo Descri!o
o.ode "#$eto
representa o node no (ual ser) usado como re*er>ncia para o
retorno do node pai,
-etorno
Tipo Descri!o
"#$eto :m o#$eto posicionado no node de acordo com o argumento passado,
Descri!o
A *un!o tem o o#$eti0o de retornar um nodo (ue representa o nodo ;pai;
do elemento especi*icado por parametro,
8 5til (uando (ueremos ;su#ir; na estrutura do o#$eto X&'
Sintaxe
Xml.e9.ode ( < oParent > 2 < c4lement.ame > 2 < c-eal.ame > 2 < cT7pe > ) --> .il
Parmetros
Argumento Tipo Descri!o
oParent "#$eto %ndica o local onde ser) inserido o no0o node X&',
c4lement.ame Caracter 8 o nome do elemento .ode no X&'
c-eal.ame Caracter 8 o nome -eal do .ode X&'
cT7pe Caracter -epresenta o tipo de node X&' (ue ser) criado
-etorno
Tipo Descri!o
"#$eto .il
Descri!o
A *un!o tem o o#$eti0o de criar um no0o nodo a partir de um ponto (ual(uer no xml,
Para isto / necess)rio in*ormar em (ual ponto do o#$eto xml(o xml parseado) (ue
dese$amos adicionar um no0o elemento,
" no0o nodo ser) adicionado como *ilho do nodo passado por parametro2 onde ser!o
in*ormados tam#/m os dados em rela!o a ele?
--4A'.A&4
-4'4&4.T.A&4
-T@P4
(para entender melhor o *uncionamento da *un!o 0e$a o exemplo)
4xemplos
.este exemplo criamos o xml atra0/s da *un!o <eraX&'2 parseamos ele atra0/s da
xmlParser retornando o o#$eto xml,
4m seguida 0isuali+amos o o#$eto retornado e usamos a *unao xmlChildCount
retornando a (uantidade de elementos no o#$eto contendo o xml, .o .osso exemplo a
*un!o ir) retornar A elementos,
Agora usaremos a xml.e9.ode2 especi*icando (ue o no0o nodo ser) adicionado como
*ilho de ;<pedido>;2 logo depois acessamos o nodo e acrecentamos um texto para ele,
o#s? o resultado disso no xml ser) <exemploB>4xemplo &icrosiga<CexemploB>
Ap1s a cria!o do nodo2 a xmlChildCount ir) retornar D indicando (ue o nodo *oi
inserido,
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function getObXML!"
Loc#$ cError %& ""
Loc#$ c'#rning %& ""
Loc#$ cXML %& ""
Loc#$ oX($ %& NIL
))*er# o Obeto XML
oX($ %& X($P#rser! *er#XML!"+ ","+ -cError+ -c'#rning "
))2eri.ic# 4u#ntos e$e(entos 1ossuo
conout! X($C7i$0Count! oScri1t%,PEDIDO " "
)) Cri#n0o u( no0e
X($NeENo0e!oScri1t%,PEDIDO+ "E3e(1$o?"+ "E3e(1$o?"+ "NOD" "
))set#n0o o CONTEUDO 0o (eu no0o ""
oX($%,PEDIDO%E3e(1$o?%Te3t %& "E3e(1$o Microsig#"
))2eri.ic# 4u#ntos e$e(entos 1ossuo 0e1ois 0# inser:;o
conout! X($C7i$0Count! oScri1t%,PEDIDO " "
)) Tr#n.or(# o Obeto XML e( string
S89E oX($ XMLSTRIN* cXML
Return oX($
)) .un:;o 1#r# ger#r u(# string conten0o u( 3($
St#tic Function *er#XML!"
Loc#$ cScri1t %& <=>3($ 2ersion&"?.@" enco0ing&"UTFAB">C<
cScri1t D& "=1e0i0oC"
cScri1t D& " =No(e C$ienteCMicrosig# So.tE#re S)8=)No(e
C$ienteC"
cScri1t D& " =En0erecoC82. Fr#G Le(e=)En0erecoC"
cScri1t D& " =Nu(eroC?HI?=)Nu(eroC"
cScri1t D& " =D#t#CJJA@HAJ@@K=)D#t#C"
cScri1t D& " =ItensC"
cScri1t D& " =Ite(C"
cScri1t D& " =Pro0utoCProt7ues=)Pro0utoC"
cScri1t D& " =Lu#nti0#0eC?=)Lu#nti0#0eC"
cScri1t D& " =PrecoC?@@.@@=)PrecoC"
cScri1t D& " =)Ite(C"
cScri1t D& " =Ite(C"
cScri1t D& " =Pro0utoCERP=Pro0utoC"
cScri1t D& " =Lu#nti0#0eC@=)Lu#nti0#0eC"
cScri1t D& " =PrecoC@=)PrecoC"
cScri1t D& " =)Ite(C"
cScri1t D& " =)ItensC"
cScri1t D& "=)1e0i0oC"
Return cScri1t
Sintaxe
Xml.odeEArr ( < o-oot > 2 < c.odeEArra7 > ) --> l-et
Parmetros
Argumento Tipo Descri!o
o-oot "#$eto
4lemento .ode no (ual ser) usado como root para inicio
da #usca do elemento a ser tran*ormado em arra7,
c.odeEArra7 Caracter
-epresenta o elemento procurado para ser trans*ormado em
arra7 na estrutura,
-etorno
Tipo Descri!o
'1gico -etorna true caso consiga trans*ormar em arra72 *alse caso contr)rio,
Descri!o
A *un!o tem o o#$eti0o de trans*ormar em arra72 um o#$eto(node) da estrutura do xml,
%n*ormando um elemento(node) da estrutura X&' atra0/s de parametro como rai+2 a
*un!o ir) procurar pelo nome do nodo no (ual se dese$a trans*ormar em arra7,
4xemplos
.o exemplo seguinte / demonstrado o simples uso da *un!o Xml.odeEArr2 em (ue
pegamos o o#$etoXml e o tran*ormamos em um arra7,
4m seguida gra0amos esse o#$eto em ar(ui0o ,xml propriamente dito,
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function E3eXML!"
Loc#$ cError %& ""
Loc#$ c'#rning %& ""
Loc#$ oScri1t
))*er# o Obeto XML re.. #o scri1t
oScri1t %& X($P#rser! *er#XML!"+ ","+ -cError+ -c'#rning "

)) Tr#ns.or(# no0e e( u(# #rr#M+ no c#so tr#n.or(# # estrutur#
1#r# #rr#M
X($No0eJ8rr! oScri1t%,PEDIDO+ ",PEDIDO" "
)) Tr#n.or(# o Obeto XML e( #r4ui2o
)) *r#2# o #r4ui2o e( u( 0iret5rio 63($ # 1#rtir 0o rootP#t7
S89E oScri1t XMLFILE "63($6teste.3($"
Return .T.
St#tic Function *er#XML!"
Loc#$ cScri1t %& <=>3($ 2ersion&"?.@" enco0ing&"UTFAB">C<
cScri1t D& "=1e0i0oC"
cScri1t D& " =No(e C$ienteCMicrosig# So.tE#re S)8=)No(e
C$ienteC"
cScri1t D& " =En0erecoC82. Fr#G Le(e=)En0erecoC"
cScri1t D& " =Nu(eroC?HI?=)Nu(eroC"
cScri1t D& " =D#t#CJJA@HAJ@@K=)D#t#C"
cScri1t D& " =ItensC"
cScri1t D& " =Ite(C"
cScri1t D& " =Pro0utoCProt7ues=)Pro0utoC"
cScri1t D& " =Lu#nti0#0eC?=)Lu#nti0#0eC"
cScri1t D& " =PrecoC?@@.@@=)PrecoC"
cScri1t D& " =)Ite(C"
cScri1t D& " =Ite(C"
cScri1t D& " =Pro0utoCERP=Pro0utoC"
cScri1t D& " =Lu#nti0#0eC@=)Lu#nti0#0eC"
cScri1t D& " =PrecoC@=)PrecoC"
cScri1t D& " =)Ite(C"
cScri1t D& " =)ItensC"
cScri1t D& "=)1e0i0oC"
Return cScri1t
Sintaxe
XmlParser ( < cXml > 2 < c-eplace > 2 < Fc4rror > 2 < FcGarning > ) --> oX&'
Parmetros
Argumento Tipo Descri!o
cXml Caracter 8 a cadeia de caracteres (ue cont/m o c1digo X&',
c-eplace Caracter
-epresenta o 0alor a ser atri#uido para os caracteres de
espao encontrados na especi*ica!o dos nodes X&',
c4rror Caracter
Caso ocorra algum erro durante execu!o da *un!o2 a
0ari)0el ser) preenchida com a descri!o do erro ocorrido,
cGarning Caracter
Caso ocorra algum alerta de ;9arning; durante execu!o da
*un!o2 a 0ari)0el ser) preenchida com a descri!o do
;9arning; ocorrido,
-etorno
Tipo Descri!o
"#$eto -epresenta um o#$eto com a estrutura de acordo com o X&',
Descri!o
A *un!o tem o o#$eti0o de retornar um o#$eto (ue possu3 uma estrutura re*erente
ao xml2 passado pelo parametro na *un!o,
A estrutura retornada?
<"#$X&'>
<.odeX&'>
-<Arra7.odes>
--4A'.A&4
-T4XT
-T@P4
"nde -4A'.A&42 T4XT e T@P4 s!o propriedades (ue todos nodos possuem,
A propriedade Arra7.odes existir) (uando um nodo possuir mais de um *ilho2 do
mesmo tipo. (demonstrado no exemplo)
4xemplos
.este exemplo criamos uma *un!o geraXml (ue retorna uma string contento um
X&',
6uando passamos essa string para a XmlParser2 a *un!o ir) montar o o#$eto analisando
se a sintaxe e a ordem das tags est) #em *ormada2 caso isso nao ocorra a *un!o ir)
retonar um 9arning ou at/ um poss30el erro2 nos parametros in*ormados por re*er>ncia,
A estrutura?
oXml?
pedido?
-real.ame
-t7pe
-text
nomeHcliente?
-real.ame
-t7pe
-text
endereo?
-real.ame
-t7pe
-text
numero?
-real.ame
-t7pe
-text
data?
-real.ame
-t7pe
-text
itens?
-item < !arra"#
-item$%&'
-real.ame
-t7pe
-text
produto?
(uantidade?
preco?
-item$(&
-real.ame
-t7pe
-text
produto?
(uantidade?
preco?
-real.ame
-t7pe
-text

Caso isso nao ocorra a *un!o ir) retornar o o#$eto contendo uma estrutura em *orma de
ar0ore2 no caso a mesma estrutura do xml,
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function getObXML!"
Loc#$ cError %& ""
Loc#$ c'#rning %& ""
Loc#$ cXML %& ""
Loc#$ oX($ %& NIL
))*er# o Obeto XML
oX($ %& X($P#rser! *er#XML!"+ ","+ -cError+ -c'#rning "
))#cess#n0o o CONTEUDO 0o (eu no0o ""
oX($%,PEDIDO%,NOME,CLIENTE%Te3t %& "Microsig#"
)) Tr#n.or(# o Obeto XML e( string
))S89E oX($ XMLSTRIN* cXML
Return oX($
)) .un:;o 1#r# ger#r u(# string conten0o u( 3($
St#tic Function *er#XML!"
'ocal cScript ?I ;
Sintaxe
XmlParserJile ( < cJile > 2 < c-eplace > 2 < Fc4rror > 2 < FcGarning > ) --> oX&'
Parmetros
Argumento Tipo Descri!o
cJile Caracter
-epresenta o path de um ar(ui0o ,xml2 indicando o local
onde se encontra o ar(ui0o no disco,
c-eplace Caracter
-epresenta o 0alor a ser atri#uido para os caracteres de
espao encontrados na especi*ica!o dos nodes X&',
c4rror Caracter
c4rror Caracter Caso ocorra algum erro durante execu!o
da *un!o2 a 0ari)0el ser) preenchida com a descri!o do
erro ocorrido,
cGarning Caracter
cGarning Arra7 Caso ocorra algum alerta de ;9arning;
durante execu!o da *un!o2 a 0ari)0el ser) preenchida
com a descri!o do ;9arning; ocorrido,
-etorno
Tipo Descri!o
"#$eto -etorna um o#$eto ( cont/m uma estrutura de acordo com o X&',
Descri!o
A *un!o tem o o#$eti0o de retornar um o#$eto (ue possu3 uma estrutura re*erente ao
ar(ui0o ,xml2 passado pelo parametro na *un!o,
A estrutura retornada?
<"#$X&'>
<.odeX&'>
-<Arra7.odes>
--4A'.A&4
-T4XT
-T@P4
"nde -4A'.A&42 T4XT e T@P4 s!o propriedades (ue todos nodos possuem,
A propriedade Arra7.odes existir) (uando um nodo possuir mais de um *ilho2 do
mesmo tipo. (demonstrado no exemplo)
4xemplos
.este exemplo 0amos usar a *un!o (ue tem o mesmo o#$eti0o da XmlParser2 a
di*erena / (ue esta l> um ar(ui0o do disco com a extens!o ,xml,
6uando passamos a string in*ormando o path do ar(ui0o em disco2 de0emos lem#rar
(ue a procura do ar(ui0o ser) *eita atra0/s do rootpath do Protheus,
logo ap1s a leitura do ar(ui0o a *un!o ir) montar o o#$eto analisando se a sintaxe e a
ordem das tags est) #em *ormada2 caso isso n!o ocorra a *un!o ir) retonar um 9arning
ou at/ um poss30el erro2 nos parametros in*ormados por re*er>ncia,
Caso isso nao ocorra a *un!o ir) retornar o o#$eto contendo uma estrutura em *orma de
ar0ore2 no caso a mesma estrutura do xml,
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
User Function getObXML!"
Loc#$ cError %& ""
Loc#$ c'#rning %& ""
Loc#$ oX($ %& NIL
Loc#$ cFi$e %& ""

))# 1#rtir 0o root1#t7 0o #(biente
cFi$e %& "63($61e0i0o.3($"
))*er# o Obeto XML
oX($ %& X($P#rserFi$e! cFi$e+ ","+ -cError+ -c'#rning "
))#cess#n0o o CONTEUDO 0o (eu no0o ""
oX($%,PEDIDO%,NOME,CLIENTE%Te3t %& "Microsig#"
Return oX($

Você também pode gostar