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!
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.