Ir para conteúdo

Arquivado

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

fmda

ler varios xml e imprimir em tela

Recommended Posts

Eu estou usando este codigo abaixo, para ler um xml e gravar no banco ou apenas escrever na tela. Porém ele faz um por um e aí que vem meu problema, como faço para passar varios xml, xml1, xml2... e ele ler e gravando em tela mesmo um em baixo do outro

$xml1 = simplexml_load_file('url_do_xml');

$x = 0;

 

foreach ($xml1->Data as $gravar){

#mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'");

if(mysql_affected_rows() != -1){

$x++;

}

echo "$gravar->Id<br>";

}

e meu segundo problema é, quando eu passar varios xml ele vai ler todos e depois jogar na tela, mas aí se o xml for grande, ferrou vai dar timeout ou algo do tipo. como faço pra imprmir em tela a cada xml que ele le?

 

 

up para ajudar,

 

 

porque ta tenso, n estou consegundo

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa, malz.

a estrutura do xml é esta (diminui pra ficar mais facil, é simples)

 

 

<response>
<Data>
<Id>info</Id>
<Referencia>url_info</Referencia>
</Data>
<Status>ok</Stat>
</response>

Compartilhar este post


Link para o post
Compartilhar em outros sites

só tem este no, a estrutura é identica a esta, so que varios xml desta forma.

consigo ler 1 por 1, mas precisaria ler varios url de xml e ir jogando os dados seja num textarea mesmo.

 

porque assim deixo ele rodando ate ler os 100, 200 xml e no final copia estes dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

up, já consegui fazer ele le um por um

mas estou precisando que a cada leitura de um link ele imprimi na tela e vai lendo os outros e vai escrevendo

 

creio que assim nao ha sobrecarga de link e consigo ler todos. porque são cercas de 1000xml

 

 

<?php
$arquivos_xml = array ('xml','xml1','xml2');

$i = 0;

while(!empty($arquivos_xml[$i])) {

echo $arquivos_xml[$i].'<br />';


$url_do_xml = 'url_do_xml'.$arquivos_xml[$i].'.xml';

$xml1 = simplexml_load_file($url_do_xml);
$x = 0;

foreach ($xml1->Data as $gravar){
#mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'");
if(mysql_affected_rows() != -1){
$x++;
}
echo "$gravar->Id<br>";
}

$i++;
}
?>

Porém ainda fico com o maior problema que é, são muitas url de xml e desta forma ele le tudo em memoria e so no final imprime todos os dados.
pra aliviar o servidor e não da erro, precisaria que a cada url ele imprimisse na tela, assim fica mais tranquilo pro servidor, creio eu

tem como a cada url que ele le, imprimir num textarea ou arquivo txt, algo que fica mais leve pro lado do server?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para liberar o buffer de saída antes do fim da execução do script trabalhe com ob_end_flush() e flush(), no próprio manual mostra exemplo disto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sera que o ob_end_flush e flush resolve este priblme abaixo?

eu tentei ler 50 xml neste codigo acima e sempre me retorna isso

 

 

Error 503 Service Unavailable

Service Unavailable

Guru Meditation:

XID: 959121182

Varnish cache server

 

uo, um forum deste tamanho e apenas um unico usuario ajudando :(

 

 

n consegui resolver este erro ainda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Brother, vamos lá.

 

Primeiro, o timeout a gente resolve com o "set_time_limit()". A função aceita apenas um parâmetro, que é em segundos o tempo que vc quer para dar timeout (especificação: http://www.php.net/manual/en/function.set-time-limit.php).

 

Considerando que o código que vc postou já funciona, segue uma forma de fazer com vários XMLs:

 

<?php
set_time_limit(3600); //1 hora pra dar timeout

$xmls = array(
'url_xml1',
'url_xml2',
'url_xml3',
'url_xml4',
'url_xml5',
'url_xml6'
);
foreach ($xmls as $xml) { 
$x = 0;
    
foreach ($xml1->Data as $gravar){     
#mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'");     
if(mysql_affected_rows() != -1){     
    $x++;     
}     
echo "$gravar->Id<br>";
}

$i++;
}
?>

 

 

Espero que dê certo.

 

Conseguindo ou não, avise-nos.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ainda não resolveu

sempre retorna

 

Error 503 Service Unavailable

Service Unavailable

Guru Meditation:

XID: 959121182

Varnish cache server

 

pesquisando achei que poderia usar algo assim que encontrei na net, so ta dificil encaixar

 

?php
function download_page($path){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$path);
curl_setopt($ch, CURLOPT_FAILONERROR,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$retValue = curl_exec($ch);
curl_close($ch);
return $retValue;
}

$sXML = download_page('http://alanstorm.com/atom');
$oXML = new SimpleXMLElement($sXML);

foreach($oXML->entry as $oEntry){
echo $oEntry->title . "\n";
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perdão amigo, eu achei que vc precisava apenas da lógica do loop.

 

Bom, pra ler o XML eu recomendo usar o simplexml_load_file().

Seguindo a estrutura que vc postou no começou, montei o código de como seria:

 

<?php
set_time_limit(3600); //1 hora pra dar timeout
 
$xmls = array(
'url_xml1',
'url_xml2',
'url_xml3',
'url_xml4',
'url_xml5',
'url_xml6'
);
foreach ($xmls as $xml) {
$x = 0;

$xmldata = simplexml_load_file($xml);

foreach ($xmldata->Data as $gravar){     
#mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'");     
if(mysql_affected_rows() != -1){     
    $x++;     
}     
echo $gravar->Id . "<br>";
}
 
$i++;
}
?>

 

 

Veja se funciona pra vc. Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu ja uso o simplexml_load_file ve o codigo acima

o problema é que sempre retorna este erro 503. se eu leio um ou dois xml de boa

 

mas se eu leio varios grandes, ele retorna isso

 

eu pensei talvez eu fazer ele le 1, da tipo um refresh na pagina le o 2, da outro refresh le o 3 e assim vai

talvez ajuda na carga. mas como fazer isso porque quando da refresh perde o que estava fazendo e comeca de novo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, eu tinha visto que vc usou lá em cima. Por isso no primeiro post eu achei desnecessário mostrar como captar o XML.

 

Eu apenas usei de novo de forma que leia mais de um XML, não achei sua mensagem falando que isso dava erro. Apenas falou que dava timeout e a solução tá nesse meu código aí na primeira linha.

 

Bom, se vc quer dar refresh e ler o próximo, eis a solução:

 

<?php
set_time_limit(3600); //1 hora pra dar timeout

$pos = 0;
if (!empty($_GET['pos'])) $pos = $_GET['pos'];

$xmls = array(
'url_xml1',
'url_xml2',
'url_xml3',
'url_xml4',
'url_xml5',
'url_xml6'
);

$total_pos = count($xmls);

$x = 0; //estou mantendo o X porque não sei onde vc usa ele

$xmldata = simplexml_load_file($xmls[$pos]);

foreach ($xmldata->Data as $gravar){     
#mysql_query("INSERT INTO tabela (id, referencia) VALUES ('$gravar->Id', '$gravar->Referencia'");     
if(mysql_affected_rows() != -1){     
    $x++;     
}

echo $gravar->Id . "<br>";
sleep(2); //apenas pra dar tempo de vc ver o resultado na tela, qdo não precisar, tire isso

//aqui vai o redirect
$pos++;
if ($pos < $total_pos)
	header("Location: essearquivo.php?pos=" . $pos);
else
	echo 'Todos os XMLS foram lidos.';
 
$i++;
}
?>

 

 

Valeu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi a logica, estou tentando fazer aqui mas num sei se modifiquei errado. ele só ta imprimindo o ultimo valor que é o segundo link.

como posso fazer para ler 1 xml, escrever no arquivo, ler o segundo xml e escrever na outra linha do arquivo.

 

olha o codigo como ficou. Desta forma ele ta lendo todos xml e imprimindo sempre o ultimo. Não ta dando refresh na pagina a cada xml e lendo o proximo

 

 

<?php
#set_time_limit(3600); //1 hora pra dar timeout
$pos = 0;
$fp = fopen("bloco.txt", "a");

if (!empty($_GET['pos']))
$pos = $_GET['pos'];
$xmls = array(
'https://www.site.com/arquivo.xml?xml=1',
'https://www.site.com/arquivo..xml?xml=2'
);

$total_pos = count($xmls);
$xmldata = simplexml_load_file($xmls[$pos]);

foreach ($xmldata->Data as $gravar){
$escreve = fwrite($fp, "$gravar->ID");
$pos++;

if ($pos < $total_pos) {
header("Location: teste.php?pos=" . $pos);
}else{
echo 'Todos os XMLS foram lidos.';
}
$i++;
}
fclose($fp);
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, adaptando a realidade fica mais fácil.

Eu só modifiquei o código aqui e não testei, tá?

 

Veja se assim te resolve:

 

<?php
    #set_time_limit(3600); //1 hora pra dar timeout
    $pos = 0;
    $fp = fopen("bloco.txt", "a");
    
    if (!empty($_GET['pos'])) {
        $pos = $_GET['pos'];
	}
    
	$xmls = array(
        'https://www.site.com/arquivo.xml?xml=1',
        'https://www.site.com...uivo..xml?xml=2'
    );
    
    $total_pos = count($xmls);
    $xmldata = simplexml_load_file($xmls[$pos]);
    
    foreach ($xmldata->Data as $gravar) {    
        $escreve = fwrite($fp, "$gravar->ID");
        $pos++;
    }
	
    fclose($fp);
	
	if ($pos < $total_pos) {
		header("Location: teste.php?pos=" . $pos);
	} else {
		echo 'Todos os XMLS foram lidos.';
	}
?>

 

 

Abs,

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu tenho impressão que deu certo, vou deixar lendo e ver o resultado.

só uma dica, sempre confundo isso

 

como faço pra concatenar os valores no fwrite,

 

$escreve = fwrite($fp, "$gravar->ID");

 

queria deixar ele com quebra e separado por ponto e virugula

 

1 ; 2 ; 3 ' ; 1 ; 2 ; 3

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra adicionar um ";" e quebra de linha depois de cada ID, faça assim:

 

<?php
$escreve = fwrite($fp, $gravar->ID . ";\n");
?>

 

Deve funcionar. Pra concatenar uma variável com uma string no PHP, usamos o separador "." (ponto).

O ponto e vírgula é literalmente o caractere que vc quer adicionar e o "\n" é o código para quebra de linha. Só vai funcionar o "\n" em aspas duplas, ok? Em aspas simples ele não quebra linha e escreve no arquivo literalmente o código.

 

Responde se vc conseguiu depois, vlw.

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

deixei lendo e ele parou de ler no decimo xml

fui ver o xml e percebi que a estrutura dele é diferente, neste caso não vai encontrar o $gravar->ID por exemplo porque ele nao existe neste xml.

 

como posso fazer para ele ignorar, se nao encontrar esta estutura ele pula esta linha e nao le o xml

Compartilhar este post


Link para o post
Compartilhar em outros sites

Parou porque deu algum erro, certo? Senão não devia parar.

 

Tenta assim:

 

<?php
#set_time_limit(3600); //1 hora pra dar timeout
$pos = 0;

if (!empty($_GET['pos'])) {
	$pos = $_GET['pos'];
}

$xmls = array(
	'https://www.site.com/arquivo.xml?xml=1',
	'https://www.site.com...uivo..xml?xml=2'
);

$total_pos = count($xmls);
$xmldata = simplexml_load_file($xmls[$pos]);

if (!empty($xmldata->Data->ID)) { //verifica se o valor existe
	foreach ($xmldata->Data as $gravar) {    
		$fp = fopen("bloco.txt", "a"); //passei o fopen e fclose pra dentro do loop pra não abrir o arquivo se não for gravar
		$escreve = fwrite($fp, $gravar->ID);
		fclose($fp);
	}
} else { //se não existir o ID, apenas pula o XML
	$pos++;
}


if ($pos < $total_pos) {
	header("Location: teste.php?pos=" . $pos);
} else {
	echo 'Todos os XMLS foram lidos.';
}
?>

 

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

pulou,

so que ele leu o xml 3x

 

apareceu 3 linhas com o mesmo conteudo do xml

 

so passei 2 xml para ler, o primeiro (nao existe o ID) o segundo ja existe

 

@edit

Ele ficou preso no laço, esta imprimindo infinitamente o contendo do xml que tem a tag



Eu coloquei o $pos++ em baixo do fclose também

sera que tera algumn problema, parece que funcinou assim



Parece que colocando o $pos++ depois do fclose tbm nao resolveu

coloquei 4 xml (2 sem e 2 com) e imprimiu 3 minhas

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.