Ler xml com diversos niveis

Delphi

XML

18/10/2018

Boa tarde.
Preciso ler os seguintes tags
codigoncm - pegar o conteúdo desse campo,
listaAtributos
atributo
codigo - pegar o conteúdo desse campo
dominio
itemDominio
codigo - pegar o conteudo desse campo

o xml é esse abaixo, ja tentei de diversas maneiras mas não conseguí chegar a um resultado.
Desde ja agradeço qualquer ajuda

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConsultaAtributoNcmResponse>
    <listaNcm>
        <ncm>
            <codigoNcm>0101.21.00</codigoNcm>
            <listaAtributos>
                <atributo>
                    <codigo>ATT_1</codigo>
                    <nomeApresentacao>Destaque</nomeApresentacao>
                    <tipoAtributo>Simples</tipoAtributo>
                    <orientacaoPreenchimento>Escolher apenas um Destaque</orientacaoPreenchimento>
                    <formaPreenchimento>Lista estática</formaPreenchimento>
                    <modalidade>Exportação</modalidade>
                    <obrigatorio>true</obrigatorio>
                    <dataInicioVigencia>2014-10-23T00:00:00-02:00</dataInicioVigencia>
                    <dominio>
                        <itemDominio>
                            <codigo>01</codigo>
                            <descricao>EXCETO DE ESPÉCIES DOMÉSTICAS, CONFORME PORTARIA IBAMA 93/98</descricao>
                        </itemDominio>
                        <itemDominio>
                            <codigo>99</codigo>
                            <descricao>DEMAIS</descricao>
                        </itemDominio>
                    </dominio>
                    <objetivos>
                        <objetivo>
                            <codigo>3</codigo>
                            <descricao>Tratamento administrativo</descricao>
                        </objetivo>
                    </objetivos>
                    <orgaos>
                        <orgao>SECEX</orgao>
                        <orgao>IBAMA</orgao>
                    </orgaos>
                    <formaPreenchimentoAtributo>LISTA_ESTATICA</formaPreenchimentoAtributo>
                </atributo>
            </listaAtributos>
        </ncm>
        <ncm>
            <codigoNcm>0101.29.00</codigoNcm>
            <listaAtributos>
                <atributo>
                    <codigo>ATT_2</codigo>
                    <nomeApresentacao>Destaque</nomeApresentacao>
                    <tipoAtributo>Simples</tipoAtributo>
                    <orientacaoPreenchimento>Escolher apenas um Destaque</orientacaoPreenchimento>
                    <formaPreenchimento>Lista estática</formaPreenchimento>
                    <modalidade>Exportação</modalidade>
                    <obrigatorio>true</obrigatorio>
                    <dataInicioVigencia>2014-10-23T00:00:00-02:00</dataInicioVigencia>
                    <dominio>
                        <itemDominio>
                            <codigo>01</codigo>
                            <descricao>EXCETO DE ESPÉCIES DOMÉSTICAS, CONFORME PORTARIA IBAMA 93/98</descricao>
                        </itemDominio>
                        <itemDominio>
                            <codigo>99</codigo>
                            <descricao>DEMAIS</descricao>
                        </itemDominio>
                    </dominio>
                    <objetivos>
                        <objetivo>
                            <codigo>3</codigo>
                            <descricao>Tratamento administrativo</descricao>
                        </objetivo>
                    </objetivos>
                    <orgaos>
                        <orgao>SECEX</orgao>
                        <orgao>IBAMA</orgao>
                    </orgaos>
                    <formaPreenchimentoAtributo>LISTA_ESTATICA</formaPreenchimentoAtributo>
                </atributo>
            </listaAtributos>
        </ncm>
Osvaldo Anjo

Osvaldo Anjo

Curtidas 0

Respostas

Osvaldo Anjo

Osvaldo Anjo

18/10/2018

Boa tarde

Consegui resolver da seguinte forma.
vXMLDoc:= TXMLDocument.create (nil);
vXMLDoc.Active:= false;
vxmlDoc.LoadFromFile(OpenDialog1.FileName);
vXMLDoc.Active:= true;

NodePai :=vXMLDoc.DocumentElement.childNodes.FindNode('listaNcm');
if not (nodepai = nil) then
begin
NodePai.ChildNodes.First;
NodeNcm :=nodePai.childNodes.FindNode('ncm');
NodeNcm.ChildNodes.First;
if not (NodeNCM = nil) then
begin
codigo:=NodeNcm.ChildNodes['codigoNcm'].Text;
NodeNcm.ChildNodes.First;
repeat
codigo := NodeNcm.ChildNodes['codigoNcm'].text;
if codigo <> '' then
begin
atributo:='';
dominio:='';

codigo:=NodeNcm.ChildNodes['codigoNcm'].Text;
NodeListaAtrib :=nodeNcm.childNodes.FindNode('listaAtributos');
NodeListaAtrib.ChildNodes.First;
if not (NodeListaAtrib = nil) then
begin
nodeAtrib:=nodeListaAtrib.ChildNodes.FindNode('atributo');
if nodeAtrib <> nil then
begin
nodeAtrib.ChildNodes.First;
if not (nodeAtrib = nil) then
begin
atributo:=NodeAtrib.ChildNodes['codigo'].Text;

nodeDominio:=nodeAtrib.ChildNodes.FindNode('dominio');
nodeDominio.ChildNodes.First;
if not (nodeDominio = nil) then
begin
nodeItemDominio:=nodeDominio.ChildNodes.FindNode('itemDominio');
nodeItemDominio.ChildNodes.First;
if not (nodeItemDominio = nil) then
begin
dominio:=nodeItemDominio.ChildNodes['codigo'].Text;
repeat
dominio:=nodeItemDominio.ChildNodes['codigo'].Text;
if dominio <> '' then
begin
dominio:=nodeItemDominio.ChildNodes['codigo'].Text;
end;
nodeItemDominio := nodeItemDominio.NextSibling;
until nodeItemDominio = nil;
end;
end;
end;
end;
end;

end;
memo1.Lines.Add('ncm: '+codigo+' Atributo: '+atributo+' Domínio: ' +dominio);
NodeNcm := NodeNcm.NextSibling;
until NodeNcm = nil; //Repeat
end;
end;
vXMLDoc.Active:= False;
vXMLDoc:= nil;


GOSTEI 0
POSTAR