Problema leitura elementos array XML com tXMLManager

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.