(41) 9225-6319
contato@felipemarques.com.br

Zend Framework – Inserindo XML num banco de dados SQL SERVER

Pessoal,

No projeto que estou atualmente trabalhando, necessitamos inserir o conteúdo de um xml na nossa base de dados.
A tabela que recebe o xml e mais alguns dados possui a seguinte estrutura:

USE [suabasededados]
GO

/****** Object:  Table [dbo].[sui_arquivosxml]    Script Date: 12/09/2010 12:09:41 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[sui_arquivosxml](
[arquivo] [int] IDENTITY(1,1) NOT NULL,
[tipoindicador] [int] NOT NULL,
[empresa] [int] NOT NULL,
[usuario] [int] NOT NULL,
[vigencia] [int] NOT NULL,
[xml] [xml] NOT NULL,
[dataenvio] [date] NOT NULL,
CONSTRAINT [PK_sui_arquivosxml] PRIMARY KEY CLUSTERED
(
[arquivo] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 35) ON [PRIMARY]
) ON [PRIMARY]

GO

Conteúdo do arquivo xml

<?xml version="1.0" encoding="iso-8859-1"?>
<dados>
	<nome>Felipe</nome>
	<sobrenome>Marques</sobrenome>
	<idade>24</idade>
</dados>

Pronto, com essa estrutura criada e utilizando o script PHP abaixo:

$tipoindicador = 1;
$empresa = 1;
$usuario = 1;
$vigencia = 2;
$data = date('Y-m-d');

// pega o conteudo do arquivo xml
$xml = file_get_contents($_FILES['arquivo']['tmp_name']);

$modelo = new ArquivosXml(); // extends Zend_Db_Table_Abstract
$modelo->insert(array(
'tipoindicador' => $tipoindicador,
'empresa' => $empresa,
'usuario' => $usuario,
'vigencia' => $vigencia,
'xml' => $xml,
'dataenvio' => $data
));

Mas perae, deu um erro aqui !!!!

SQLSTATE[HY000]: General error: 10007 XML parsing: line 1, character 267, illegal qualified name character

Esse erro ocorre porque o SQL SERVER não aceita que seja inserindo a tag na coluna de tipo xml.
Para resolver isso apliquei o seguinte código:

$tipoindicador = 1;
$empresa = 1;
$usuario = 1;
$vigencia = 2;
$data = date('Y-m-d');

// pega o conteudo do arquivo xml
$xml = file_get_contents($FILES['arquivo']['tmp_name']);
// separa o arquivo pelas quebras de linha e joga num array
$xml = explode("\n",$xml);
// retira a primeira linha para nao dar erro no insert pois o
// sql server nao aceita a tag <?xml version="1.0"> inicial
array_shift($xml);
// retira todas as tabulações para diminuir o tamanho em bytes do arquivo xml
$xml = str_replace("\t","",$xml);
// retira todos os espaços duplicados
$xml = preg_replace('/(\s{2,}+)/mi','',$xml);										
// junta as linhas do array de xml para a variavel xml

$modelo = new ArquivosXml(); // extends Zend_Db_Table_Abstract
$modelo-&gt;insert(array(
'tipoindicador' =&gt; $tipoindicador,
'empresa' =&gt; $empresa,
'usuario' =&gt; $usuario,
'vigencia' =&gt; $vigencia,
'xml' =&gt; $xml,
'dataenvio' =&gt; $data
));

É isso ai pessoal.

Sobre o autor
Felipe Marques é Consultor e Analista de Sistemas Web e Mobile. Mais de 10 anos de experiência.
Por :
Comentários : 0

Faça um comentário

*

Facebook Auto Publish Powered By : XYZScripts.com