Olá pessoal…
Hoje vou mostrar uma rotina desenvolvida em AdvPL, que serve para indentar um arquivo XML, deixando com espaços a esquerda entre as tags.
Se algum dia você já precisou indentar um XML e não utiliza o Pretty Print XML do Notepad++, foi feito uma função em AdvPL, que você passa o conteúdo, e ele te retorna indentado, por exemplo, supondo que você tenha esse XML:
<dados><nome>Daniel</nome><cidade>Bauru</cidade></dados>
Ao rodar a rotina, o texto ficaria assim:
<dados>
<nome>
Daniel
</nome>
<cidade>
Bauru
</cidade>
</dados>
Abaixo o código fonte desenvolvido:
//Bibliotecas
#Include "Protheus.ch"
/*/{Protheus.doc} zPrettyXML
Função que serve para quebrar um XML e deixá-lo indentado para o usuário
@author Atilio
@since 13/05/2018
@version 1.0
@param cTextoOrig, characters, descricao
@type function
@example Exemplo Abaixo
//..............
cTextoOrig := MemoRead("C:\TOTVS\notas\original.xml")
cTextoNovo := ""
cTextoNovo := u_zPrettyXML(cTextoOrig)
Aviso('Atenção', cTextoNovo, {'OK'}, 03)
//..............
/*/
User Function zPrettyXML(cTextoOrig)
Local aArea := GetArea()
Local cTextoNovo := ""
Local aLinhas := {}
Local cEspaco := ""
Local nAbriu := 0
Local nAtual := 0
Local aLinNov := {}
//Se tiver conteúdo texto, e tiver o trecho de XML
If ! Empty(cTextoOrig) .And. '<?xml version=' $ cTextoOrig
//Substitui a fecha chaves para um enter
cTextoNovo := StrTran(cTextoOrig, "</", "zPrettyXML_QUEBR")
cTextoNovo := StrTran(cTextoNovo, "<", CRLF + "<")
cTextoNovo := StrTran(cTextoNovo, ">", ">" + CRLF)
cTextoNovo := StrTran(cTextoNovo, "zPrettyXML_QUEBR", CRLF + "</")
//Pega todas as linhas
aLinhas := StrTokArr(cTextoNovo, CRLF)
//Percorre as linhas adicionando espaços em branco
For nAtual := 1 To Len(aLinhas)
//Somente se tiver conteúdo
If ! Empty(aLinhas[nAtual])
//Se for abertura de tag, e não for fechamento na mesma linha, aumenta a tabulação
If "<" $ aLinhas[nAtual] .And. ! "<?" $ aLinhas[nAtual] .And. ! "</" $ aLinhas[nAtual] .And. ! "/>" $ aLinhas[nAtual]
nAbriu += 1
EndIf
//Definindo a quantidade de espaços em branco, conforme número de tags abertas
cEspaco := ""
If nAbriu > 0
cEspaco := Replicate(' ', 2 * (nAbriu + Iif(! "<" $ aLinhas[nAtual], 1, 0)) )
EndIf
//Monta agora o texto com a tabulação
aAdd(aLinNov, cEspaco + aLinhas[nAtual])
//Se for fechamento de tag, diminui a tabulação
If "</" $ aLinhas[nAtual] .And. At('<', SubStr(aLinhas[nAtual], 2, Len(aLinhas[nAtual]))) == 0
nAbriu -= 1
EndIf
EndIf
Next
//Monta agora o texto novo
cTextoNovo := ""
For nAtual := 1 TO Len(aLinNov)
cTextoNovo += aLinNov[nAtual] + CRLF
Next
EndIf
RestArea(aArea)
Return cTextoNovo
Bom pessoal, por hoje é só.
Abraços e até a próxima.