Leitura de Linha Especifica no XML

Discussão em 'Progress 4GL' iniciado por kleberdomingos, Maio 30, 2012.

  1. kleberdomingos

    kleberdomingos Sem Pontuação

    Prezados, bom dia!

    Estou trabalhando com um código progress para ler arquivo xml e retornar os dados em TXT, conforme abaixo:

    Código:
       DEFINE VARIABLE hDoc AS HANDLE.
        DEFINE VARIABLE hRoot AS HANDLE.
        def var cartao as char format "x(20)".
    
    CREATE X-DOCUMENT hDoc.
    CREATE X-NODEREF hRoot.
    
        DEFINE VARIABLE hBuf AS HANDLE NO-UNDO.
        DEFINE VARIABLE nome AS CHARACTER NO-UNDO.
        DEFINE VARIABLE c-campo AS CHARACTER NO-UNDO.
        DEFINE VARIABLE c-arquivo AS CHARACTER NO-UNDO.
        DEFINE VARIABLE c-log AS CHARACTER NO-UNDO.
    
    DEFINE TEMP-TABLE mensagem NO-UNDO
        FIELD nome AS char format "x(30)"
        FIELD cpf AS char format "x(14)"
        FIELD codigoBeneficiario as char format "x(20)"
        FIELD dataContratacao as char format "x(10)"
        FIELD dataCancelamento as char format "x(10)"
        
        FIELD numeroPlanoANS   as char format "x(09)".
    
    hDoc:LOAD("file","c:\sib\conf.xml",FALSE).
    hDoc:GET-DOCUMENT-ELEMENT(hRoot).
    
    RUN GetChildren(hRoot, 1).
    
    output to \sib\testes-xml-ANS.txt.
    
    FOR EACH mensagem:
    
    DISPLAY 
    
    mensagem
    with scrollable stream-io.
    
    
    END.
    
    
    DELETE OBJECT hDoc.
    DELETE OBJECT hRoot.
    
    PROCEDURE GetChildren:
        DEFINE INPUT PARAMETER hParent AS HANDLE.
        DEFINE INPUT PARAMETER level AS INTEGER.
        
        DEFINE VARIABLE i-cont AS INTEGER.
        DEFINE VARIABLE hNoderef AS HANDLE.
        DEFINE VARIABLE hDBFld AS HANDLE.
        
        DEFINE VARIABLE good AS LOGICAL.
        
        DEFINE VARIABLE texto AS CHARACTER NO-UNDO.
    
    CREATE X-NODEREF hNoderef.
    
    REPEAT i-cont = 1 TO hParent:NUM-CHILDREN:
    good = hParent:GET-CHILD(hNoderef,i-cont).
    IF NOT good THEN LEAVE.
    
    IF hNoderef:NAME <> '#Text' THEN
    nome = hNoderef:NAME.
    
    IF hNoderef:NAME = 'identificacao' THEN DO:
    CREATE mensagem.
    hBuf = BUFFER mensagem:HANDLE.
    END.
    
    IF hNoderef:SUBTYPE = "text" AND hParent:NAME = nome THEN DO:
    
    texto = hNoderef:NODE-VALUE.
    
    ASSIGN c-campo = STRING(hBuf:BUFFER-FIELD(nome)) NO-ERROR.
    
    IF c-campo <> ? THEN DO:
    hDBFld = hBuf:BUFFER-FIELD(nome).
    hDBFld:BUFFER-VALUE = hNoderef:NODE-VALUE.
    END.
    END.
    RUN GetChildren(hNoderef, (level + 1)).
    END.
    DELETE OBJECT hNoderef.
    END PROCEDURE.  
    
    
    Agora o exemplo da composicao do arquivo XML:

    Código:
     <mensagem>
     <ansParaOperadora>
     <conferencia>
     <beneficiario cco="123456789012" situacao="INATIVO" dataAtualizacao="2000-01-01">
     <identificacao>
      <cpf>01234567890</cpf> 
      <pisPasep>12345678901</pisPasep> 
      <nome>FULANO SILVA E SILVA</nome> 
      <sexo>3</sexo> 
      <dataNascimento>1960-01-01</dataNascimento> 
      <nomeMae>BELTRANO SILVA E SILVA</nomeMae> 
      </identificacao>
     <endereco>
      <logradouro>RUA VII DE SETEMBRO, 1000</logradouro> 
      <bairro>JD INDEPENDENCIA</bairro> 
      <codigoMunicipio>999999</codigoMunicipio> 
      <cep>71000000</cep> 
      <resideExterior>0</resideExterior> 
      </endereco>
     <vinculo>
      <codigoBeneficiario>9991234567891234</codigoBeneficiario> 
      <dataContratacao>1999-05-15</dataContratacao> 
      <dataCancelamento>2004-04-15</dataCancelamento> 
      <numeroPlanoANS>999999999</numeroPlanoANS> 
      </vinculo>
      </beneficiario>
    Ocorre que, para os campos a partir da tag "identificacao" consigo retornar todos, contudo, preciso de uma tag importante que não estou conseguindo retornar, que é essa linha, mais especificamente o "beneficiario cco":

    Código:
     <beneficiario cco="123456789012" situacao="INATIVO" dataAtualizacao="2000-01-01">
    .

    Gostaria de saber se existe uma alternativa a ser incluida no código progress para que esse campo fosse retornado.

    Desde já agradeço o tempo dispensado!
  2. cauepor

    cauepor Sem Pontuação

    Não manjo muito de xml, mas sua tag de fechamento nao deveria estar igual a de abertura?

    <beneficiario cco="123456789012" situacao="INATIVO" dataAtualizacao="2000-01-01"> </beneficiario cco="123456789012" situacao="INATIVO" dataAtualizacao="2000-01-01">

    e se vc precisa do cco, situacao, dataAtualizacao isso não deveriam ser "filhos" de uma tag <beneficiario></beneficiario> ?

    me parece que vc esta tentando obter informacao do nome da tag e nao do conteudo dela...
  3. mosmendes

    mosmendes Sem Pontuação

    Tente usar o comando get-attribute:
    h-filho:get-attribute("xmlns")

Compartilhe esta Página