Inserir dados do XML no banco mysql

Galera to com um problema aqui meio complicado… espero que consigam me ajudar…

Tô tentando jogar os dados de um arquivo xml num banco de dados…
Usei o código a seguir… só que ele contém um bug…

Quando o while é finalizado ele só mostra a última linha afetada com o while… Ele nem parece um while de verdade, hauhaha!

o código é o seguinte:

// arquivo.php
&lt?

$array = array();
$chave = "";
$info = "";

//FUNÇÃO DA TAG INICIAL DO ARQUIVO XML (O QUE SERA MOSTRADO ANTES DOS DADOS DO XML)
function FuncInicial($parser, $elemento )
{
global $array;
}

// FUNÇÃO DA TAG FINAL DO ARQUIVO XML (O QUE SERA MOSTRADO DEPOIS DOS DADOS VINDOS DO XML)
function FuncFinal($parser, $elemento)
{
global $array, $info;

$chave 			= $elemento;
$array[$chave] 	= $info;
$info 			= ""; 

}

//FUNÇÃO QUE MOSTRA OS DADOS DO XML
function FuncDados($parser, $dados )
{
global $info;
$info .= $dados;

}

//CRIA O ANALISADOR DO XML
$parser = xml_parser_create();

//PEGA O CABEÇALHO E RODAPÉ DO DOCUMENTO INFORMADOS NAS FUNÇÕES ACIMA
xml_set_element_handler($parser, "FuncInicial", "FuncFinal");

//PEGAR OS DADOS DO XML
xml_set_character_data_handler($parser, "FuncDados");

//ABRE O XML
$file = "tabelas.xml";
$ponteiro = fopen($file, "r");

// O PROBLEMA TÁ AQUI…
// ENQUANTO TIVER LENDO O ARQUIVO INCLUE O INSERT
// NO LUGAR DO filesize($file) UTILIZANDO O NUMERO 1540 FICA QUASE PERFEITO
while ($dados = fread($ponteiro, filesize($file)))
{

//INICIA A ANALISE DOS DADOS DO XML
xml_parse($parser, $dados);

//CRIA O LOOP PARA GERAR OS INSERT DO XML
$sql= “INSERT INTO MATERIAL VALUES (’”;

$i=count($array);
$h=0;

/* O FOREACH varre uma dada matriz dada por expressao_array. Em cada ‘loop’, o valor do elemento corrente é atribuído a $valor e o ponteiro interno da matriz é avançado em uma posição */

foreach( $array as $junta =&gt $valor )
{
$h++;
$sql.= trim($valor);
if($i&gt$h) $sql.= “’, '”;
if($i&lt=$h) $sql.= “’)”;
}

echo $sql;

}

//LIBERA O ANALISADOR XML
xml_parser_free($parser);

?&gt

// O tabelas.xml

&lt?xml version=“1.0” encoding=“ISO-8859-1” ?&gt
<TABELAS>
<REGISTRO>
<MATERIAL tipo =“varchar” tamanho=“21”>01</MATERIAL>
<CODIGOBARRAS tipo =“varchar” tamanho=“41”>01001</CODIGOBARRAS>
<DESCRICAO tipo =“varchar” tamanho=“256”>AREIA GROSSA</DESCRICAO>
</REGISTRO>
<REGISTRO>
<MATERIAL tipo =“varchar” tamanho=“21”>02</MATERIAL>
<CODIGOBARRAS tipo =“varchar” tamanho=“41”>02</CODIGOBARRAS>
<DESCRICAO tipo =“varchar” tamanho=“256”>BRITA</DESCRICAO>
</REGISTRO>
</TABELAS>

Ajudem-me … no google não tem nada explicando esse procedimento… Quem colocabora ficarei extremamente agradecido pelo resto da vida! hehe

Serve sugestões (com exemplos em DOM ou qualquer outro método que nao seja esse)

:smiley:

nenhuma dicazinha ?! nada ?! nem meia dica ? huahauh to desesperado jah!

Acho que o pessoal daqui do forum não entende muito php…
Se o seu projeto fosse em jsp =P

Enfim…

Vou te dizer onde eu ACHO que é o seu problema…

você está fazendo:

[quote] function FuncFinal($parser, $elemento) { global $feed, $info; $key = $elemento; $feed[$key] = $info; $info = ""; } [/quote]

só que quando você faz $feed[$key] = $info, você está sobrescrevendo a key antiga…
ou seja, para cada registro, vão ser geradas as mesmas keys, e sempre o próximo registro vai apagar o registro anterior…

Um jeito de fazer isso é tornar o $feed um array bidimensional, que é meio que gambiarra em php… ou você pode inserir no banco de dados na
FuncFinal (criando um outro método que faz isso)

Enfim… tente ver se é isso… =) espero ter ajudado

Obrigado pela explicação, mas não acho que o problema esteja aí já que quando altero a linha

while ($dados = fread($ponteiro, filesize($file)))

para

while ($dados = fread($ponteiro, 1540))

ele até mostra um while q nao repete os dados… só que nao posso usar um numero padrao já que o xml ira sempre mudar de tamanho

Mas vou ler de novo sua dica e ver se encontro uma luz no fim do túnel…

Valeu!

o filesize($file) está retornando 1540?

Não amigo… o filesize ta retornando apenas um registro do xml…

quando mudo o filesize pra 1540 ai ele mostra o resto dos registros… é como se o while não estivesse correto…

eu nao posso colocar o 1540 como padrao pois o xml sempre mudara de tamanho…

Galera consegui…

vou tentar aprimorar em 2 linhas… huahauhauha

aí eu coloco o resultado aqui pra quem possa interessar blz ?!

valeu a todos que tentaram ajudar!

Meu amigo eu estou com o mesmo problema. Tenho de importar alguns dados de um ficheiro .XML e botar eles numa tabela em mysql
Será que me pode ajudar com código? Sou novato em php e estou ainda verde.

Que tal um forum de PHP?? Com certeza la vai ter muito mais gente que entenda pra responder!

Erro meu… estava falando de JAva e escrevi php… :smiley: