Página 1 de 1

Como quebrar linha na criação de XML

Enviado: 15 Jul 2020 11:21
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.

Como quebrar linha na criação de XML

Enviado: 15 Jul 2020 11:26
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.

Como quebrar linha na criação de XML

Enviado: 15 Jul 2020 11:40
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 ?

Como quebrar linha na criação de XML

Enviado: 15 Jul 2020 13:11
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.

Como quebrar linha na criação de XML

Enviado: 15 Jul 2020 22:53
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.

Como quebrar linha na criação de XML

Enviado: 16 Jul 2020 08:13
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

Como quebrar linha na criação de XML

Enviado: 16 Jul 2020 13:52
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.

Como quebrar linha na criação de XML

Enviado: 16 Jul 2020 14:41
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.

Como quebrar linha na criação de XML

Enviado: 16 Jul 2020 14:44
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.