- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Não gera correto "<?xml version='1.0' encoding='ISO-8859-1'?>"
×
Linguagem de Programação ADVPL
Perguntas Não gera correto "<?xml version='1.0' encoding='ISO-8859-1'?>"
- CCASKWD
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 114
- Obrigados Recebidos: 0
11 anos 8 meses atrás #10951
por CCASKWD
Olá Pessoal!
Estou usando as funções XMLPARSER OXML := XMLPARSER,CREATE OXML XMLSTRING cMsgXML SAVE OXML XMLSTRING cMsgXML,SAVE OXML XMLFILE, para a geração do arquivo xml, o arquivo é gerado mais o cabeçalho do encoding sai incompleto <?xml version="1.0"?> com isso o arquivo não é aberto em outro sistema, estou fazendo alguma coisa errada ou é uma limitação do Protheus? Abrir um chamado na Totvs, no suporte do advpl segundo o analista ocorreu o mesmo problema. Correto cMsgXML := "<?xml version='1.0' encoding='ISO-8859-1'?>" e quando tento usar cMsgXML := "<?xml version=1.0 encoding=ISO-8859-1?>" da erro na criação : Não foi possível criar o arquivo oxml. Alguéma já conseguiu gerar o xml usando essa função, e gerando o cabeçalho correto?
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
#INCLUDE "TOPCONN.CH"
STATIC FUNCTION FTPGXML()
//cMsgXML já declarada como private na inicialização
LOCAL nTob := 0
cMsgXML := "<?xml version='1.0' encoding='ISO-8859-1'?>"
cMsgXML += "<correioslog>"
uso as funções :
OXML := XMLPARSER
CREATE OXML XMLSTRING cMsgXML
SAVE OXML XMLSTRING cMsgXML
SAVE OXML XMLFILE
Quando uso a função CREATE OXML XMLSTRING cMsgXML o cabeçalho sai assim
<?xml version=""1.0"" encoding=""UTF-8""?>
Sem ela sai assim <?xml version="1.0"?>
Obrigado,
Carlos
Estou usando as funções XMLPARSER OXML := XMLPARSER,CREATE OXML XMLSTRING cMsgXML SAVE OXML XMLSTRING cMsgXML,SAVE OXML XMLFILE, para a geração do arquivo xml, o arquivo é gerado mais o cabeçalho do encoding sai incompleto <?xml version="1.0"?> com isso o arquivo não é aberto em outro sistema, estou fazendo alguma coisa errada ou é uma limitação do Protheus? Abrir um chamado na Totvs, no suporte do advpl segundo o analista ocorreu o mesmo problema. Correto cMsgXML := "<?xml version='1.0' encoding='ISO-8859-1'?>" e quando tento usar cMsgXML := "<?xml version=1.0 encoding=ISO-8859-1?>" da erro na criação : Não foi possível criar o arquivo oxml. Alguéma já conseguiu gerar o xml usando essa função, e gerando o cabeçalho correto?
#INCLUDE "PROTHEUS.CH"
#INCLUDE "XMLXFUN.CH"
#INCLUDE "TOPCONN.CH"
STATIC FUNCTION FTPGXML()
//cMsgXML já declarada como private na inicialização
LOCAL nTob := 0
cMsgXML := "<?xml version='1.0' encoding='ISO-8859-1'?>"
cMsgXML += "<correioslog>"
uso as funções :
OXML := XMLPARSER
CREATE OXML XMLSTRING cMsgXML
SAVE OXML XMLSTRING cMsgXML
SAVE OXML XMLFILE
Quando uso a função CREATE OXML XMLSTRING cMsgXML o cabeçalho sai assim
<?xml version=""1.0"" encoding=""UTF-8""?>
Sem ela sai assim <?xml version="1.0"?>
Obrigado,
Carlos
Por favor Acessar ou Registrar para participar da conversa.
- CCASKWD
- Autor do Tópico
- Desconectado
- Membro Especialista
Menos
Mais
- Postagens: 114
- Obrigados Recebidos: 0
11 anos 8 meses atrás #11371
por CCASKWD
Respondido por CCASKWD no tópico Não gera correto "<?xml version='1.0' encoding='ISO-8859-1'?>"
Olá Pessoal,
Caso algúem venha a ter, o mesmo problema que tive, segue uma solução que a equipe de tecnologia da totvs, passou,para contornar o problema.
Abs.
Com base na avaliação as informações que vocês no passou e dos fontes que controlam a geração do parser do XML, encontramos um contorno para o caso.
No fonte onde você demonstra a ocorrência, você utiliza o primeiro conjunto de funções de Parser XML criados pelo Framework. Esta implementação registra no Objeto xml as informações de versão e encoding, porém considerando as aspas dos atributos como parte do conteudo, fazendo com que, no momento de salvar o XML, as aspas fossem convertidas como parte integrante do conteudo dos atributos, invalidando o XML.
Nessa utilização, é possível fazer o XML ser gerado corretamente da seguinte forma:
1) Inserindo dentro do fonte uma função auxiliar, chamada RemAspas, fonte abaixo – ela recebe uma string, e se a string começar e terminar com aspas simples ou duplas, ambas sao removidas, sendo retornado apenas o “conteudo desejado” da string:
Static function RemAspas(cx)
if left(cx,1) == '"' .and. right(cx,1) == '"'
return substr(cx,2,len(cx)-2)
Elseif left(cx,1) == "'" .and. right(cx,1) == "'"
return substr(cx,2,len(cx)-2)
Endif
return cx
2) Alterar o fonte para inserir corretamente dentro da string XML modelo a versao e o encoding, e após o parser ter sido feito com sucesso, remover as aspas dos nodes especiais ( __xml ) que contém estas informações, para que o XML salvo seja válido. Vide abaixo partes relevantes e alteradas do fonte de exemplo:
User Function TXml()
Local cModelo := ''
Local aLivros := {}
Local cXml := '' , oXml
Local nL , nTotL
// Defino dados dos livros a catalogar
aadd(aLivros , { "000001","Livro Teste" ,"John Doe","10/05/2001"})
aadd(aLivros , { "000002","Livro Ficticeo" ,"Mary Brahms","15/05/2001"})
// Crio modelo em String, colocando a versão e o encoding dentro de aspas duplas,
// e ambos dentro da tag de cabeçalho do XML
cModelo += '<?xml version="1.0" encoding="ISO-8859-1"?>'
cModelo += '<MeuDoc>'
cModelo += '<Livro>'
cModelo += '<Id></Id>'
cModelo += '<Titulo></Titulo>'
cModelo += '<Autor></Autor>'
cModelo += '<Data></Data>'
cModelo += '</Livro>'
cModelo += '</MeuDoc>'
// Crio o Objeto XML , definindo o Livro como Array
CREATE oXML XMLSTRING cModelo SETASARRAY _MeuDoc:_Livro
nXmlStatus := XMLError()
If ( nXmlStatus == XERROR_SUCCESS )
// contorno , logo apos fazer o parser ...
// retira as aspas das propriedades de encoding e versao do XML ...
oXml:__XML:_ENCODING:TEXT := RemAspas(oXml:__XML:_ENCODING:TEXT)
oXml:__XML:_VERSION:TEXT := RemAspas(oXml:__XML:_VERSION:TEXT)
// Caso nao houve nenhum tipo de erro de criação do Objeto
// Calcula o total de Livros e percorre os elementos do array
// para criar os nodes dos livros no XML.
(...)
A título de curiosidade, em breve será documentada e liberada uma nova classe de parser XML, que atenderá a necessidades como esta.
Caso algúem venha a ter, o mesmo problema que tive, segue uma solução que a equipe de tecnologia da totvs, passou,para contornar o problema.
Abs.
Com base na avaliação as informações que vocês no passou e dos fontes que controlam a geração do parser do XML, encontramos um contorno para o caso.
No fonte onde você demonstra a ocorrência, você utiliza o primeiro conjunto de funções de Parser XML criados pelo Framework. Esta implementação registra no Objeto xml as informações de versão e encoding, porém considerando as aspas dos atributos como parte do conteudo, fazendo com que, no momento de salvar o XML, as aspas fossem convertidas como parte integrante do conteudo dos atributos, invalidando o XML.
Nessa utilização, é possível fazer o XML ser gerado corretamente da seguinte forma:
1) Inserindo dentro do fonte uma função auxiliar, chamada RemAspas, fonte abaixo – ela recebe uma string, e se a string começar e terminar com aspas simples ou duplas, ambas sao removidas, sendo retornado apenas o “conteudo desejado” da string:
Static function RemAspas(cx)
if left(cx,1) == '"' .and. right(cx,1) == '"'
return substr(cx,2,len(cx)-2)
Elseif left(cx,1) == "'" .and. right(cx,1) == "'"
return substr(cx,2,len(cx)-2)
Endif
return cx
2) Alterar o fonte para inserir corretamente dentro da string XML modelo a versao e o encoding, e após o parser ter sido feito com sucesso, remover as aspas dos nodes especiais ( __xml ) que contém estas informações, para que o XML salvo seja válido. Vide abaixo partes relevantes e alteradas do fonte de exemplo:
User Function TXml()
Local cModelo := ''
Local aLivros := {}
Local cXml := '' , oXml
Local nL , nTotL
// Defino dados dos livros a catalogar
aadd(aLivros , { "000001","Livro Teste" ,"John Doe","10/05/2001"})
aadd(aLivros , { "000002","Livro Ficticeo" ,"Mary Brahms","15/05/2001"})
// Crio modelo em String, colocando a versão e o encoding dentro de aspas duplas,
// e ambos dentro da tag de cabeçalho do XML
cModelo += '<?xml version="1.0" encoding="ISO-8859-1"?>'
cModelo += '<MeuDoc>'
cModelo += '<Livro>'
cModelo += '<Id></Id>'
cModelo += '<Titulo></Titulo>'
cModelo += '<Autor></Autor>'
cModelo += '<Data></Data>'
cModelo += '</Livro>'
cModelo += '</MeuDoc>'
// Crio o Objeto XML , definindo o Livro como Array
CREATE oXML XMLSTRING cModelo SETASARRAY _MeuDoc:_Livro
nXmlStatus := XMLError()
If ( nXmlStatus == XERROR_SUCCESS )
// contorno , logo apos fazer o parser ...
// retira as aspas das propriedades de encoding e versao do XML ...
oXml:__XML:_ENCODING:TEXT := RemAspas(oXml:__XML:_ENCODING:TEXT)
oXml:__XML:_VERSION:TEXT := RemAspas(oXml:__XML:_VERSION:TEXT)
// Caso nao houve nenhum tipo de erro de criação do Objeto
// Calcula o total de Livros e percorre os elementos do array
// para criar os nodes dos livros no XML.
(...)
A título de curiosidade, em breve será documentada e liberada uma nova classe de parser XML, que atenderá a necessidades como esta.
Por favor Acessar ou Registrar para participar da conversa.
- Fórum
- Protheus/Microsiga/Totvs
- AdvPL (Advanced Protheus Language)
- Dúvidas Gerais
- Não gera correto "<?xml version='1.0' encoding='ISO-8859-1'?>"
Tempo para a criação da página:0.093 segundos