Como quebrar linha na criação de XML

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Como quebrar linha na criação de XML

Mensagem por porter »

Olá pessoal, com essa rotina, estou criando arquivo XML, da forma como está, ele cria o arquivo XML, tudo em apenas uma linha, como faço
para quebrar a linha, já tentei com o CRLF, mas dá erro na hora de executar o programa.

Código: Selecionar todos

sXMLinha  = ""
sXMLinha  = '<?xml version="1.0" encoding="UTF-8"?>'
sXMLinha += '<NumeroLote>2</NumeroLote>'

If hb_MemoWrit("c:\nfse\rps.xml",sXMLinha) = .f.
   MsgExclamation("Não foi possível gravar o arquivo RPS.xml !")
   Return .f.
Endif
Está ficando assim:
<?xml version="1.0" encoding="UTF-8"?><NumeroLote>2</NumeroLote></xml>

Quero que fique assim:
<?xml version="1.0" encoding="UTF-8"?>
<NumeroLote>2</NumeroLote></xml>

Harbour 3.2(dev)
Obrigado.
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Como quebrar linha na criação de XML

Mensagem por ANDRIL »

Porter, os leitores de XML não aceitam a quebra de linha. A quebra causa inconsistência nos dados, ela seria apenas para facilitar a visualização do corpo do xml. Quando comecei com a NFe eu fazia o xml com CRLF normalmente para visualizar no bloco de notas etc, se abrisse pelo navegador dava erro.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
porter
Usuário Nível 5
Usuário Nível 5
Mensagens: 1057
Registrado em: 10 Dez 2009 16:44
Localização: OLIMPIA-SP

Como quebrar linha na criação de XML

Mensagem por porter »

Olá Andril, obrigado por sua atenção
É isso que eu quero, quebrar a linha para facilitar a visualização quando for criado o XML, ou somente consigo fazer isso manualmente ?
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como quebrar linha na criação de XML

Mensagem por JoséQuintas »

O formato do XML é tudo numa única linha, se colocar CRLF ele vai se tornar inválido.
Se quer visualizar, crie um programa ou utilize um pronto.

exemplo: run ( "start arquivo.xml" )

Lembrando que visualizador de XML também NÃO aceita XML inválido, e o visualizador pode mostrar diferente do que está realmente gravado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

Como quebrar linha na criação de XML

Mensagem por ANDRIL »

Quando o xml é válido poderá visualizá-lo no próprio navegador, ele se encarrega de criar uma boa visualização.

Código: Selecionar todos

a=getenv("CommonProgramFiles")
a="start '" + substr(a,1,rat("\",a))+"Google\Chrome\Application\Chrome.Exe'"
a='start c:\"Program Files"\Google\Chrome\Application\Chrome.Exe arquivo.xml'
run(a)
Não testei, mas é por ai.
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Como quebrar linha na criação de XML

Mensagem por Poka »

Bom dia

Mas quando o xml tá errado vc não consegue achar o erro, fica dificil.
Desde quando faço nota na rotina que crio o xml crio um TXT iguazinho o xml. Aí vejo a hora que eu quero. é o único jeito.

Poka
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Como quebrar linha na criação de XML

Mensagem por Itamar M. Lins Jr. »

Ola!
Depende do seu editor.
No kate, além da sintaxe xHarbour, tem XML, SQL, saidas, validações... é tanta coisa!
Screenshot_20200716_140014.png
https://kate-editor.org/2017/05/22/kate ... r-windows/

Não sei se tem o plugin para formatar XML no windows.

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como quebrar linha na criação de XML

Mensagem por JoséQuintas »

Poka escreveu:Mas quando o xml tá errado vc não consegue achar o erro, fica dificil.
Desde quando faço nota na rotina que crio o xml crio um TXT iguazinho o xml.
Aí vejo a hora que eu quero. é o único jeito.
Fiz um quebra galho pra validação simples.
Se acontecer isso de novo, teste a validação da sefazclass.

Aqui no fórum também tem uns posts pra visualização de XML por fonte Harbour.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Como quebrar linha na criação de XML

Mensagem por JoséQuintas »

Tá na sefazclass, com funções que podem faltar.
Aqui só pra ilustrar.
Basicamente verifica se está abrindo/fechando tudo na ordem certa.

Código: Selecionar todos

STATIC FUNCTION SingleXmlValidate( cXml, cIgnoreList )

   LOCAL nPos, aTagsAbre := {}, cTmp, oElement, cLetra, cTxt := ""

   hb_Default( @cIgnoreList, "" )
   DO WHILE .T.
      nPos := hb_At( "<", cXml, nPos )
      IF nPos < 1
         EXIT
      ENDIF
      IF Substr( cXml, nPos + 1, 1 ) == "/"
         IF ! ProcFecha( Substr( cXml, nPos, hb_At( ">", cXml, nPos ) - nPos ), aTagsAbre, @cTxt )
            EXIT
         ENDIF
      ELSE
         cTmp := Substr( cXml, nPos, hb_At( ">", cXml, nPos ) - nPos + 1 )
         IF ! "/>" $ cTmp .AND. ! "/ >" $ cTmp
            AAdd( aTagsAbre, cTmp )
            //? "Abriu " + Atail( aTagsAbre )
         ENDIF
      ENDIF
      nPos := nPos + 3
   ENDDO
   IF Len( aTagsAbre ) != 0
      cTxt += "Em aberto" + Space(3)
      FOR EACH oElement IN aTagsAbre
         cTxt += oElement + Space(3)
      NEXT
      RETURN "*ERRO* " + cTxt
   ENDIF
   FOR EACH cLetra IN cXml
      DO CASE
      CASE cLetra $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
      CASE cLetra $ "abcdefghijklmnopqrstuvwxyz"
      CASE cLetra $ "0123456789"
      CASE cLetra $ " <>=:/.,-+#$()_@;%"
      CASE cLetra == ["]
      CASE cLetra $ cIgnoreList
      OTHERWISE
         cTxt += "Caractere " + cLetra + " posição " + Ltrim( Str( cLetra:__EnumIndex ) ) + ;
            " aproximadamente aqui " + Substr( cXml, Max( 0, cLetra:__EnumIndex - 10 ), 20 ) + ", "
      ENDCASE
   NEXT
   IF " <" $ cXml .OR. "> " $ cXml
      cTxt += "espaços em branco antes de < ou depois de >"
   ENDIF
   IF Len( cTxt ) > 0
      RETURN "*ERRO* " + cTxt
   ENDIF
   RETURN "OK"

STATIC FUNCTION ProcFecha( cTag, aTagsAbre, cTxt )

   LOCAL oElement

   FOR EACH oElement IN aTagsAbre
      IF " " $ oElement
         oElement := Substr( oElement, 1, At( " ", oElement ) - 1 )
      ENDIF
      IF ">" $ oElement
         oElement := Substr( oElement, 1, At( ">", oElement ) - 1 )
      ENDIF
      IF "<" $ oElement
         oElement := Trim( Substr( oElement, 2 ) )
      ENDIF
   NEXT
   cTag := Substr( cTag, 3 )
   IF ">" $ cTag
      cTag := Substr( cTag, 1, At( ">", cTag ) - 1 )
   ENDIF
   IF cTag == Atail( aTagsAbre )
      //? "fechou " + cTag
      hb_ADel( aTagsAbre, Len( aTagsAbre ), .T. )
   ELSE
      IF Len( aTagsAbre ) != 0
         cTxt += "erro fechada " + cTag + " esperada " + Atail( aTagsAbre ) + Space(3)
      ENDIF
      RETURN .F.
   ENDIF

   RETURN .T.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder