1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

Gerar XML no Progress 10

Discussão em 'Progress 4GL' iniciado por lwazevedo, Dezembro 17, 2012.

  1. lwazevedo

    lwazevedo Membro Ativo

    Olá a todos.

    Pessoal venho ate aqui pedir ajuda de vocês novamente, gostaria de saber se alguém tem um exemplo de como
    posso gerar um xml através de uma temp-table conforme abaixo.

    coluna 1 coluna 2 coluna 3 coluna 4
    linha 1 RecordType yyyyyy Texto xxxxxx
    linha 2 RecordType ooooo Texto aaaaaa

    xml

    <linha><recordtype>yyyyyy<recordtype/><texto>xxxxxxx<text/><linha/>
    <linha><recordtype>ooooo<recordtype/><texto>aaaaaaa<text/><linha/>

    desde já agradeço.
  2. costa

    costa Sem Pontuação

    Boa Noite

    Da uma olhada no comando write-xml, com ele você pode criar xml a partir de uma temp-table ou prodataset, tem um exemplo bem simples para começar no help do progress, da uma olhada se tiver algum problema avisa.


    Obrigado
  3. lwazevedo

    lwazevedo Membro Ativo

    Boa Tarde Pessoal.

    Então consegui gerar o XML com este código.

    DEFINE VARIABLE c-msg-xml AS MEMPTR NO-UNDO.
    DEFINE VARIABLE hSAXWriter AS HANDLE NO-UNDO.
    DEFINE VARIABLE lok AS LOGICAL NO-UNDO.
    def var i-cont as int.

    CREATE SAX-WRITER hSAXWriter.
    hSAXWriter:STRICT = FALSE.
    hSAXWriter:FORMATTED = false.
    lok = hSAXWriter:SET-OUTPUT-DESTINATION("MEMPTR",c-msg-xml).
    lok = hSAXWriter:START-DOCUMENT().
    lok = hSAXWriter:START-ELEMENT("soapenv:Envelope").
    lok = hSAXWriter:START-ELEMENT("LinhaList").
    FOR EACH InsAdendo where InsAdendo.ele-cod > 100000
    NO-LOCK:

    lok = hSAXWriter:START-ELEMENT("Linha").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("TipoInterface" , "zf83").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("RecordType" , "Adendo").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Texto" , string(InsAdendo.ele-cod)).
    lok = hSAXWriter:END-ELEMENT("Linha").

    i-cont = i-cont + 1.
    if i-cont > 10 then leave.
    END.
    lok = hSAXWriter:END-ELEMENT("LinhaList").

    lok = hSAXWriter:START-ELEMENT("Trailer").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Usuario" , "luiz.azevedo").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Email" , "luiz.azevedo@ywaysoft.com.br").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Programa" , "guswszf83c").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("TipoTransacao" , "Demanda").
    lok = hSAXWriter:END-ELEMENT("Trailer").

    lok = hSAXWriter:WRITE-DATA-ELEMENT("interface" , "zf83c").

    lok = hSAXWriter:END-ELEMENT("soapenv:Envelope").


    lok = hSAXWriter:END-DOCUMENT().
    DELETE OBJECT hSAXWriter.
    OUTPUT TO "E:\luizAzevedo\XML WebService\XmlTestes\Gera.xml".
    EXPORT c-msg-xml.
    OUTPUT CLOSE.

    E ele me gera o seguinte xml.

    <?xml version="1.0"?><soapenv:Envelope xmlns:soapenv="">
    <LinhasList>
    <Linha>
    <RecordType> Teste </RecordType>
    <Texto> Teste </Texto>
    </Linha>
    </LinhasList>
    <Trailer>
    <Usuario>teste</Usuario>
    <Email>teste</Email>
    <Programa> teste</Programa>
    <TipoTransacao> teste </TipoTransacao>
    </Trailer>
    <Interface> teste </Interface>
    </soapenv:Envelope>

    Porem estou com 2 problemas, um seria a questão do cabeçalho onde ele me gera da seguinte forma

    <?xml version="1.0"?><soapenv:Envelope xmlns:soapenv="">

    e eu preciso desta forma :
    <soapenv:Envelopexmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://www.tempuri.org">

    Já tentei mudar a tag que ele gera, mas ele continua a gerar conforme o primeiro que mostro em azul.

    esse é um, o segundo e que preciso ler este xml após gera-lo e transforma-lo em um string para colocar em uma variavel.

    Alguém poderia me ajudar.
  4. LeandroSantos

    LeandroSantos Membro Participativo

    Veja se é isto que você precisa:
    Código:
    DEFINE VARIABLE c-msg-xml AS MEMPTR NO-UNDO.
    DEFINE VARIABLE hSAXWriter AS HANDLE NO-UNDO.
    DEFINE VARIABLE lok AS LOGICAL NO-UNDO.
    def var i-cont as int.
    
    CREATE SAX-WRITER hSAXWriter.
    hSAXWriter:STRICT = FALSE.
    hSAXWriter:FORMATTED = false.
    lok = hSAXWriter:SET-OUTPUT-DESTINATION("MEMPTR",c-msg-xml).
    lok = hSAXWriter:START-DOCUMENT().
    lok = hSAXWriter:START-ELEMENT("soapenv:Envelope").
    
    lok = hSAXWriter:INSERT-ATTRIBUTE("xmlns:soapenv","http://schemas.xmlsoap.org/soap/envelope/").
    lok = hSAXWriter:INSERT-ATTRIBUTE("xmlns:tem","http://www.tempuri.org").
    
    lok = hSAXWriter:START-ELEMENT("LinhaList").
    FOR EACH InsAdendo where InsAdendo.ele-cod > 100000 NO-LOCK:
    
       lok = hSAXWriter:START-ELEMENT("Linha").
       lok = hSAXWriter:WRITE-DATA-ELEMENT("TipoInterface" , "zf83").
       lok = hSAXWriter:WRITE-DATA-ELEMENT("RecordType" , "Adendo").
       lok = hSAXWriter:WRITE-DATA-ELEMENT("Texto" , string(InsAdendo.ele-cod)).
       lok = hSAXWriter:END-ELEMENT("Linha").
    
       i-cont = i-cont + 1.
       if i-cont > 10 then leave.
    END.
    
    lok = hSAXWriter:END-ELEMENT("LinhaList").
    
    lok = hSAXWriter:START-ELEMENT("Trailer").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Usuario" , "luiz.azevedo").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Email" , "luiz.azevedo@ywaysoft.com.br").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("Programa" , "guswszf83c").
    lok = hSAXWriter:WRITE-DATA-ELEMENT("TipoTransacao" , "Demanda").
    lok = hSAXWriter:END-ELEMENT("Trailer").
    
    lok = hSAXWriter:WRITE-DATA-ELEMENT("interface" , "zf83c").
    
    lok = hSAXWriter:END-ELEMENT("soapenv:Envelope").
    
    lok = hSAXWriter:END-DOCUMENT().
    DELETE OBJECT hSAXWriter.
    OUTPUT TO "E:\luizAzevedo\XML WebService\XmlTestes\Gera.xml".
       EXPORT c-msg-xml.
    OUTPUT CLOSE.
    
    Abs.
  5. lwazevedo

    lwazevedo Membro Ativo

    Obrigado leandro.

    você pode me responder mais algumas duvidas, como posso retirar esta parte do xml <?xml version="1.0"?> quando ele e gerado. outra coisa
    tu sabe me dizer como posso enviar este xml para um webserve, no momento estou enviando via este comando.

    RUN Executar IN hConsultaValorPortType(input ConsultaValorEnvia,
    output ConsultaValorResponse).


    onde a variável ConsultaValorEnvia recebe um xml montado a mão, e eu gostaria de enviar este xml que estou criando.

    desde já agraço.

Compartilhe esta Página