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:
1 | <dados><nome>Daniel</nome><cidade>Bauru</cidade></dados> |
Ao rodar a rotina, o texto ficaria assim:
1 2 3 4 5 6 7 8 | <dados> <nome> Daniel </nome> <cidade> Bauru </cidade> </dados> |
Abaixo o código fonte desenvolvido:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | //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.