Ir para conteúdo
Fórum Script Brasil
  • 0

Ler Xml Do Google Calendar Com Php


heltonritter

Pergunta

Bom dia amigos.

estou com problemas ...

Sendo objetivo... tenho o RSS gerado pelo Google Calendar:

http://www.google.com/calendar/feeds/8lumr...com/public/full

tenho que ler este xml e mostrar o compromissos marcados (os valores dentro de ENTRY)

o title...

<title type="text">Viagem Blumenau</title>

e também quando inicia e quando acaba este compromisso... estas informações estão em:

<gd:when startTime="2007-02-06T21:30:00.000-02:00" endTime="2007-02-07T07:30:00.000-02:00">

tentei de várias maneiras... com a simplexml

não consigo usar os nós que tem ":" ... tipo nó GD namespace WHEN dalí teria que pegar o atributo STARTTIME e ENDTIME.

mas não consigo pegar nada de valores de nós com namespaces... a SimpleXML também não acessa arquivos remotos....

Tentativa 1 - com SimpleXML

<?php
$XmlFileToWork=('md_humberto.xml');

if (file_exists($XmlFileToWork)) {
    $xml = simplexml_load_file($XmlFileToWork);
    foreach ($xml->entry as $entry) {
        echo $entry->title,'<br />'; // nome do compromisso
    }

} else {
    echo('Não foi possível encontrar o RSS desta agenda para ser exibido!');
}
?>
Tem como trabalhar com arquivos remotos? e com nós como GD:WHEN e pegar os valores dos atributos? tentei também com a EXPAT - http://www.jclark.com/xml/expat.html que também tá rodando aqui no meu php 5.1.2 a tentativa foi:
<?php

function startElement($xml_parser, $name, $attributes) {
  global $l,$c,$dados;    
  $l++;
  print("<p>[i]INI Elemento: [/i]$name\n");

  if($name =='GD:WHEN'){
      $c++;
      $dados[$l][$c]=$attributes['STARTTIME'];
    $c++;
    $dados[$l][$c]=$attributes['ENDTIME'];
  }
  if ($name=='TITLE') {
      //echo (' Atr Title: '.print($name).'<br>');
  }
  
} // fim da function


function endElement($xml_parser, $name) {
  print("<p>[i]Fim Elemento: [/i]$name\n");
} // fim da function

function characterData($xml_parser, $data) {
   global $l;
   if($data != "\n") {
       //echo('L:'.$l); 
     print("<p>[i]DADO :[/i]$data\n");
   }
}

function load_data($file) {
   $fh = fopen($file, "r") or die ("<P>COULD NOT OPEN FILE!");
  //não da para usar filesize em arquivos remotos... então..
   $data = fread($fh, 9000000); 
   return $data;
 } // fim da function
  
  /***** MAIN *****/
  $file = "http://www.google.com/calendar/feeds/8lumr5mpipqfrbvi844j1r63hg%40group.calendar.google.com/public/full";
  
  $xml_parser = xml_parser_create();
  xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
  xml_set_element_handler($xml_parser, "startElement", "endElement");
  
  xml_set_character_data_handler($xml_parser, "characterData");
  
  xml_parse($xml_parser, load_data($file)) or die ("<P>ERROR PARSING XML!");
  xml_parser_free($xml_parser);

print_r($dados);
?>
Nesta segunda tentativa o que está dentro de TITLE quebra a linha sempre que aparece o primeiro caracter especial do dado. Não estou conseguindo pegar as informações que preciso.... e finalmente a terceira tentativa... raríssimo exemplo da técnica GAMBIS e da POG....
<?php
$File=('http://www.google.com/calendar/feeds/8lumr5mpipqfrbvi844j1r63hg%40group.calendar.google.com/public/full');

$FileAberto=(fopen($File,'r'));
$TextoFile=(fread($FileAberto,1000000));
$ExplodidoPorEntrye=(explode('<entry>',$TextoFile));
$MaiorIndice=(count($ExplodidoPorEntrye)-1);

for($i=1;$i<=$MaiorIndice;$i++){
    // para pegar o ttulo
    $ExplodePorTitulo=(explode('<title type="text">',$ExplodidoPorEntrye[$i]));
    $PosFimTitulo=strpos($ExplodePorTitulo[1],'</title>');
    $ValorTitulo=(substr($ExplodePorTitulo[1],0,$PosFimTitulo));
    //pega o horario inicial
    $ExplodidoPorWen=(explode('<gd:when startTime="',$ExplodidoPorEntrye[$i]));
    $ExplodidoPorAspasDuplas=explode('"',$ExplodidoPorWen[1]);
    $DataHoraInicio=$ExplodidoPorAspasDuplas[0];
    //pega o horrio final
    $DataHoraFim=$ExplodidoPorAspasDuplas[2];
    // pegando o link para esta marcao na agenda
    // tem que fazer ainda....
    
    // tratando os valore da data de inicio
    $DataHoraInicio=(substr($DataHoraInicio,0,16));
    //$DataHoraInicio=(mktime(substr($DataHoraInicio,11,-3),substr($DataHoraInicio,14),00,substr($DataHoraInicio,5,2),substr($DataHoraInicio,8,-6),substr($DataHoraInicio,0,4)));
    
    // tratando os valores da data de fim
    $DataHoraFim=(substr($DataHoraFim,0,16));
    //$DataHoraFim=(mktime(substr($DataHoraFim,11,-3),substr($DataHoraFim,14),00,substr($DataHoraFim,5,2),substr($DataHoraFim,8,-6),substr($DataHoraFim,0,4)));
    
    echo($DataHoraInicio.' as '.$DataHoraFim.' - '.$ValorTitulo.'<br>');
}
?>

Nesta tentativa eu abro o arquivo e vou quebrando ele até ter os valores que preciso....

Se o arquivo xml estiver local funciona 100%...

por exemplo se o xml fosse algo como 'agenda.xml' funcionaria sem problemas e traria tudo o que preciso...

Mas com arquivos remotos...ele não lê todo o arquivo.....

pior...

carrega sempre uma quantidade diferente de texto (xml)...e aí não funciona nada...

Como conseguir ler TODO o arquivo remoto e colocar este texto em uma variável, para só então usá-la?

Bom, tendo como resolver o problema... de qualquer uma das formas tá ok... procurei também por classes prontas para trazer resultados do google calendar ... mas não achei... se alguém souber de um...

Agradeço toda e qulquer ajuda.

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Você pode usar file() para ler o conteúdo todo do arquivo para o array onde as linhas são o índice desse array, ou então file_get_contents() para ler o arquivo inteiro e copiá-lo para uma variável.

Mas assim, o recomendado mesmo seria você tentar fazer o parsing do XML, ele já tá aí pra facilitar né, usar essas técnicas POG cheias de substr não tá com nada, hehehehe.

Editado por victorhb
Link para o comentário
Compartilhar em outros sites

  • 0

Hehehe sou da mesma opinião... essas gambiaras é só para se encomodar depois! os caras do google mexem em uma vírgula no xml e script não funciona mais....

boa dica, não estava lembrando de ler o arquivo usando file() ....com file ele abriu todo o arquivo... pelo método POG já é suficiente para fazer dar certo...

peguei uns livros aí na biblioteca da faculdade... mas não me ajudaram nada.. são muito superficiais na parte de xml ... mas vou continuar tentando fazer isso da menaira certa...

qualquer dia pretendo postar ai nos "scripts prontos" para você trabalhar com o xml do google agenda.

Valeu cara... de momento vai quebrar meu galho...

mas o parser ainda será a melhor opção...

Se alguém tiver uma dica ... poste aí.

Obrigado.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...