Estou precisando de uma ajuda para utilizar a classe tXMLManager, meu problema é quando o XML possui um elemento com vários itens (como um array), com o exemplo abaixo eu até consegui ler o elemento [1], porém quando passa para o segundo em diante ele simplesmente não retorna nada. Alguém sabe dizer como faz para ler os demais elementos do XML? A documentação é muito pouca e não mostra como realmente fazer, apenas diz o que cada método faz sem um exemplo muito claro.
OBS.: O fonte está bem resumido só para exemplicar a situação.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns1:averbaNFeResponse xmlns:ns1="urn:ATMWebSvr">
<Response>
<Numero>92248</Numero>
<Serie>1</Serie>
<Filial/>
<CNPJCli>08348609000168</CNPJCli>
<TpDoc>3</TpDoc>
<Erros>
<Erro>
<Codigo>034</Codigo>
<Descricao>Documento com data de emissao superior a 90 dias.</Descricao>
<ValorInformado>2021-11-20</ValorInformado>
</Erro>
<Erro>
<Codigo>035</Codigo>
<Descricao>erro de teste</Descricao>
<ValorInformado>2021-12-20</ValorInformado>
</Erro>
</Erros>
</Response>
</ns1:averbaNFeResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
cErro := ''
oXML := tXMLManager():New()
oXML:Parse(cXml)
oXML:XPathRegisterNs( "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" )
oXML:XPathRegisterNs( "ns1", "urn:ATMWebSvr" )
For nX := 1 to oXML:XPathChildCount('/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:averbaNFeResponse/Response/Erros')
cErro += oXML:XPathGetNodeValue('/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:averbaNFeResponse/Response/Erros['+Ltrim(Str(nX))+']/Descricao')+CRLF
Next
Cirilo,
Abaixo um exemplo de como efetuar a leitura de um array, utilizando o método XPathGetNodeValue e também com o método XPathGetChildArray:
//-------------------------------------------------------------------
/*/{Protheus.doc} u_xmlMngrExample
Exemplo de utilização da classe TXMLManager
@author Daniel Mendes
@since Jun 10, 2022
@version 1.0
/*/
//-------------------------------------------------------------------
function u_xmlMngrExample()
local cErro as character
local oXml as object
local cXml as character
local nX as numeric
local cBreakLine as character
local aErro as array
begincontent var cXml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<ns1:averbaNFeResponse xmlns:ns1="urn:ATMWebSvr">
<Response>
<Numero>92248</Numero>
<Serie>1</Serie>
<Filial />
<CNPJCli>08348609000168</CNPJCli>
<TpDoc>3</TpDoc>
<Erros>
<Erro>
<Codigo>034</Codigo>
<Descricao>Documento com data de emissao superior a 90 dias.</Descricao>
<ValorInformado>2021-11-20</ValorInformado>
</Erro>
<Erro>
<Codigo>035</Codigo>
<Descricao>erro de teste</Descricao>
<ValorInformado>2021-12-20</ValorInformado>
</Erro>
</Erros>
</Response>
</ns1:averbaNFeResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
endcontent
cBreakLine := CRLF
oXML := TXMLManager():new()
oXML:parse(cXml)
oXML:XPathRegisterNs( "SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/" )
oXML:XPathRegisterNs( "ns1", "urn:ATMWebSvr" )
//Exemplo utilizando o método XPathGetNodeValue
cErro := ""
for nX := 1 to oXML:XPathChildCount("/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:averbaNFeResponse/Response/Erros")
cErro += oXML:XPathGetNodeValue("/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:averbaNFeResponse/Response/Erros/Erro[" + cValToChar(nX) + "]/Descricao") + cBreakLine
next
conOut(cErro)
//Exemplo utilizando o método XPathGetChildArray
cErro := ""
for nX := 1 to oXML:XPathChildCount("/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:averbaNFeResponse/Response/Erros")
aErro := oXML:XPathGetChildArray("/SOAP-ENV:Envelope/SOAP-ENV:Body/ns1:averbaNFeResponse/Response/Erros/Erro[" + cValToChar(nX) + "]")
/*
aErro[nPropriedade][1] = Nome da propriedade
aErro[nPropriedade][1] = XPath
aErro[nPropriedade][3] = Valor
*/
//Posição 2 contém os dados da descrição e acesso a terceira posição, temos o valor
cErro += aErro[2][3] + cBreakLine
next
conOut(cErro)
freeObj(oXML)
return
Documentação: https://tdn.totvs.com/display/tec/Classe+TXmlManager
Valeu pela força, entendi o meu erro, eu estava colocando o índice [nx] na posição errada.