Geração de Arquivo XML

Discussão em 'Progress 4GL' iniciado por eder.luca2012, Janeiro 2, 2013.

  1. eder.luca2012

    eder.luca2012 Membro Participativo

    Boa Noite

    Pessoal Preciso de uma ajuda um cliente solicitou à extração dos dados para um determinado bi, onde vou precisar extrair as informações do banco e gerar arquivo xml da mesma para importação nesse bi gostaria de saber alguém tem experiência com xml e poderia me ajudar a como gerar o arquivo xml, pois já sei todas às as tabelas que irei precisar para realizar a geração do mesmo mas não sei como gerar o arquivo xml em sim alguem poderia me ajduar?
  2. lwazevedo

    lwazevedo Membro Ativo

    Segue abaixo um exemplo.....mas se precisar de maiores informações você pode consultar o help, pois existem várias formas de gerar o xml, essa é apenas uma....


    /*Variáveis para o xml*/

    DEFINE VARIABLE hDocxml AS HANDLE NO-UNDO.
    DEFINE VARIABLE hRootxml AS HANDLE NO-UNDO.
    DEFINE VARIABLE hRow AS HANDLE NO-UNDO.
    DEFINE VARIABLE hRow1 AS HANDLE NO-UNDO.
    DEFINE VARIABLE hRow2 AS HANDLE NO-UNDO.
    DEFINE VARIABLE hRow3 AS HANDLE NO-UNDO.
    DEFINE VARIABLE hField AS HANDLE NO-UNDO.
    DEFINE VARIABLE hText AS HANDLE NO-UNDO.
    DEFINE VARIABLE hBuf AS HANDLE NO-UNDO.
    DEFINE VARIABLE hDBFld AS HANDLE NO-UNDO.
    DEFINE VARIABLE ix AS INTEGER NO-UNDO.
    DEFINE VARIABLE longstring AS LONGCHAR NO-UNDO.



    /*Cria os objetos para o xml.*/
    CREATE X-DOCUMENT hDocxml.
    CREATE X-NODEREF hRootxml.
    CREATE X-NODEREF hRow.
    CREATE X-NODEREF hRow1.
    CREATE X-NODEREF hRow2.
    CREATE X-NODEREF hRow3.
    CREATE X-NODEREF hField.
    CREATE X-NODEREF hText.

    /*Cria um buffer para usar mais a frente pode ser sua temp-table ou sua propria tabela.*/
    hBuf = BUFFER SuaTabela:HANDLE.

    /*Cria a tag principal ou seja tag mae*/

    hDocxml:CREATE-NODE(hRootxml,"TagMae","ELEMENT").
    hDocxml:APPEND-CHILD(hRootxml).

    /*Se precisar inserir alguma coisa dentro da tag exemplo <tag xxxx= yyyy ></tag> use este comando.*/
    hRootxml:set-attribute("xxxx","yyyy").

    /*Cria a tag filha da tag principal (tag mae que foi criada acima)*/
    hDocxml:CREATE-NODE(hRow,"FilhaTagMae","ELEMENT").
    hRootxml:APPEND-CHILD(hRow).

    /*For each da Da sua tabela que deseja gerar o xml*/
    FOR EACH SuaTabela:
    /*cria uma tag filha para a tag FilhaTagMae*/
    hDocxml:CREATE-NODE(hRow1,"SubFilha","ELEMENT").
    hRow:APPEND-CHILD(hRow1).

    /*Faz o repeat conforme o numero de campos que existir no buffer criado acima*/
    REPEAT ix = 1 TO hBuf:NUM-FIELDS:

    /*Criar um buffer dos campos*/
    hDBFld = hBuf:BUFFER-FIELD(ix).
    /*verifica se existe o campo passado da tabela no buffer*/
    IF hDBFld:NAME = "SuaTabela.PrimeiroCampo" OR hDBFld:NAME = "Name" THEN NEXT.
    /*Aqui ele cria as tags conforme os campos Existentes na Sua tabela*/
    hDocxml:CREATE-NODE(hField, hDBFld:NAME, "ELEMENT").
    hRow1:APPEND-CHILD(hField).
    /*cria A variavel para iserir valor*/
    hDocxml:CREATE-NODE(hText, "", "TEXT").
    hField:APPEND-CHILD(hText).
    /*Insere o valor nas tags*/
    hText:NODE-VALUE = STRING(hDBFld:BUFFER-VALUE).

    END. /*Fim do repeatt*/
    end. /*Fim do for each */


    /*Aqui é um exemplo de como criar uma parte estatica do xml
    não é muito dificil, apenas tem que fazer a assossiação dos filhos com os pais.*/


    hDocxml:CREATE-NODE(hRow2,"SubTag","ELEMENT").
    hRootxml:APPEND-CHILD(hRow2).

    hDocxml:CREATE-NODE(hRow1,"Filha1","ELEMENT").
    hRow2:APPEND-CHILD(hRow1).
    hDocxml:CREATE-NODE(hText, "", "TEXT").
    hRow1:APPEND-CHILD(hText).
    hText:NODE-VALUE = /*Valor que a tag vai receber*/.


    hDocxml:CREATE-NODE(hRow1,"Filha2","ELEMENT").
    hRow2:APPEND-CHILD(hRow1).
    hDocxml:CREATE-NODE(hText, "", "TEXT").
    hRow1:APPEND-CHILD(hText).
    hText:NODE-VALUE = /*Valor que a tag vai receber*/.

    hDocxml:CREATE-NODE(hRow1,"Filha3","ELEMENT").
    hRow2:APPEND-CHILD(hRow1).
    hDocxml:CREATE-NODE(hText, "", "TEXT").
    hRow1:APPEND-CHILD(hText).
    hText:NODE-VALUE = /*Valor que a tag vai receber*/.

    hDocxml:CREATE-NODE(hRow1,"Filha4","ELEMENT").
    hRow2:APPEND-CHILD(hRow1).
    hDocxml:CREATE-NODE(hText, "", "TEXT").
    hRow1:APPEND-CHILD(hText).
    hText:NODE-VALUE = /*Valor que a tag vai receber*/.

    hDocxml:CREATE-NODE(hRow3,"SubTag1","ELEMENT").
    hRootxml:APPEND-CHILD(hRow3).
    hDocxml:CREATE-NODE(hText, "", "TEXT").
    hRow3:APPEND-CHILD(hText).
    hText:NODE-VALUE = /*Valor que a tag vai receber*/.

    /*Aqui vai o diretorio que deseja salvar o aqurquivo xml*/
    hDocxml:SAVE("file":U,"C:\Pastas\NomedoArquivo.xml":U).

    /*Aqui ele transforma o xml em uma longstring isso serve para enviar para webservice*/
    /*hDocxml:SAVE("longchar", ConsultaValorEnvia).*/



    /*Deleta os objetos da menoria.*/
    DELETE OBJECT hDocxml.
    DELETE OBJECT hRootxml.
    DELETE OBJECT hRow.
    DELETE OBJECT hRow1.
    DELETE OBJECT hRow2.
    DELETE OBJECT hField.
    DELETE OBJECT hText.


    /*Espero que ajude, se tiver mais dúvidas poste novamente......*/
  3. eder.luca2012

    eder.luca2012 Membro Participativo

    Uma pergunta me enviaram um arquivo xsd e me disseram que ele é um arquivo de modelo como faço para gerar o xml usando o xsd?
  4. lwazevedo

    lwazevedo Membro Ativo

    Caro amigo,

    Não sei que arquivo é este que você mencionou, mas vou tentar explicar como montei o meu com o exemplo que postei antes.

    Primeiro eu recebi um arquivo de exemplo wsdl que é como eu deveria montar o xml para enviar para o web serveci conformes este arquivo de exemplo.

    Bom vamos supor que meu arquivo de exemplo seja este

    <tag mae>
    <tag filha 1> valor </ tag filha 1>
    <tag filha 2> valor 1 </tag filha 2>

    </tag mae>

    então eu criei uma temp-table com os valore respectivos as tags filhas, pois a tag mae eu teria que criar estática e não dinamica.
    então você poderia criar um temp com os campos que devem ser dinamicos, e o que são estaticos no braço.

    no post anterior mostro as duas formas de criar tanto dinamico como estatico.

    se tiver mais uma duvida posta novamente.

    mas não e dificil, se você ver bem o exemplo anterior e so substituir o nome da tabela pela sua temp, e colocar os campos estatiticos você faz no braço.

Compartilhe esta Página