× Linguagem de Programação ADVPL

Perguntas Não gera correto "<?xml version='1.0' encoding='ISO-8859-1'?>"

Mais
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="&quot;1.0&quot;" encoding="&quot;UTF-8&quot;"?>
Sem ela sai assim <?xml version="1.0"?>


Obrigado,
Carlos

Por favor Acessar ou Registrar para participar da conversa.

Mais
11 anos 8 meses atrás #11371 por CCASKWD
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.

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.093 segundos
Joomla templates by a4joomla