lendo xml de uma variável...

Discussão em 'Progress 4GL' iniciado por angeloata, Julho 13, 2009.

  1. angeloata

    angeloata Membro Participativo

    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.
  2. angeloata

    angeloata Membro Participativo

    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.
  3. Raviel

    Raviel Sem Pontuação

    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. :)
  4. juliano

    juliano Sem Pontuação

    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.

Compartilhe esta Página