Criando um arquivo XML

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

Moderador: Moderadores

marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Criando um arquivo XML

Mensagem por marcos.gurupi »

Caros, estou criando um arquivo xml conforme o codigo abaixo:

Código: Selecionar todos

	Select("Clientes")
   ordsetfocus(2)
   dbgotop()
	sXMLinha = "<xml>"+CRLF
	Do While !Eof()                  
      sXMLinha += "<clientes>"+CRLF
      sXMLinha += "<ecnpj>"+RetiraCar(Empresa->cgc)+"</ecnpj>"+CRLF
   	sXMLinha += "<codigo>"+Transform(clientes->Codigo,"999999")+"</codigo>"+CRLF
	   sXMLinha += "<cpfcnpj>"+RetiraCar(clientes->cpf)+"</cpfcnpj>"+CRLF
	   sXMLinha += "<fantasia>"+Alltrim(RetiraAcento(clientes->fantasia))+"</fantasia>"+CRLF
	   sXMLinha += "<endereco>"+Alltrim(RetiraAcento(clientes->endres))+"</endereco>"+CRLF
	   sXMLinha += "<bairro>"+Alltrim(RetiraAcento(clientes->BaiRes))+"</bairro>"+CRLF
	   sXMLinha += "<cidade>"+Alltrim(RetiraAcento(clientes->CidRes))+"</cidade>"+CRLF
	   sXMLinha += "<cep>"+RetiraCar(clientes->CepRes)+"</cep>"+CRLF
	   sXMLinha += "<telefone>"+Alltrim(RetiraAcento(clientes->telres))+"</telefone>"+CRLF
	   sXMLinha += "<ieident>"+Alltrim(RetiraAcento(clientes->Ident))+"</ieident>"+CRLF
	   sXMLinha += "</clientes>"+CRLF
      dbskip()
      vLinha+=1
   END
   sXMLinha += "</xml>"
If memowrit(vDirExpo+"clientes.xml",sXMLinha)=.f.
   Fim_Run()
 	MsgStop("Nao foi possivel gravar o arquivo Clientes.xml no destino","Clientes XML")
   Select(Areant)
  	Return .f.
Endif

Quando o cadastro estah perfeito sem caracteres eu consigo visualizar o XML como Xml e efetuar a importacao dele. Acontece q quando no cadastro tem acentuacao ou caracteres isso invalida o XML. Alguem saberia me dizer como retirar esses caracteres/acentuacao ?
Marcos Roberto
NetService Software
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

Criando um arquivo XML

Mensagem por HASA »

:))
Bom dia, veja a Function TiraAcento(mTexto) no seguinte tópico: http://pctoledo.com.br/forum/viewtopic.php?f=43&t=13329
:)Pos
HASA
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Criando um arquivo XML

Mensagem por alxsts »

Olá!

Um campo em arquivo XML pode conter normalmente os caracteres acentuados da tabela ASCII. Só não pode conter alguns caracteres que são especiais para XML, como <, > e &, por exemplo. Provavelmente nos registros do teu arquivo tem alguns destes caracteres. Por exemplo, o cliente de nome "Fulano & Beltrano Advogados Associados".

Se preferir, pode criar uma função que transforma todos os caracteres especiais e acentuados nos respectivos códigos HTML. Veja a tabela "Tabela de Acentos e Caracteres Especiais"
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criando um arquivo XML

Mensagem por JoséQuintas »

Além do problema que mencionou, tem dois erros no seu XML:

1) XML não tem CRLF
2) Ao gravar com MemoWrit(), é adicionado Ctrl-Z no final, padrão do DOS para fim de arquivo.

Retire os CRLF, e use hb_MemoWrit().

Sobre os caracteres, talvez você possa montar uma tabela pra eles.
Usando um FOR/NET pode identificar cada letra, e pesquisar numa lista.
Comece por algo como:

Código: Selecionar todos

cListaChar := "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ=+.,<>?" + Chr(34)
FOR nCont = 1 TO Len( cTexto )
   cLetra := Substr( cTexto, nCont, 1 )
   IF .NOT. cLetra $ cListaChar
      ? nCont, Asc( cLetra ), cLetra
   ENDIF
NEXT
E depois, conforme resultado, pode montar uma função de conversão.

Código: Selecionar todos

cTexto := StrTran( cTexto, cCaractereDe, cCaracterePara )
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/
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Criando um arquivo XML

Mensagem por marcos.gurupi »

Obrigado a todos.

A funcao tira acento eu jah aplicava. Como pode observar no codigo postado.

Caro Jose Quintas a funcao hb_MemoWrit() eh de que xhb ? Qual a versao e lib usada.

Marcos Roberto.
Marcos Roberto
NetService Software
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criando um arquivo XML

Mensagem por JoséQuintas »

É do próprio Harbour.
Não sei a versão oficial, mas a versão do vszakats informa o que adicionar caso falte alguma função do Harbour.
Em todo caso, digite hbmk2 -find memowrit.
Vai mostrar as funções com nome parecido, e a lib correspondente.
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/
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Criando um arquivo XML

Mensagem por marcos.gurupi »

Entaum "melo" aqui eu uso o xhb

:(

Teria uma outra solucao para n usar o CRLF em xhb ?
Marcos Roberto
NetService Software
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criando um arquivo XML

Mensagem por JoséQuintas »

Olhando a lib que montei pra hbnfe, de compatibilidade pra xHarbour:

Código: Selecionar todos

FUNCTION hb_MemoWrit( cFileName, cText )
   RETURN MemoWrit( cFileName, cText, .F. )
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/
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Criando um arquivo XML

Mensagem por marcos.gurupi »

Caro Jose Quintas, mesmo usando a funcao acima o arquivo ainda fica com uma caractere no final. Somente apos tirar manualmente o arquivo eh reconhecido como XML.
Marcos Roberto
NetService Software
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Criando um arquivo XML

Mensagem por JoséQuintas »

Confirme então o último parâmetro, teste usando .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/
Kapiaba
Colaborador
Colaborador
Mensagens: 1908
Registrado em: 07 Dez 2012 16:14
Localização: São Paulo
Contato:

Criando um arquivo XML

Mensagem por Kapiaba »

Código: Selecionar todos


Voce pode tirar direto do banco de dados

      WNOME:= ALLTRIM(TIRA_ACENTUACAO(CADCLIEN->CLIENTE))

E direto do *.XML

      cDocXml = TIRA_ACENTUACAO( cDocXml )

      // aqui retire o que estiver errado.
      cDocXml = StrTran( cDocXml , "CorreCAo" , "Correcao" )

      nHandle:=Fcreate(cDestino+cFile)

      Fwrite(nHandle,cDocXml)
      FClose(nHandle)

//-> Retira a Acentuacao Errada do Banco de dados
FUNCTION TIRA_ACENTUACAO( cStr )

   local cStrNew := "", nX

   cAcentos := {"ƒ","Æ","Ç"," ","µ","…","·","‚","É","ê","ˆ","","Ò","í","Í","ó","¢","à","ä","å","“","â","ú","é","","š","ç","€","ã","Ã","á","Á","à","À","é","É","ê","Ê","í","Í","ó","Ó","õ","Õ","ô","Ô","ú","Ú","ü","Ü","ç","ù","AAO","§","¦","º","ª","€","‡","Ç","ç","'","`","ø","¡","Þ","×","Ø", chr(239)}

   cLetras  := {"A","A","A","A","A","A","A","E","E","E","E","E","E","I","I","O","O","O","O","O","O","O","U","U","U","U","C","C","A","A","A","A","A","A","E","E","E","E","I","I","O","O","O","O","O","O","U","U","U","U","C"," ","CAO",".",".",".",".","C","C","C","C","" ,"" ,".","I","I","I","I",    ""   }

   For nX := 1 TO LEN(cAcentos)

       cStrNew := StrTran(cStr, cAcentos[nX], cLetras[nX])

       cStr := cStrNew

   Next

Return( cStrNew )
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Criando um arquivo XML

Mensagem por Jairo Maia »

Olá Pessoal,

É que o MemoWrit() coloca o Chr(26) no final. Em Harbour basta trocar por Hb_MemoWrit(), mas em xHarbour a solução tem que ser assim:

Código: Selecionar todos

FUNCTION hb_MemoWrit( cFileName, cText )

 Local nHandle := FCreate( cFileName )
 FWrite( nHandle, cText, Len( cText ) )
 FClose( nHandle )

Return ( FError() = 0 )
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
marcos.gurupi
Usuário Nível 4
Usuário Nível 4
Mensagens: 939
Registrado em: 06 Jul 2004 11:53
Localização: Gurupi-TO

Criando um arquivo XML

Mensagem por marcos.gurupi »

Caros Colegas, obrigado pelas solucoes apresentadas.

Jose Quintas testei a funcao com o parametro .T. mas mesmo assim o arquivo ficou com o caractere no final

Para efeito de registro a solucao que deu certo foi a do Jairo Maia. Com a funcao q ele apresentou o XML ficou sem o caractere no final do documento.


TOPICO SOLUCIONADO
:-Y
Marcos Roberto
NetService Software
Responder