Ler XML com TAGS dentro de TAG com TXMLDocument()
Enviado: 19 Mai 2021 15:30
Estou tentando fazer uma integração com um empresa, a api responde somente em XML e não estou conseguindo pegar tags especificas obedecendo os NÓS.
O xml bem simples
Peguei o exemplo postado pelo Itamar e adaptei, mas não consigo obter o resultado que desejo. Para comparar a um xml de NFE é como se em um XML tivesse mais de uma nota onde cada uma tem o campo <det>, queria pegar os valores por nota.
Não sei que consegui passar o que preciso.
O xml bem simples
Aqui faço a procura pela tag <adicionais> acho a primeira e logo em seguindafaço um loop obtendo os valores, o problema é que esta retornando dados dos dois itens, ou seja, 4 tags <adicional> estão sendo lidas para o primeiro item, não sei como respeitar a leitura apenas dentro de cada item. Ele tá lendo de todo o XML.<pedido>
<nroPedido>2464</nroPedido>
<ValorTotal>65.98</ValorTotal>
<DescricaoPagamento>Dinheiro</DescricaoPagamento>
<DataHoraPedido>2021-05-18 15:43:37</DataHoraPedido>
<itens>
<item>
<Codigo>3592</Codigo>
<Descricao>Mussarela c/ alho gratinado</Descricao>
<Quantidade>1</Quantidade>
<ValorUnit>37.99</ValorUnit>
<adicionais>
<adicional>
<Codigo>960</Codigo>
<Descricao>Borda cheddar</Descricao>
<Quantidade>1</Quantidade>
<ValorUnit>0.00</ValorUnit>
</adicional>
<adicional>
<Codigo>962</Codigo>
<Descricao>Mussarela</Descricao>
<Quantidade>1</Quantidade>
<ValorUnit>0.00</ValorUnit>
</adicional>
</adicionais>
</item>
<item>
<Codigo>3593</Codigo>
<Descricao>Calabresa</Descricao>
<Quantidade>1</Quantidade>
<ValorUnit>27.99</ValorUnit>
<adicionais>
<adicional>
<Codigo>961</Codigo>
<Descricao>Borda catupiry</Descricao>
<Quantidade>1</Quantidade>
<ValorUnit>0.00</ValorUnit>
</adicional>
<adicional>
<Codigo>963</Codigo>
<Descricao>Milho</Descricao>
<Quantidade>1</Quantidade>
<ValorUnit>0.00</ValorUnit>
</adicional>
</adicionais>
</item>
</pedido>
Código: Selecionar todos
cStr="arquivo.xml"
oXML := TXMLDocument():New( cStr, HBXML_STYLE_NOESCAPE )
IF oXML:nError != HBXML_ERROR_NONE
alert( oXML:nError )
RETURN
ENDIF
oAdicional:= oXML:findfirst( "adicional" )
DECLARE _aAdc[4]
DO WHILE .T. // comeco dos adicionais
oIteratorAdc := TXmlIterator():New( oAdicional)
DO WHILE .T.
oCurrentAdc := oIteratorAdc:Next()
IF oCurrentAdc == NIL
EXIT
ENDIF
IF oCurrentAdc:cName == "Codigo" //1
_var = se(oCurrentAdc:cData)
_aAdc[1] = val(_var)
ELSEIF oCurrentAdc:cName == "Descricao" //2
_var = se(oCurrentAdc:cData)
_aAdc[2] = _var
ELSEIF oCurrentAdc:cName == "Quantidade" //3
_var = se(oCurrentAdc:cData)
_aAdc[3] = val(_var)
ELSEIF oCurrentAdc:cName == "ValorUnit" //4
_var = se(oCurrentAdc:cData)
_aAdc[4] = val(_var)
ENDIF
ENDDO //adicional
_textoadc=se(_aAdc[3])+"x "+se(_aAdc[2])+chr(13)+chr(10)
wait"saiu de um adicional"
oAdicional := oXML:findnext( "adicional" )
If oAdicional == NIL
exit
EndIf
ENDDO //adicionais
Não sei que consegui passar o que preciso.