Deserialização objeto XML ADVPL

Olá Pessoal, queria deserializar um objeto XML, queria exemplos de como fazer isso. Sou nova em Advpl. se alguém tiver algum fonte que possa compartilhar agradeço!

Para fazer a serialização do meu objeto eu sigo exatamente esse exemplo aqui do fórum mesmo:

https://devforum.totvs.com.br/880-serializar-objeto-para-xml

Minha String está assim:


"<?xml version="1.0"?>
<NFLNFEENTITY>

    <AITENSNF>
        <NFLNFEITEMENTITY>
                            <CCFOP>5102</CCFOP>
                            <CCHAVE>35220702290277002922550010001376881136082394</CCHAVE>
                            <CCODFOR>30220331                      </CCODFOR>
                            <CDESCPRODUTO>TESTE MONITOR                 </CDESCPRODUTO>
                            <CDESCRI>SAQUINHO PARA DESCARTE DE ABSORVENTE 10 REFIS COM 60 UNIDADES                                       </CDESCRI>
                            <CNCM>39232110  </CNCM>
                            <CPEDIDO></CPEDIDO>
                            <CPRODUTO>000000000000028</CPRODUTO>
                            <CUNIDADE_MEDIDA>CX</CUNIDADE_MEDIDA>
                            <CVALOR_TOTAL>144.95</CVALOR_TOTAL>
                            <CVALOR_UNIDADE>144.95</CVALOR_UNIDADE>
                            <NCOD_FCI>               </NCOD_FCI>
                            <NITEM>0001</NITEM>
                            <NQUANT_ITENS>1</NQUANT_ITENS>

        </NFLNFEITEMENTITY>

    </AITENSNF>

<CNOME>fornecedorA                </CNOME>

<NCNPJ>123456789101112</NCNPJ>

<NNUMNF>35220702290277002922550010001376881136082394</NNUMNF>


</NFLNFEENTITY>"

Utilizo o exemplo que está no link para pegar o conteúdo e gerar minha string.

Agora o trecho que utilizo para deserializar, string para objeto XML:


If MsgYesNo("Deseja Salvar as Alterações? ","Salvar")
        cSerializa := oNfeEntity:toXml()   //Método que está no Link -> toXml()
        MsgInfo(cSerializa)   //Apresenta todos os dados do XML

            //Gera o Objeto XML
            oXml := XmlParser( cSerializa, "_", @cError, @cWarning )    

            If (oXml == NIL )
                MsgStop("Falha ao gerar Objeto XML : "+cError+" / "+cWarning)
                Return
            Endif

        cTeste := Alltrim(oXml:_NFLNFEENTITY:_AITENSNF:_NFLNFEITEMENTITY:_CDESCRI:TEXT)
             MsgInfo(cTeste) 

    EndIf

Alguns pontos que preciso entender da Deserialização:

Primeiro ponto, não sei se a deserialização está correta.

Segundo ponto, não consigo apresentar nenhum dado da String (cTeste) seguindo o caminho das tags XML.

Eduarda, você tem um objeto XML e quer fazer ele virar uma string? Ou você tem uma string e quer fazer ele virar um objeto? Caso você já possua um objeto XML, como ele foi gerado?

Olá Daniel, eu tenho uma String e quero que ele vire um objeto

Eduarda,

Para transformar uma string em um XML, existe a função XmlParser:

https://tdn.totvs.com/display/tec/XmlParser

Ela vai criar um objeto com base no XML enviado como parâmetro. Exemplo:


//-------------------------------------------------------------------
/*/{Protheus.doc} u_xmlObj
Exemplo de utilização da função XmlParser

@author Daniel Mendes
@since Dec 19, 2022
@version 1.0
/*/
//-------------------------------------------------------------------
function u_xmlObj()
local cXml as character
local oXml as object
local cReplace as character
local cError as character
local cWarning as character

begincontent var cXml
    <?xml version="1.0"?>
    <NFLNFEENTITY>
        <AITENSNF>
            <NFLNFEITEMENTITY>
                                <CCFOP>5102</CCFOP>
                                <CCHAVE>35220702290277002922550010001376881136082394</CCHAVE>
                                <CCODFOR>30220331                      </CCODFOR>
                                <CDESCPRODUTO>TESTE MONITOR                 </CDESCPRODUTO>
                                <CDESCRI>SAQUINHO PARA DESCARTE DE ABSORVENTE 10 REFIS COM 60 UNIDADES                                       </CDESCRI>
                                <CNCM>39232110  </CNCM>
                                <CPEDIDO></CPEDIDO>
                                <CPRODUTO>000000000000028</CPRODUTO>
                                <CUNIDADE_MEDIDA>CX</CUNIDADE_MEDIDA>
                                <CVALOR_TOTAL>144.95</CVALOR_TOTAL>
                                <CVALOR_UNIDADE>144.95</CVALOR_UNIDADE>
                                <NCOD_FCI>               </NCOD_FCI>
                                <NITEM>0001</NITEM>
                                <NQUANT_ITENS>1</NQUANT_ITENS>

            </NFLNFEITEMENTITY>
        </AITENSNF>
        <CNOME>fornecedorA                </CNOME>
        <NCNPJ>123456789101112</NCNPJ>
        <NNUMNF>35220702290277002922550010001376881136082394</NNUMNF>
    </NFLNFEENTITY>
endcontent

cReplace := "_"
cError := ""
cWarning := ""

oXml := XmlParser(cXml, cReplace, @cError, @cWarning)

if oXml == nil
    ConErr(cError)
else
    ConOut("XML gerado corretamente")

    ConOut("NCNPJ", oXml:_NFLNFEENTITY:_NCNPJ:TEXT)
    ConOut("NNUMNF", oXml:_NFLNFEENTITY:_NNUMNF:TEXT)
    ConOut("CNOME", oXml:_NFLNFEENTITY:_CNOME:TEXT)

    ConOut("AITENSNF>NFLNFEITEMENTITY>CCFOP", oXml:_NFLNFEENTITY:_AITENSNF:_NFLNFEITEMENTITY:_CCFOP:TEXT)
    ConOut("AITENSNF>NFLNFEITEMENTITY>CCHAVE", oXml:_NFLNFEENTITY:_AITENSNF:_NFLNFEITEMENTITY:_CCHAVE:TEXT)
    ConOut("AITENSNF>NFLNFEITEMENTITY>CDESCPRODUTO", oXml:_NFLNFEENTITY:_AITENSNF:_NFLNFEITEMENTITY:_CDESCPRODUTO:TEXT)

    FreeObj(oXml)
endif

return


Se você precisar fazer o mesmo com um JSON, existe a JsonObject:

https://tdn.totvs.com/display/tec/Classe+JsonObject

Ela vai criar um JSON com base na string enviada, JSON é um tipo específico no ADVPL.

Olá Daniel, Obrigada pela ajuda. teria algum exemplo de como posso fazer a deserialização com o XmlParser, fiz alguns teste mas não consegui.

É bem simples, o exemplo da documentação já reproduz seu funcionamento, basicamente ela gera um objeto dinâmico conforme o XML de entrada, sendo que é necessário colocar um prefixo nas propriedades, que por padrão é _. Editei a resposta e coloquei um exemplo com o seu XML.

Muito Obrigada Daniel, fiz o teste deu certo!!