tmobilon 0 Denunciar post Postado Setembro 20, 2006 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
tmobilon 0 Denunciar post Postado Setembro 20, 2006 Ok, peço desculpas, mas o que eu escrevi foi "Ajuda com Script em XML"E não "AJUDA!!" OU "SOCORRO!" ;)de qualquer forma, alguém pode me ajudar? Compartilhar este post Link para o post Compartilhar em outros sites
ignorante 0 Denunciar post Postado Setembro 20, 2006 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
tmobilon 0 Denunciar post Postado Setembro 20, 2006 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
ignorante 0 Denunciar post Postado Setembro 20, 2006 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
tmobilon 0 Denunciar post Postado Setembro 20, 2006 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
ignorante 0 Denunciar post Postado Setembro 20, 2006 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
tmobilon 0 Denunciar post Postado Setembro 20, 2006 Agradeço imensamente por você ter se empolgado!! Está tudo bem claro agora! Vou tentar bolar esse script como você explicou e ver se consigo fazer essa jossa funcionar!! ahuhauahuahuah Valeu! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites