Como desaninhar dados em formato XML

Lattes

Suponha que você tenha um arquivo XML como mostrado abaixo e você deseja desaninhar os dados para poder analisa-lós.

Exemplo XML

 <root>
    <src_xml DATA-ATUALIZACAO="2022-02-24" HORA-ATUALIZACAO="12:00:00" NUMERO-IDENTIFICADOR="123" SISTEMA-ORIGEM-XML="SistemaXYZ">
        <PRODUCAO-BIBLIOGRAFICA>
            <ARTIGOS-ACEITOS-PARA-PUBLICACAO>
                <DADOS-BASICOS-DO-ARTIGO ANO-DO-ARTIGO="2021" DOI="..." FLAG-DIVULGACAO-CIENTIFICA="NAO" ...>
                    <!-- outros atributos de DADOS-BASICOS-DO-ARTIGO -->
                </DADOS-BASICOS-DO-ARTIGO>
                <DETALHAMENTO-DO-ARTIGO FASCICULO="..." ISSN="..." ...>
                    <!-- outros atributos de DETALHAMENTO-DO-ARTIGO -->
                </DETALHAMENTO-DO-ARTIGO>
            </ARTIGOS-ACEITOS-PARA-PUBLICACAO>
            <!-- outros elementos de PRODUCAO-BIBLIOGRAFICA -->
        </PRODUCAO-BIBLIOGRAFICA>
    </src_xml>
</root>

Como Desaninhar

Seleção dos Atributos Principais

SELECT 
    src_xml,
    get(src_xml, '@DATA-ATUALIZACAO') as data_atualizacao,
    get(src_xml, '@HORA-ATUALIZACAO') as hora_atualizacao,
    get(src_xml, '@NUMERO-IDENTIFICADOR') as lattes_id,
    get(src_xml, '@SISTEMA-ORIGEM-XML') as sistema_origem_xml,
FROM 
    sua_tabela

Aqui, estamos selecionando os atributos principais diretamente do nó src_xml. A função get é usada para extrair valores de atributos.

Desaninhamento dos Dados Básicos do Artigo:

get(xmlget(src_xml, 'PRODUCAO-BIBLIOGRAFICA/ARTIGOS-ACEITOS-PARA-PUBLICACAO/DADOS-BASICOS-DO-ARTIGO'), '@ANO-DO-ARTIGO') as dados_basicos_ano,
get(xmlget(src_xml, 'PRODUCAO-BIBLIOGRAFICA/ARTIGOS-ACEITOS-PARA-PUBLICACAO/DADOS-BASICOS-DO-ARTIGO'), '@DOI') as dados_basicos_doi,

Aqui, estamos usando a função xmlget para acessar os nós aninhados dentro de src_xml e, em seguida, a função get para extrair atributos específicos desses nós aninhados.

Desaninhamento dos Detalhes do Artigo

get(xmlget(src_xml, 'PRODUCAO-BIBLIOGRAFICA/ARTIGOS-ACEITOS-PARA-PUBLICACAO/DETALHAMENTO-DO-ARTIGO'), '@FASCICULO') as detalhamento_fasciculo,
get(xmlget(src_xml, 'PRODUCAO-BIBLIOGRAFICA/ARTIGOS-ACEITOS-PARA-PUBLICACAO/DETALHAMENTO-DO-ARTIGO'), '@ISSN') as detalhamento_issn

Aqui, estamos fazendo o mesmo processo para desaninhar atributos específicos dentro do nó DETALHAMENTO-DO-ARTIGO.

Ao final do processo do exemplo mostrado acima, a query ira ficar da seguinte maneira:

SELECT 
    src_xml,
    get(src_xml, '@DATA-ATUALIZACAO') as data_atualizacao,
    get(src_xml, '@HORA-ATUALIZACAO') as hora_atualizacao,
    get(src_xml, '@NUMERO-IDENTIFICADOR') as lattes_id,
    get(src_xml, '@SISTEMA-ORIGEM-XML') as sistema_origem_xml,
    get(xmlget(src_xml, 'PRODUCAO-BIBLIOGRAFICA/ARTIGOS-ACEITOS-PARA-PUBLICACAO/DADOS-BASICOS-DO-ARTIGO'), '@ANO-DO-ARTIGO') as dados_basicos_ano,
    get(xmlget(src_xml, 'PRODUCAO-BIBLIOGRAFICA/ARTIGOS-ACEITOS-PARA-PUBLICACAO/DADOS-BASICOS-DO-ARTIGO'), '@DOI') as dados_basicos_doi,
    get(xmlget(src_xml, 'PRODUCAO-BIBLIOGRAFICA/ARTIGOS-ACEITOS-PARA-PUBLICACAO/DETALHAMENTO-DO-ARTIGO'), '@FASCICULO') as detalhamento_fasciculo,
    get(xmlget(src_xml, 'PRODUCAO-BIBLIOGRAFICA/ARTIGOS-ACEITOS-PARA-PUBLICACAO/DETALHAMENTO-DO-ARTIGO'), '@ISSN') as detalhamento_issn
FROM 
    sua_tabela

Em resumo, a consulta SQL está acessando e desaninhando dados de um campo XML chamado src_xml em uma tabela chamada sua_tabela. As funções get e xmlget são usadas para navegar pela estrutura XML e extrair informações específicas para cada atributo que você deseja recuperar. Este é um exemplo genérico e você precisará ajustar o código conforme a estrutura real do seu XML e do seu banco de dados.