Ir para conteúdo

POWERED BY:

Arquivado

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

tmobilon

Script para ler XML

Recommended Posts

To precisando muito da ajuda de vocês para desenvolver alguns scripts.

O meu maior problema é que eu não sou programador, apenas um "bom mexedor".

 

Seguinte, estou tentando desenvolver um script que imprima na minha página as keywords listadas neste XML do Mercado Livre:

 

http://www.mercadolivre.com.br/jm/ml.web.p..._id=&as_XML

 

Essas keywords variam de acordo com a categoria em questão. Desta forma, uso o parâmetro _GET para preencher o "as_categ_id" de acordo com a categoria em que o usuário estiver navegando.

 

O código que "desenvolvi" não é nada muito inteligente, pois afinal, ele não está nem funcionando hauhauhauahuahua.

 

Gostaria de pedir a ajuda de vocês para corrigir o mesmo e deixá -lo funcionando em meu site.,

 

Quando insiro o mesmo na minha página, não aparece sequer uma mensagem de erro.

 

Segue abaixo:

 

<? # gZIP Settings $gzip = true; # Link$link_search='e-shop/?word=';function startElementtend($parser, $name, $attrs) { global $link_search;echo '<a href="'.$link_search.$attrs['keyword'].'">'.$attrs['keyword'].'</a>';}function endElementtend($parser, $name) { global $link_search; }$baseURL = 'http://www.mercadolivre.com.br/jm/ml.web.pulse.PulsePageController?as_categ_id='.$tend_id.'&as_XML';$xml_parsertend = xml_parser_create(); xml_set_element_handler($xml_parsertend, "startElementtend", "endElementtend"); $fp = fopen($baseURL,"r") 			or die("Error reading RSS data."); 			while($data = fread($fp, 4096)) {   # begin parse   xml_parse($xml_parsertend, $data, feof($fp))   or die(sprintf("XML error: %s at line %d",   xml_error_string(xml_get_error_code($xml_parsertend)),   xml_get_current_line_number($xml_parsertend)));   # end parse } fclose($fp); xml_parser_free($xml_parsertend); ?>

Agradeço toda e qualquer ajuda ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho q você está fazendo uma pequena confusão.

 

function startElementtend($parser, $name, $attrs) {global $link_search;echo '<a href="'.$link_search.$attrs['keyword'].'">'.$attrs['keyword'].'</a>';}

Aqui você está procurando um atributo "keyword", e no XML não existe esse atributo, existe sim uma TAG "keyword", q é a tag q você está procurando. Isso deve ser tratado com characterData:

function characterData($parser, $data) {   echo $data;}xml_set_character_data_handler($xml_parser, "characterData");

Está quase certo, acho q você entendeu essa parte do parser, mas vou explicar para quem está lendo e não entende:

Um parser XML é um carinha que vai lendo linha a linha um arquivo XML. Aí ele pode fazer basicamente 3 coisas:

1. Executar uma função (startElementtend) ao encontrar uma TAG de abertura de elemento (<keyword> neste caso);

2. Executar uma função (endElementtend) ao encontrar uma TAG de fechamento de elemento (</keyword>);

xml_set_element_handler($xml_parsertend, "startElementtend", "endElementtend");
3. Executar uma função (characterData) com o conteúdo dessa TAG:

xml_set_character_data_handler($xml_parsertend, "characterData");

você já tem uma variável global definida, que vai guardar o valor da TAG em uso no momento (lembre-se q você está dentro de um loop varrendo todas as linhas do XML). A sua função characterData pode ser algo como:

function characterData($parser, $data) {   global $link_search;	if ($link_search == "keyword") {		echo '<a href="'.$data.'">'.$data.'</a>';	}}xml_set_character_data_handler($xml_parsertend, "characterData");

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agradeço muito as respostas Ignorante.

Ainda estou meio confuso sobre o jeito que mostrou o &link_search no characterData, porém peguei o resto.

 

A variável $link_search na verdade guarda a url base, onde, virá depois dela as keywords montando automaticamente várias buscas com as keywords.

 

Dá uma olhada em como está o script agora:

 

<? # URL para montar a busca$link_search='http://tecnoblog.net/e-shop/?word=';function startElementtend($parsertend, $name, $attrs) { global $link_search, $tag, $keyword, $rank, $attrbs;}function endElementtend($parsertend, $name) { global $link_search, $tag, $keyword, $rank, $attrbs; }function characterDatatend($parsertend, $data) {global $link_search, $tag, $keyword, $rank, $attrbs;   echo $data;}$baseURL = 'http://www.mercadolivre.com.br/jm/ml.web.pulse.PulsePageController?as_categ_id='.$tend_id.'&as_XML';$xml_parsertend = xml_parser_create(); xml_set_element_handler($xml_parsertend, "startElementtend", "endElementtend");xml_set_character_data_handler($xml_parsertend, "characterData");$fp = fopen($baseURL,"r") 			or die("Error reading RSS data."); 			while($data = fread($fp, 4096)) {   # begin parse   xml_parse($xml_parsertend, $data, feof($fp))   or die(sprintf("XML error: %s at line %d",   xml_error_string(xml_get_error_code($xml_parsertend)),   xml_get_current_line_number($xml_parsertend)));   # end parse } fclose($fp); xml_parser_free($xml_parsertend); ?>

Infelizmente ainda não funciona.

 

para chamar ele no meu template estou usando o seguinte código:

<?phpif (!$_GET['id']){$tend_id='';} else {$tend_id=$_GET['id'];include('xml-tendencias.php');}?>

Sabe o que pode ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

My bad, eu q confundi as variáveis.

Tente assim:

<?# URL para montar a busca$link_search='http://tecnoblog.net/e-shop/?word=';function startElementtend($parsertend, $name, $attrs) {global $link_search, $tag;	$tag = $name; // Aqui você seta o nome da tag q o script está lendo}function endElementtend($parsertend, $name) {global $link_search, $tag;}function characterDatatend($parsertend, $data) {global $link_search, $tag, $keyword;	if ($tag == "keyword") { // $tag é uma variável global		echo $data;	}}$baseURL = 'http://www.mercadolivre.com.br/jm/ml.web.pulse.PulsePageController?as_categ_id='.$tend_id.'&as_XML';$xml_parsertend = xml_parser_create();xml_set_element_handler($xml_parsertend, "startElementtend", "endElementtend");xml_set_character_data_handler($xml_parsertend, "characterData");$fp = fopen($baseURL,"r")			or die("Error reading RSS data.");			while($data = fread($fp, 4096)) {  # begin parse  xml_parse($xml_parsertend, $data, feof($fp))  or die(sprintf("XML error: %s at line %d",  xml_error_string(xml_get_error_code($xml_parsertend)),  xml_get_current_line_number($xml_parsertend)));  # end parse}fclose($fp);xml_parser_free($xml_parsertend);?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não funcionou =(

 

Há outros dois scripts funcionando na página. O que exibe ofertas usa a função "startElement" e "endElementtend". O que exibe categorias ultiliza "startElementCtree" e "endElementCtree".

 

Eu não sei se essas funções já são do PHP ou se podem ser alteradas, mas, para não dar conflito, eu alterei as mesmas para "startElementtend" e "endElementtend".

 

O mesmo fiz com a sintaxe $parser, que virou $parsertend.

 

Como pode ver não manjo muito de programação, fui montando mais por intuição e comparando os dois scripts que já possuo.

 

Deve haver alguma coisa montada errada nestes scripts que eu desconheço, e é por isso que o mesmo não está funcionando..

 

=(

 

Eu também ainda não entendi o pq você faz a comparação:

if ($tag == "keyword")

Isso não parece formar a estrutura do link que eu quero:

 

http://tecnoblog.net/e-shop/?word= //aqui vai a keyword em questão

 

 

e porque está mandando imprimir $data dentro do characterDatatend. Digo isso pois nos outros scripts as impressões são feitas dentro do endElement ou do startElement.

 

Você tem mais alguma idéia do que pode ser o problema.??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou explicar o que seu código está fazendo para você entender o q você fez e tentar arrumar sozinho:

 

<?# URL para montar a busca$link_search='http://tecnoblog.net/e-shop/?word=';
Esse é o link q você vai montar com as keywords do XML, certo?

 

function startElementtend($parsertend, $name, $attrs) {global $link_search, $tag, $keyword, $rank, $attrbs;}
Essa função será executada toda vez q o parser encontrar qualquer tag

Ela tem 3 parâmetros, o parser, o nome da variável q guarda o nome da tag em uso, e o nome da variável que guarda os atributos dessa tag. Usando o seu XML como exemplo, a primeira tag q o parser vai encontrar seria:

<response type="Palavras mais Buscadas" generation_date_gmt="Wed, 20 Sep 2006 18:32:43 GMT">
Ao ler essa tag, o parser executa a funcao startElementtend e cria 2 variáveis, $name e $attrs.

$name = "response";

$attrs = array("type" => "Palavras mais Buscadas", "generation_date_gmt" => "Wed, 20 Sep 2006 18:32:43 GMT");

 

function endElementtend($parsertend, $name) {global $link_search, $tag, $keyword, $rank, $attrbs;}
Esta função é executada toda vez q o parser ler uma linha q comece com "</", o q indica q está fechando uma tag. Mas acho q você não vai usá-la.

 

function characterDatatend($parsertend, $data) {global $link_search, $tag, $keyword, $rank, $attrbs;  echo $data;}
Esta função acima será executada ao ler o valor da tag, o q está entre as tags de abertura e fechamento.

 

$baseURL = 'http://www.mercadolivre.com.br/jm/ml.web.pulse.PulsePageController?as_categ_id='.$tend_id.'&as_XML';
URL do XML q você vai ler

 

$xml_parsertend = xml_parser_create();
Criou um parser, até aqui td bem.

 

xml_set_element_handler($xml_parsertend, "startElementtend", "endElementtend");
Toda vez q encontrar um elemento, executará essas duas funções.

 

xml_set_character_data_handler($xml_parsertend, "characterData");
Execute esta função para tratar o valor da tag.

 

Lembre-se que até agora só definimos as funções e configuramos o parser. Nada foi feito ainda.

 

$fp = fopen($baseURL,"r")			or die("Error reading RSS data.");
Abriu o XML para leitura. Perfeito..

 

while($data = fread($fp, 4096)) {
Começa a ler linha-a-linha.

 

# begin parse  xml_parse($xml_parsertend, $data, feof($fp))  or die(sprintf("XML error: %s at line %d",  xml_error_string(xml_get_error_code($xml_parsertend)),  xml_get_current_line_number($xml_parsertend)));
Aqui você chama o parser para cada linha lida do XML. É aqui q o bicho pega.

você está dentro de um loop lendo linha a linha o XML. O parser vai ler cada linha e interpretar. Exemplo:

<response type="Palavras mais Buscadas" generation_date_gmt="Wed, 20 Sep 2006 18:32:43 GMT">
Opa, encontrou uma abertura de tag. Vou chamar a função startElementtend() (editei para mostrar como eu faria).

function startElementtend($parsertend, $name, $attrs) {global $link_search, $tag;$tag = $name;}
$tag agora vale "response", q é o nome da tag q o parser está lendo.

Aí ele procura por uma tag de fechamento nessa mesma linha. Puts, não tem... Então deixa quieto e vai para a próxima linha.

 

<copyright>Copyright © 1999-2006 MercadoLibre S.A.</copyright>
Opa! Encontrei uma tag de abertura, chama o startElementtend de novo!

$tag agora vale "copyright".

Ah... Essa tag tem um fechamento ali no final da linha (</copyright>)! Vou executar o endElementtend...

Ai ele pega o q tem no meio e executa com o characterData (editado tb):

function characterDatatend($parsertend, $data) {global $link_search, $tag, $keyword;  $keyword = $data; // $data é o que tem entre as tags de abertura e fechamento  echo '<a href="'.$link_search.$data.'">'.$data.'</a>'; // monta o link q você tanto quer}
MAS você não quer fazer isso com todas as tags, mas somente com a tag "keyword", aí você muda o characterData para;

function characterDatatend($parsertend, $data) {global $link_search, $tag, $keyword;  if ($tag == "keyword") { // por isso q tem essa linha aqui	echo '<a href="'.$link_search.$data.'">'.$data.'</a>'; // monta o link q você tanto quer  }}
Se o parser encontrar uma TAG com o nome "keyword", ele vai dar esse echo.

 

# end parse}fclose($fp);xml_parser_free($xml_parsertend);?>
Blá blá blá e libera a memória.

 

Afff, acho q me empolguei escrevendo aqui... Caso você não tenha entendido td bem, posso tentar explicar de outro jeito, mas o importante é você tentar resolver o problema e saber o q está fazendo. Se quer copiar scripts, aprenda orientação a objetos e hereditariedade, q aí você pode copiar scripts e ainda saber o q está fazendo.. xD

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.