Olá Hasa!
Perdoe-me pela demora.
Quando vi o teu
post, lembrei-me de um trabalho que fiz para tratar um XML retornado pela consulta Confie Geral da Serasa.
Semelhante ao teu caso, onde existem várias ocorrências do bloco Dup, no meu caso existiam
n ocorrências do bloco com informações referentes à Inscrição Estadual (lembrando que um único CNPJ pode ter várias Inscrições Estaduais).
No código abaixo, eu procurei a primeira ocorrência da
tag que me interessava, e fiz um
loop no XML extraindo o que precisava, procurando a próxima ocorrência da
tag, até não existir mais. O parâmetro oXmlDoc é um objeto TXmlDocument(), onde foi carregado o conteúdo XML retornado pela Serasa.
Dê uma analisada pois o princípio é o mesmo. Depois podemos analisar o teu XML e adaptar.
Código: Selecionar todos
Method extractIEInfo( oXmlDoc ) CLASS ConsultaConfieGeral
LOCAL oXmlNode, oXmlIter, oNode, hIe := Hash(), nIe, cName, cData
oXmlNode := oXmlDoc:findFirst( "regsinsituacao1" )
oXmlIter := TXmlIterator():new( oXmlNode )
oNode := oXmlIter:getNode()
While oNode != NIL
oXmlIter := TXmlIteratorScan():new( oNode )
Do Case
Case oNode:cName == "regsinsituacao1"
// insere um novo elemento na hash table ( a chave eh a IE )
nIe := Val( oXmlIter:find( "NO_INSC" ):cData )
If .Not. HHasKey( hIe, nIe )
hIe[ nIe ] := AFill( Array( K_COUNT ), "" )
EndIf
hIe[ nIe ][ K_DT_SITUA ] := ::extract( NIL, "DT_SITUA", NIL, oNode )
hIe[ nIe ][ K_DS_SITUA ] := ::extract( NIL, "DS_SITUA", NIL, oNode )
Case oNode:cName == "regsinsituacao2"
hIe[ nIe ][ K_NO_INSCR_EDIT ] := ::extract( NIL, "NO_INSCR_EDIT", NIL, oNode )
hIe[ nIe ][ K_CODSIT ] := ::extract( NIL, "CODSIT", NIL, oNode )
Case oNode:cName == "regsinidentificacao1"
hIe[ nIe ][ K_RAZAO_SOCIAL ] := ::extract( NIL, "NO_COMPLETO", NIL, oNode )
Case oNode:cName == "regsinidentificacao2"
hIe[ nIe ][ K_RAZAO_SOCIAL ] += ::extract( NIL, "NO_COMPLETO", NIL, oNode ) // concatena... (+=)
Case oNode:cName == "regsinendereco1"
hIe[ nIe ][ K_DE_ENDERECO ] := ::extract( NIL, "DE_ENDERECO", NIL, oNode )
hIe[ nIe ][ K_NO_ENDERECO ] := ::extract( NIL, "NO_ENDERECO", NIL, oNode )
hIe[ nIe ][ K_CO_UF ] := ::extract( NIL, "CO_UF", NIL, oNode )
Case oNode:cName == "regsinendereco2"
hIe[ nIe ][ K_CO_ENDERECO ] := ::extract( NIL, "CO_ENDERECO", NIL, oNode )
hIe[ nIe ][ K_NO_BAIRRO ] := ::extract( NIL, "NO_BAIRRO", NIL, oNode )
hIe[ nIe ][ K_NO_MUNICIPIO ] := ::extract( NIL, "NO_MUNICIPIO", NIL, oNode )
hIe[ nIe ][ K_CEP ] := ::extract( NIL, "CEP", NIL, oNode )
hIe[ nIe ][ K_IBGE ] := ::extract( NIL, "IBGE", NIL, oNode )
Case oNode:cName == "regsinativiecon1"
hIe[ nIe ][ K_DE_ATIV_ECO ] := ::extract( NIL, "DE_ATIV_ECO", NIL, oNode )
Case oNode:cName == "regsinativiecon2"
hIe[ nIe ][ K_DE_ATIV_ECO ] += ::extract( NIL, "DE_ATIV_ECO", NIL, oNode ) // concatena... (+=)
hIe[ nIe ][ K_CNAE ] := ::extract( NIL, "CNAE", NIL, oNode )
Case oNode:cName == "regsinoutrasinfo1"
hIe[ nIe ][ K_NFE ] := ::extract( NIL, "NFE", NIL, oNode )
Case oNode:cName == "regsinoutrasinfo2"
hIe[ nIe ][ K_ENQUADRA ] := ::extract( NIL, "ENQUADRA", NIL, oNode )
hIe[ nIe ][ K_OPT_SIMPLES ] := ::extract( NIL, "SIMPLES", NIL, oNode )
Case oNode:cName == "regsinendpadronizado"
hIe[ nIe ][ K_TPLOGR ] := ::extract( NIL, "TPLOGR" , NIL, oNode )
hIe[ nIe ][ K_LOGRADOURO ] := ::extract( NIL, "LOGRADOURO", NIL, oNode )
EndCase
oNode := oNode:oNext()
EndDo
::hInfoIE := hIe
::determinarIEAtiva()
RETURN
//------------------------------------------------------------------------------
Method extract( cTag, cAttrib, oXmlDoc, oNode ) CLASS ConsultaConfieGeral
// retornar o valor da tag/item solicitados.
// Nota: tag/item tem tratamento "Case-Sensitive"
LOCAL cRet, oXmlNode, oXmlIter
DEFAULT oXmlDoc TO ::oXMLContent
DEFAULT cTag TO ""
DEFAULT cAttrib TO ""
If oNode == NIL
If ( oXmlDoc != NIL )
If ! Empty( oXmlDoc ) .And. ! Empty( cTag ) .And. ! Empty( cAttrib )
oXmlNode := oXmlDoc:findFirst( cTag )
If oXmlNode != NIL
oXmlIter := TXmlIteratorScan():new( oXmlNode )
oXmlNode := oXmlIter:find( cAttrib )
//
If oXmlNode != NIL
cRet := oXmlNode:cData
EndIf
//
EndIf
EndIf
EndIf
Else
oXmlIter := TXmlIteratorScan():new( oNode )
oXmlNode := oXmlIter:find( cAttrib )
If oXmlNode != NIL
cRet := oXmlNode:cData
EndIf
EndIf
RETURN If( Empty( cRet ), "", cRet )
//------------------------------------------------------------------------------
Boa sorte!