Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

wendell_po

Retornar dados gravado em xml do mssql

Recommended Posts

Boa tarde!
Tenho um fonte que lê um arquivo XML e consome esse XML como abaixo:

$docxml = file_get_contents($arq);
$domxml = new DomDocument;
$domxml->loadXML($docxml);

Preciso fazer uma alteração nesse código que ao invés de buscar a informação dentro do XML, vai buscar a informação no Banco de Dados (MsSQL). O problema é que a informação está gravada no formato XML, ou seja o conteúdo do XML (com aspas, e tags, etc) está gravado em um campo imagem.

 

Consigo trazer a informação quebrada em 4 campos com a seguinte query:

SELECT 
CONVERT(CHAR(8000),SUBSTRING(A.XML,1,8000)) as XML_1, 
CONVERT(CHAR(8000),SUBSTRING(A.XML,8001,8000)) as XML_2, 
CONVERT(CHAR(8000),SUBSTRING(A.XML,16001,8000)) as XML_3,
ISNULL(CONVERT(VARCHAR(8000), CONVERT(VARBINARY(8000), A.XML_P)),'') as XML_REC
FROM Tabela As A
WHERE (A_DOC = '$doc') 

A query retorna os dados para o PHP, o problema é que não consigo manipular os dados como um XML, quando passo os dados para uma variável e concateno os 4 campos e passo para Dom ler como um XML não acontece nada.

Alguém poderia me ajudar se é possível e que tipo de tratamento tenho que fazer para ler esses dados como XML?

 

Valeu,

Wendell

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você deve ser capaz de ler o XML através da função: simplexml_load_string ou direto pela class SimplXMLElement

 

Após, é só percorrer os nós do DOM.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel obrigado pelo retorno, fiz alguns testes usando a classe que me passou, quando executo direto na váriavel retornada pelo mssql com o código abaixo:

$doc = @mssql_result ($query1, 0, 'XML_1');
$doc .= @mssql_result ($query1, 0, 'XML_2');
$doc .= @mssql_result ($query1, 0, 'XML_3');
$doc .= @mssql_result ($query1, 0, 'XML_REC');

$docxml = simplexml_load_string($doc);

Retorna os seguintes erros:

 

Notice: Undefined variable: doc in C:/xampp/htdocs/clientes/Danfe/imprimirDanfe_bak.php on line 94
Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : expected '>' in C:/xampp/htdocs/clientes/Danfe/imprimirDanfe_bak.php on line 101
Warning: simplexml_load_string() [function.simplexml-load-string]: RC AD TERC</natOp><indPag>0</indPag><mod>55</mod><serie>2</serie><nNF>201289</ne in C:/xampp/htdocs/clientes/Danfe/imprimirDanfe_bak.php on line 101

 

Pensei que poderiam ser as aspas duplas que estão salvas no campo do SQL, alterei a query para trazer os campos da seguinte forma:

REPLACE(CONVERT(CHAR(8000),SUBSTRING(A.XML_SIG,1,8000)), '\"', '\\\"') as XML_1,
REPLACE(CONVERT(CHAR(8000),SUBSTRING(A.XML_SIG,8001,8000)), '\"', '\\\"') as XML_2, 
REPLACE(CONVERT(CHAR(8000),SUBSTRING(A.XML_SIG,16001,8000)), '\"', '\\\"') as XML_3,
ISNULL(REPLACE(CONVERT(VARCHAR(8000), CONVERT(VARBINARY(8000), A.XML_PROT)), '\"', '\\\"'),'') as XML_REC

Sempre que tiver aspas ele devolve com o caractere de escape, mesmo assim ainda aparece os seguintes erros:

 

Notice: Undefined variable: doc in C:/xampp/htdocs/clientes/Danfe/imprimirDanfe_bak.php on line 63

Warning: simplexml_load_string() [function.simplexml-load-string]: Entity: line 1: parser error : AttValue: " or ' expected in C:/xampp/htdocs/clientes/Danfe/imprimirDanfe_bak.php on line 70

Warning: simplexml_load_string() [function.simplexml-load-string]: <NFe xmlns=\"http://www.portalfiscal.inf.br/nfe\"><infNFe Id=\"NFe31150911087261 in C:/xampp/htdocs/clientes/Danfe/imprimirDanfe_bak.php on line 70

 

Para tirar a dúvida se o código XML que está no banco não tinha nenhum erro fiz o seguinte teste, rodei a consulta e copiei o retorno para um arquivo de texto, um seguido do outro, depois li o arquivo no PHP e rodei a classe, não retorna nenhum erro, e dando print_r ele apresenta a estrutura do XML corretamente. Utilizei o código como abaixo:

$doc = file_get_contents('./teste3.txt');	
$docxml = simplexml_load_string($doc);
print_r($docxml);

Por esse motivo acredito que o problema esteja entre o que o mssql está devolvendo e o que o PHP está entendendo.

Não sei mais como poderia testar isso.

Valeu,

Wendell

Compartilhar este post


Link para o post
Compartilhar em outros sites

É fatídico que as colunas estão sendo retornadas como nulas.

 

O formato do campo XML no MsSQL é um blob/text ou varchar maior que 2000 (ou 4096)?

 

Existe um bug quanto a esse retorno, blobs são retornados como null, você pode substituir o driver de conexão ou utilizar cast type antes de retornar.

 

Já que você está realizando o cast até 8000, diminua para 2000 e realize os testes, também adicione o cast para NVARCHAR(2000) e verifique se a informação é retornada.

 

a biblioteca PDO também consegue gerenciar de uma forma melhor os LOBs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel fiz um teste com um dos campos colocando para nvarchar(400), esses são os retornos que tenho:

 

- msssql

<protNFe xmlns="http://www.portalfiscal.inf.br/nfe" versao="3.10"><infProt><tpAmb>1</tpAmb><verAplic>13_2_84</verAplic><chNFe>31150911087261000700550020002012891006171970</chNFe><dhRecbto>2015-09-22T10:10:14-03:00</dhRecbto><nProt>131151885194137</nProt><digVal>Obiho1Kiw/NpCa9Jlu4G6QHD7PU=</digVal><cStat>100</cStat><xMotivo>Autorizado o uso da NF-e</xMotivo></infProt></protNFe>

 

- php usando echo

113_2_84311509110872610007005500200020128910061719702015-09-22T10:10:14-03:00131151885194137<

 

-php usando print_r

113_2_84311509110872610007005500200020128910061719702015-09-22T10:10:14-03:00131151885194137<

 

Ele não está retornando null, mas não retorna o conteudo como está gravado.

 

Fiz um teste com a classe PDO, como indicou, consegui a conexão e retornar a consulta, nessa classe retorno o campo como "image" e retornou o campo como pretendido, como faço para transformar essa imagem em uma string ou direto em xml? Tem como?

 

 

Valeu,

Wendell

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como o retorno é um stream, você pode utilizar as funções stream_get_contents para ler e retornar como string:

http://php.net/manual/en/pdo.lobs.php

 

Example #1 Displaying an image from a database

 

This example binds the LOB into the variable named $lob and then sends it to the browser using fpassthru(). Since the LOB is represented as a stream, functions such as fgets(), fread() and stream_get_contents() can be used on it.

O campo não retorna como null pois agora realmente é uma string. Entretanto, não aparece como cadastrado, pois é um tamanho menor que o original.

 

Já utilizando echo ou print_r, o navegador tenta interpretar as tags, por isso elas não são exibidas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como o retorno é um stream, você pode utilizar as funções stream_get_contents para ler e retornar como string:
http://php.net/manual/en/pdo.lobs.php

Example #1 Displaying an image from a database

This example binds the LOB into the variable named $lob and then sends it to the browser using fpassthru(). Since the LOB is represented as a stream, functions such as fgets(), fread() and stream_get_contents() can be used on it.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.