Serialização de XML

Discussão em 'Progress 4GL' iniciado por neirezende, Junho 29, 2011.

  1. neirezende

    neirezende Sem Pontuação

    Olá colégas...

    Eu precisando gerar um XML Serializado para um determinado WebService (requisição SOAP). O comando WRITE-XML converte uma tabela em um XML simples. Alguém teria um modelo ou me informaria o comando para gerar este XML?
    Desde já, obrigado!
  2. LeandroSantos

    LeandroSantos Membro Participativo

    Veja se este exemplo ajuda:
    Código:
    def var hXdoc  as handle no-undo.
    def var hRoot  as handle no-undo.
    def var hFirst as handle no-undo.
    def var hText  as handle no-undo.
    def var hSec   as handle no-undo.
    def var hDet   as handle no-undo.
    def var bh     as handle no-undo.
    def var fh     as handle no-undo.
    def var loop   as int    no-undo.
    def var vArq   as char   no-undo.
    
    create x-document hXdoc.
    create x-noderef hRoot.
    create x-noderef hFirst.
    create x-noderef hSec.
    create x-noderef hDet.
    create x-noderef hText.
    
    hXdoc:create-node(hRoot,"Cadastro","element").
    hXdoc:append-child(hRoot).
    
    for each customer
       where custnum < 5:
       bh = buffer customer:handle.
       
       hXdoc:create-node(hFirst,bh:name,"element").
       hRoot:append-child(hFirst).
       
       hFirst:set-attribute("CustNum",string(customer.custnum)).
       
       do loop = 2 to bh:num-fields:
          fh = bh:buffer-field(loop).
          hXdoc:create-node(hSec,fh:name,"element").
          hXdoc:create-node(hText,"","text").
          hText:node-value = string(fh:buffer-value).
          hFirst:append-child(hSec).
          hSec:append-child(hText).
       end.
       
       for each invoice of customer:
          
          bh = buffer invoice:handle.
          
          hXdoc:create-node(hSec,bh:name,"element").
          hFirst:append-child(hSec).
          
          do loop = 1 to bh:num-fields:
             fh = bh:buffer-field(loop).
             if fh:name = "custnum" then next.
             hXdoc:create-node(hDet,fh:name,"element").
             hXdoc:create-node(hText,"","text").
             hText:node-value = string(fh:buffer-value).
             hSec:append-child(hDet).
             hDet:append-child(hText).
          end.
       end.
       
    end.
    
    vArq = session:temp-dir + "Teste.xml".
    hXdoc:save("file",vArq).
    os-command no-wait value(vArq).
    
  3. romuloccomp

    romuloccomp Membro Participativo

    Olá,

    Você pode usar o buffer da tabela, pra retirar, conforme a procedure:

    ps.: Se nao for Webspeed troque o {&out} concatenando em uma variavel e depois trate.

    Código:
    procedure pi-xml-table:
        def input parameter p-buffer as handle    no-undo.
    
        def var h-field as handle  no-undo.
        def var i-cont  as integer no-undo.
    
        {&OUT} "<" + replace(p-buffer:name,"-","_") + ">".
        do i-cont = 1 to p-buffer:num-fields:
            assign h-field = p-buffer:buffer-field(i-cont).
            if h-field:extent = 0 then
                {&OUT} "<" + replace(h-field:name,"-","_") + ">" + (if h-field:data-type = 'character' then cpc-out(h-field:buffer-value) else h-field:buffer-value) + "</" + replace(h-field:name,"-","_") + ">".
        end.
        {&OUT} "</" + replace(p-buffer:name,"-","_") + ">".
    
    end procedure.
  4. neirezende

    neirezende Sem Pontuação

    Obrigado pelas ajudas, já estou conseguindo gerar o xml corretamente. O esquema é o seguinte: conecto no webservice informando usuário e senha, entao retorna o número de id. Gero um xml com os dados, inclusive o ID fornecido e deveria me retornar alguma resposta, mas neste momento está ocorrendo o seguinte erro:
    "Malformed XML fragment: only whitespace content allowed outside root element at line 1 and column 33 (11781).", ou seja, "Fragmento de XML mal formado: o conteúdo só é permitido espaço em branco fora do elemento raiz na linha 1 e coluna 33 (11.781)."

    Já testei a aplicação com o XML modelo enviado pela empresa fornecedora do webservice e ocorre o mesmo erro.

    Será que vcs podem me ajudar neste problema tbém?!

    Obrigado!
  5. romuloccomp

    romuloccomp Membro Participativo

    Neirezende,

    Se o problema ocorreu até com o modelo que a empresa forneceu.
    O problema é no tratamento no servidor deles, não tem o que você fazer além de reportar o problema.

    Se tiver outras coisas que podemos ajudar, bastar postar aqui.

    Abs
  6. neirezende

    neirezende Sem Pontuação

    Romuloccomp,

    Muito obrigado pela ajuda. Passei para a empresa fornecedora do webservice e pedi para testar o xml gerado em outro programa. Estou aguardando o retorno deles.

    Valeu.

Compartilhe esta Página