Pessoal, mais uma dificuldade... qdo consulto o webservice da Secretaria da Fazenda, o servidor me dá esse retorno, em uma variavel. <?xml version="1.0" encoding="UTF-8"?> <retConsStatServ xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.07"> <tpAmb>2</tpAmb> <verAplic>SP_NFE_PL_005a_R01</verAplic> <cStat>107</cStat> <xMotivo>Serviço em Operação</xMotivo> <cUF>35</cUF> <dhRecbto>2008-06-14T12:07:48</dhRecbto> <tMed>1</tMed> </retConsStatServ> Alguem sabe como ler essas informação e passar para uma tabela temporaria no progress??? Att.
Pessoal, vasculhando a documentação do progress consegui chegar no seguinte exemplo: DEF VAR hDoc AS HANDLE NO-UNDO. DEF VAR hRoot AS HANDLE NO-UNDO. DEF VAR good AS LOGICAL NO-UNDO. DEF VAR cXML AS LONGCHAR NO-UNDO. ASSIGN cXML = "<?xml version='1.0' encoding='UTF-8'?> <retConsStatServ xmlns='http://www.portalfiscal.inf.br/nfe' versao='1.07'> <tpAmb>2</tpAmb> <verAplic>SP_NFE_PL_005a_R01</verAplic> <cStat>107</cStat> <xMotivo>Serviço em Operação</xMotivo> <cUF>35</cUF> <dhRecbto>2008-06-14T12:07:48</dhRecbto> <tMed>1</tMed> </retConsStatServ>". CREATE X-DOCUMENT hDoc. CREATE X-NODEREF hRoot. hDoc:LOAD("LONGCHAR",Cxml,FALSE). /*** Pega valor de uma variável ***/ /*hDoc:LOAD("file","XML\ConsultaStatus_v107_resposta.xml",FALSE). /*** Pega valor de um arquivo externo ***/ */ hDoc:GET-DOCUMENT-ELEMENT(hRoot). RUN GetChildren(hRoot, 1). DELETE OBJECT hDoc. DELETE OBJECT hRoot. PROCEDURE GetChildren: DEF INPUT PARAMETER hParent AS HANDLE NO-UNDO. DEF INPUT PARAMETER level AS INTEGER NO-UNDO. DEF VAR i AS INTEGER NO-UNDO. DEF VAR hNoderef AS HANDLE NO-UNDO. CREATE X-NODEREF hNoderef. REPEAT i = 1 TO hParent:NUM-CHILDREN: good = hParent:GET-CHILD(hNoderef,i). IF NOT good THEN LEAVE. IF hNoderef:SUBTYPE <> "element" THEN NEXT. MESSAGE hNoderef:NAME SKIP hNoderef:NODE-VALUE SKIP hNoderef:ATTRIBUTE-NAMES VIEW-AS ALERT-BOX. RUN GetChildren(hNoderef, (level + 1)). END. DELETE OBJECT hNoderef. END PROCEDURE. Só que ainda não consegui pegar o valor do atributo, alguém sabe o que possa ter de errado no exemplo acima para que não consiga pegar o atributo? Consegui chegar até o valor tpAmb, mas não consigo pegar o conteúdo "2" no caso. Se alguem puder ajudar agradeço. Att.
Cara, só agora vi teu post, eu tenho uns exemplos que grava e le um xml, vc só vai ter que dar uma emplementada para o teu caso: Código: /* **************************************** ** Nome: Cria XML - exemploxml2-1.p ** ** Criado por: Raviel - www.4each.com.br ** ** Criado em: 05/09/2008 ** **************************************** */ DEF VAR hDoc AS HANDLE NO-UNDO. DEF VAR hRoot AS HANDLE NO-UNDO. DEF VAR hCliente AS HANDLE NO-UNDO. DEF VAR hNome AS HANDLE NO-UNDO. DEF VAR hValorNome AS HANDLE NO-UNDO. DEF VAR hAniversario AS HANDLE NO-UNDO. DEF VAR hValorAniversario AS HANDLE NO-UNDO. DEF VAR hVendas AS HANDLE NO-UNDO. DEF VAR hValorVendas AS HANDLE NO-UNDO. DEF VAR vNome AS CHAR. DEF VAR vAniversario AS DATE. DEF VAR vVendas AS DECIMAL. DEF VAR mPointer AS MEMPTR NO-UNDO. DEF VAR cont_n AS INT. DEF VAR cont AS INT. CREATE X-DOCUMENT hDoc. CREATE X-NODEREF hRoot. CREATE X-NODEREF hCliente. CREATE X-NODEREF hNome. CREATE X-NODEREF hValorNome. CREATE X-NODEREF hAniversario. CREATE X-NODEREF hValorAniversario. CREATE X-NODEREF hVendas. CREATE X-NODEREF hValorVendas. UPDATE cont_n NO-LABEL WITH FRAME a VIEW-AS DIALOG-BOX TITLE "Numero de clientes". hDoc:ENCODING = "UTF-8". hDoc:CREATE-NODE(hRoot,"ListaClientes","ELEMENT"). hDoc:APPEND-CHILD(hRoot). DO cont = 1 TO cont_n: hDoc:CREATE-NODE(hCliente,"Cliente","ELEMENT"). hRoot:APPEND-CHILD(hCliente). hRoot:SET-ATTRIBUTE("TipoPessoa","Fisica"). SET vNome NO-LABEL WITH FRAME b VIEW-AS DIALOG-BOX TITLE "Nome". hDoc:CREATE-NODE(hNome,"Nome","ELEMENT"). hCliente:APPEND-CHILD(hNome). hDoc:CREATE-NODE(hValorNome,"ValorNome","TEXT"). hNome:APPEND-CHILD(hValorNome). hValorNome:NODE-VALUE = vNome. SET vAniversario FORMAT "99/99/9999" NO-LABEL WITH FRAME c VIEW-AS DIALOG-BOX TITLE "Aniversario". hDoc:CREATE-NODE(hAniversario,"Aniversario","ELEMENT"). hCliente:APPEND-CHILD(hAniversario). hDoc:CREATE-NODE(hValorAniversario,"ValorAniversaio","TEXT"). hAniversario:APPEND-CHILD(hValorAniversario). hValorAniversario:NODE-VALUE = STRING(vAniversario,"99/99/9999"). SET vVendas NO-LABEL WITH FRAME d VIEW-AS DIALOG-BOX TITLE "Vendas". hDoc:CREATE-NODE(hVendas,"Vendas","ELEMENT"). hCliente:APPEND-CHILD(hVendas). hDoc:CREATE-NODE(hValorVendas,"ValorVendas","TEXT"). hVendas:APPEND-CHILD(hValorVendas). hValorVendas:NODE-VALUE = REPLACE(STRING(vVendas), "," , "."). END. hDoc:SAVE("memptr", mPointer). MESSAGE GET-STRING(mPointer,1) VIEW-AS ALERT-BOX INFO BUTTONS OK. SET-SIZE(mPointer) = 0. hDoc:SAVE("file","c:\tmp\teste.xml"). DELETE OBJECT hValorNome NO-ERROR. DELETE OBJECT hValorAniversario NO-ERROR. DELETE OBJECT hValorVendas NO-ERROR. DELETE OBJECT hVendas NO-ERROR. DELETE OBJECT hAniversario NO-ERROR. DELETE OBJECT hCliente NO-ERROR. DELETE OBJECT hRoot NO-ERROR. DELETE OBJECT hDoc NO-ERROR. Código: /* **************************************** ** Nome: Le XML - exemploxml2-2.p ** ** Criado por: Raviel - www.4each.com.br ** ** Criado em: 05/09/2008 ** **************************************** */ DEF VAR hDoc AS HANDLE NO-UNDO. DEF VAR hRoot AS HANDLE NO-UNDO. DEF VAR hCliente AS HANDLE NO-UNDO. DEF VAR hNome AS HANDLE NO-UNDO. DEF VAR hValorNome AS HANDLE NO-UNDO. DEF VAR hAniversario AS HANDLE NO-UNDO. DEF VAR hValorAniversario AS HANDLE NO-UNDO. DEF VAR hVendas AS HANDLE NO-UNDO. DEF VAR hValorVendas AS HANDLE NO-UNDO. DEF VAR OK AS LOG. DEF VAR mPointer AS MEMPTR NO-UNDO. DEF VAR cont AS INT. CREATE X-DOCUMENT hDoc. CREATE X-NODEREF hRoot. CREATE X-NODEREF hCliente. CREATE X-NODEREF hNome. CREATE X-NODEREF hValorNome. CREATE X-NODEREF hAniversario. CREATE X-NODEREF hValorAniversario. CREATE X-NODEREF hVendas. CREATE X-NODEREF hValorVendas. hDoc:ENCODING = "UTF-8". hDoc:LOAD("file","c:\tmp\teste.xml",FALSE) NO-ERROR. hDoc:GET-DOCUMENT-ELEMENT(hRoot). REPEAT cont = 1 TO hRoot:NUM-CHILDREN: OK = hRoot:GET-CHILD(hCliente, cont) NO-ERROR. IF NOT OK THEN LEAVE. OK = hCliente:GET-CHILD(hNome,1) NO-ERROR. IF NOT OK THEN LEAVE. hNome:GET-CHILD(hValorNome,1). hCliente:GET-CHILD(hAniversario,2). hAniversario:GET-CHILD(hValorAniversario,1). hCliente:GET-CHILD(hVendas,3). hVendas:GET-CHILD(hValorVendas,1). MESSAGE "Atributo: " string(hRoot:GET-ATTRIBUTE("TipoPessoa")) SKIP "Nome: " hValorNome:NODE-VALUE SKIP "Aniv.: " hValorAniversario:NODE-VALUE SKIP "Vendas: " hValorVendas:NODE-VALUE VIEW-AS ALERT-BOX INFO BUTTONS OK. END. DELETE OBJECT hValorNome NO-ERROR. DELETE OBJECT hValorAniversario NO-ERROR. DELETE OBJECT hValorVendas NO-ERROR. DELETE OBJECT hVendas NO-ERROR. DELETE OBJECT hAniversario NO-ERROR. DELETE OBJECT hCliente NO-ERROR. DELETE OBJECT hRoot NO-ERROR. DELETE OBJECT hDoc NO-ERROR. Espero ter ajudado.
O tópico é antigo mas eu queria postar uma outra forma bem simples, baseada no exemplo dos colegas: Código: CURRENT-WINDOW:WIDTH =200. def var xDoc as handle. def var xNode as handle. def var hcStat as handle. create x-document xDoc. xDoc:load("file","c:\tmp\arquivo.xml",false) NO-ERROR. create x-noderef xNode. xDoc:get-document-element(xNode). RUN pi-le-xml (input xNode). DEFINE TEMP-TABLE tt-xml FIELD campo AS CHAR FORMAT "x(50)" FIELD valor AS CHAR FORMAT "x(255)". DEFINE VARIABLE l-ok AS LOGICAL NO-UNDO. PROCEDURE pi-le-xml: def input parameter INvh as handle. def var loop as int. def var hc as handle. create x-noderef hc. /* CREATE X-NODEREF hcStat.*/ do loop = 1 to INvh:NUM-CHILDREN . l-ok = INvh:get-child(hc,loop) NO-ERROR. FIND FIRST tt-xml WHERE tt-xml.campo = INvh:NAME NO-LOCK NO-ERROR. IF NOT AVAIL tt-xml THEN DO: CREATE tt-xml. ASSIGN tt-xml.campo = INvh:NAME tt-xml.valor = hc:NODE-VALUE. END. /* MESSAGE "Depois" SKIP "INvh:NAME :" + INvh:NAME SKIP "hc:NODE-VALUE :" + string(hc:NODE-VALUE) SKIP "INvh:NUM-CHILDREN :" + string(INvh:NUM-CHILDREN) SKIP INvh:SUBTYPE VIEW-AS ALERT-BOX INFO BUTTONS OK. */ run pi-le-xml(input hc:handle). END. /* DELETE OBJECT INvh. DELETE OBJECT hc. */ END PROCEDURE. FOR EACH tt-xml NO-LOCK: DISPLAY tt-xml WITH WIDTH 599. END.