Ir para conteúdo

POWERED BY:

Arquivado

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

Netanias

Como Ler o XML do Buscapé Afiliados?

Recommended Posts

Senhores, boa tarde... Tudo bem?

 

Senhores,eu jah tentei de tudo para ler esse XML mas não consigo... Alguém poderia colocar um script como exemplo..

Pelo menos que lesse qualquer outro XML com nós, subnós, subsubnós, etc...

 

Esse é um dos XML's que estou tentando exibir como uma vitrine de produtos...

http://parceiroxml.buscape.com.br/produto.do?id=5&np=4

 

O que eu precisaria daí:

 

- Nome do Produto

- Valor

- Empresa

- Link

 

No aguardo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

exemplo

 

Arquivo: internet.xml(exemplo)

 

<?xml version="1.0" encoding="ISO-8859-1" ?>
	<Internet>
		<Opcoes>
			WEB - E-MAIL - VOZ
				<empresa>
					<Opcao>Sites</Opcao>
				</empresa>
				<empresa2>
					<Opcao>E-mails</Opcao>
				</empresa2>
				<empresa3>
					<Opcao>Portal</Opcao>
				</empresa3>
		</Opcoes>
	</Internet>

Lendo o documento internet.xml

 

No exemplo abaixo, iremos extrair só os elementos filhos que nos interessam.

 

 

<%
'Instancia o objeto XMLDOM.
Set objXMLDoc = CreateObject("MSXML2.DOMDocument.4.0")
 
'Indicamos que o download em segundo plano não é permitido
objXMLDoc.async = False
 
'Carrega o domcumento XML
objXMLDoc.load("e:\home\LoginFTP\Web\internet.xml")
 
 
'O método parseError contém informações sobre o último erro ocorrido
if objXMLDoc.parseError <> 0 then
 
response.write "Código do erro: " & objXMLDoc.parseError.errorCode & "<br>"
response.write "Posição no arquivo: " & objXMLDoc.parseError.filepos & "<br>"
response.write "Linha: " & objXMLDoc.parseError.line & "<br>"
response.write "Posição na linha: " & objXMLDoc.parseError.linepos & "<br>"
response.write "Descrição: " & objXMLDoc.parseError.reason & "<br>"
response.write "Texto que causa o erro: " & objXMLDoc.parseError.srcText & "<br>"
response.write "Url do arquivo com problemas: " & objXMLDoc.parseError.url
 
else
 
'A propriedade documentElement refere-se à raiz do documento
Set raiz = objXMLDoc.documentElement
 
'Looping para percorrer todos os elementos filhos
For i = 0 to raiz.childNodes.length -1
 
'A propriedade NodeName contém o nome do elemento
'A propriedade childNodes contém a lista de
'elementos filhos
Response.write raiz.NodeName & "<br>" & raiz.childNodes.item(i).childNodes.item(0).text & "<br>" &  raiz.childNodes.item(i).childNodes.item(1).text
 
Next
 
end if
 
'Destruindo os objetos
Set objXMLDoc = Nothing
Set raiz = Nothing
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Xanburzum, beleza kara?

 

Rapaz, soh uma coisa!

 

De XML eu não entendo mt bem algumas coisas!

Eu já tentei fazer, lendo o nome dos nós, mas não deu certo...

 

Você poderia fazer um exemplo de como rodar aquele lá que passei o link?

http://parceiroxml.buscape.com.br/produto.do?id=5&np=4

 

Ficarei agradecido!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso ai é mole de se fazer, basta utilizar DOM com selectsinglenode para buscar os dados referentes as tags, neste caso a marcação é algo como //nometag, em relação aos parâmetros de apenas uma marcação se utiliza selectsingnode .text, para parâmetros com marcação extra dentro da tag, se utiliza attributes getnameditem especificação de nome e .text, e para referencias múltiplas com valores de tags semelhantes com valores diferentes se faz uma marcação do tipo //nometag[@tagextra=valor]

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kara, num entendi nada! kkkkkk

 

Poderia enviar um exemplo? Obrigado!

XML ainda estou tentando aprender!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz um exemplo simples aqui para você ter uma idéia, o segredo esta na marcação da tag, por exemplo...

 

Na url do buscape que você passou tem a seguinte tag com as seguintes marcações

 

<prd id="197069" nemp="10">

Vamos supor que você queira recuperar o valor nemp desta tag, neste caso você teria que utilizar selectsinglenode com atributes getnameditem neste caso para identificar qual marcação dentro da tag você quer tirar o valor, neste exemplo como vamos tirar o valor da marcação nemp eu faço assim:

 

selectsinglenode("//prd").attributes.getnameditem("nemp").text

repare que no selectsinglenode eu dei o valor da tag prd da seguinte forma //prd ou seja todas as chamativas terão que conter o // e no caso eu queria buscar o valor nemp com isso utilizei attributes.getnameditem("nemp").text que dai me retorna o valor quando puxo por uma variável.

 

Agora vamos supor que você queira buscar o valor de uma tag sem marcação, ou seja, apenas a tag com o valor, neste caso a tag lá esta da seguinte maneira...

 

<dl>Sony DVP SR200P</dl>

para pegar o valor desta tag <dl> que no caso é única você faz assim...

 

selectsinglenode("//dl").text

neste caso repare que eu não utilizei atributes getnameitem pois não tem marcação extra

 

Agora vamos ao exemplo de tags com marcações iguais no qual se define a diferença pelo valor, neste caso são estas tags...

 

<prc tprc="min" vlr="141.00"/>
<prc tprc="max" vlr="179.00"/>

Repare que o que diferencia é o valor da marcação tprc... uma é min e outra é max, neste caso você tem que utilizar dentro do selectsinglenode uma marcação no qual define que quer pegar o valor da tag que contém o valor min na marcação tprc que esta dentro da tag prc, neste caso você teria que fazer assim para puxar o valor

 

selectsinglenode("//prc[@tprc=""min""]").attributes.getnameditem("vlr").text

se quisesse pegar o valor max mudaria apenas o valor dentro da marcação tprc que esta de min para max, ficando assim

 

selectsinglenode("//prc[@tprc=""max""]").attributes.getnameditem("vlr").text

Ou seja, você terá que definir tag por tag... marcação por marcação... identificando uma a uma e mostrando ao sistema qual dados colher, isso tudo é uma questão de lógica.

 

Para ter uma melhor idéia fiz um script para te servir como modelo, com ele você entendera melhor o que disse acima, fiz ele agora na pressa aqui por isso é o básico pois para códigos que exigem valores vindos de outros sites é necessário fazer um tratamentos de erro, em alguns casos utilizar for para mais de um valor, mais esta parte é a mais fácil pois são os princípios básicos do que é feito no asp no dia a dia, no caso do DOM ele possibilita infinitas possibilidades, basta estudar e botar a mão na massa, estou te dando o pão a faca...tu terá que passar a manteiga, boa sorte.

 

Segue abaixa a function que eu fiz para servir como base pra tu

 

<%
Function buscape(id,np)
set buscape = createObject("MSXML2.DOMDocument")
   
        buscape.async = False
        buscape.setProperty "ServerHTTPRequest", true
        buscape.load("http://parceiroxml.buscape.com.br/produto.do?id="& id &"&np="& np &"")

        produto = buscape.selectsinglenode("//dl").text
        imagem = buscape.selectsinglenode("//src").attributes.getnameditem("url").text
        valormin = buscape.selectsinglenode("//prc[@tprc=""min""]").attributes.getnameditem("vlr").text
        valormax = buscape.selectsinglenode("//prc[@tprc=""max""]").attributes.getnameditem("vlr").text	

        response.write("Nome do produto: "& produto &"<br />Imagem: "& imagem &"<br />Valor Mínimo: "& valormin &"<br />Valor Máximo:"& valormax)

set buscape = nothing
End Function

Call buscape("5","4") 
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kara, o tutorial tah muito bom.. Peguei 100% dele!

 

Só mais uma pergunta:

 

Como eu faço ele exibir todos os produtos do xml...

 

Tipo For Next, sei lá....

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

um outro tutorial link

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kara, eu num entendi como setar pra fazer o código exibir todos os dados do xml...

 

veja como eu fiz!

 

<% 
Function buscape(id,np) 
set buscape = createObject("MSXML2.DOMDocument") 
    
        buscape.async = False 
        buscape.setProperty "ServerHTTPRequest", true 
        buscape.load("http://parceiroxml.buscape.com.br/produto.do?id="& id &"&np="& np &"")
		
Set objLst = buscape.getElementsByTagName("prd")
For i = 0 To objLst.Length - 1
        produto = buscape.selectsinglenode("//dl").text 
        imagem = buscape.selectsinglenode("//src").attributes.getnameditem("url").text 
        valormin = buscape.selectsinglenode("//prc[@tprc=""min""]").attributes.getnameditem("vlr").text 
        valormax = buscape.selectsinglenode("//prc[@tprc=""max""]").attributes.getnameditem("vlr").text  
 
        response.write("Nome do produto: "& produto &"<br />Imagem: "& imagem &"<br />Valor Mínimo: "& valormin &"<br />Valor Máximo:"& valormax & "<br><br>") 
Next

set objLst = nothing 
set buscape = nothing 
End Function 
 
Call buscape("5","4")  
%>

Não dá certo, porque...

 

1. Ele conta a quantidade de nós / produtos corretamente ( No caso, 4 itens )

2. Só que ele apenas exibe o primeiro item 4 vezes...

 

Como fazer pra ele exibir todos os itens?

Compartilhar este post


Link para o post
Compartilhar em outros sites

olha o exemplo do post #2

Compartilhar este post


Link para o post
Compartilhar em outros sites

<%

Function buscape(id,np)

set buscape = createObject("MSXML2.DOMDocument")

 

buscape.async = False

buscape.setProperty "ServerHTTPRequest", true

buscape.load("http://parceiroxml.buscape.com.br/produto.do?id="& id &"&np="& np &"")

 

' Mudei isso aqui...

Set raiz = buscape.documentElement

For i = 0 to raiz.childNodes.length -1

'... até aqui. Mas soh exibe 1 produto - normal, sem repetições.

 

 

produto = raiz.selectsinglenode("//dl").text

imagem = raiz.selectsinglenode("//src").attributes.getnameditem("url").text

valormin = raiz.selectsinglenode("//prc[@tprc="min&quot]").attributes.getnameditem("vlr").text

valormax = raiz.selectsinglenode("//prc[@tprc="max&quot]").attributes.getnameditem("vlr").text

 

response.write("Nome do produto: "& produto &"<br />Imagem: "& imagem &"<br />Valor Mínimo: "& valormin &"<br />Valor Máximo:"& valormax & "<br><br>")

 

Next

 

set objLst = nothing

set buscape = nothing

End Function

 

Call buscape("5","4")

%>

 

 

Não deu ainda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta ai

 

<%
Function buscape(id,np)
set buscape = createObject("MSXML2.DOMDocument")
   
        buscape.async = False
        buscape.setProperty "ServerHTTPRequest", true
        buscape.load("http://parceiroxml.buscape.com.br/produto.do?id="& id &"&np="& np &"")
		
        set quantidade = buscape.selectNodes("//dl")
		
	 For i = 0 to quantidade.length - 1
	        produto = quantidade(i).selectsinglenode("//dl").text
                imagem = quantidade(i).selectsinglenode("//src").attributes.getnameditem("url").text
                valormin = quantidade(i).selectsinglenode("//prc[@tprc=""min""]").attributes.getnameditem("vlr").text
                valormax = quantidade(i).selectsinglenode("//prc[@tprc=""max""]").attributes.getnameditem("vlr").text	
                response.write("Nome do produto: "& produto &"<br />Imagem: "& imagem &"<br />Valor Mínimo: "& valormin &"<br />Valor Máximo:"& valormax)
	 next
	 
	 set quantidade = nothing

set buscape = nothing
End Function

Call buscape("5","4") 
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Kara, boa noite... beleza?

 

Tu conseguiu rodar esse script pra ele mostrar todos os itens?

 

1. Sony DVP SR200P

2. Philips DVP3350KMX

3. Tectoy DVT-F651

4. LG DV 497H

 

Mas eu soh consigo ler o primeiro 4 vezes.

 

COLOQUEI ASSIM TAMBÉM E NADA:

set quantidade = buscape.selectNodes("//prd")

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não rodei não, fiz a modificação com o code que te passei aqui mais não coloquei e testei aqui, vou testar aqui.

 

No caso o set quantidade = buscape.selectNodes("//dl") esta correto, pois utilizo ele para percorrer as tags do xml e extrategicamente escolhe-se uma tag que seja único mais que esteja presente em outros nestes caso em produtos, se fosse uma tag múltipla como prc ela iria mostrar 8 ao invés de 4.

 

Mais vou testar aqui e ver o que ta de errado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho... realmente esta repetindo, fiz uns testes e nada, depois se baseando na formatação do code que o Xam postou fiz da mesma maneira

 

<%
Function buscape(id,np)
set buscape = createObject("MSXML2.DOMDocument")
   
        buscape.async = false
        buscape.setProperty "ServerHTTPRequest", true
        buscape.load("http://parceiroxml.buscape.com.br/produto.do?id="& id &"&np="& np &"")
	
        set quantidade = buscape.selectnodes("//dl")
		
	 for i = 0 to quantidade.length - 1
	       produto = quantidade.item(i).selectsinglenode("//dl").text
               imagem = quantidade.item(i).selectsinglenode("//src").attributes.getnameditem("url").text
               valormin = quantidade.item(i).selectsinglenode("//prc[@tprc=""min""]").attributes.getnameditem("vlr").text
               valormax = quantidade.item(i).selectsinglenode("//prc[@tprc=""max""]").attributes.getnameditem("vlr").text	
               response.write("Nome do produto: "& produto &"<br />Imagem: "& imagem &"<br />Valor Mínimo: "& valormin &"<br />Valor Máximo:"& valormax)
	       response.write("<br /><br />")
	 next
	 
	 set quantidade = nothing

set buscape = nothing
End Function

Call buscape(5,4) 
%>

mais novamente repete ao invés de não repetir os mesmo itens, estou achando que pode ser por conta da formatação do xml, que no neste caso é diferenciado,

 

Vou ficar te devendo essa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

verificou o XML, se a estrutura esta correta ?!?!?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite, beleza?

 

Xanburzum, kara, a estrutura do XML está correta! Os mesmos nós "filhos" e o mesmo nó "pai".

 

O problema só estão mesmo na tag <prd></prd> que delimitam cada produto...

 

Flw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema só estão mesmo na tag <prd></prd> que delimitam cada produto

o que ele gera agora..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rapaz, ele soh repete o primeiro item 4 vezes... Num dá mais nada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

apenas para teste, crie um novo e teste, e poste o resultado

Olha este exemplo, Note que ele está pegando as informações para montar a página asp diretamente do arquivo XML.

t

 

<%
Option Explicit
Response.Buffer = True


Dim xml
Set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = False
xml.load (Server.MapPath("arquivo.xml"))

Dim titulo, cabecalho, paragrafo, Corpo

titulo = xml.documentElement.childNodes(0).text
cabecalho = xml.documentElement.childNodes(1).text
paragrafo = xml.documentElement.childNodes(2).text
corpo = xml.documentElement.childNodes(3).text
Set xml = Nothing
%>
<html>
<head>
<title><%= titulo%></title>
</head>
<body>
<h3 align="center"><%= cabecalho %></h3>
<p align="center"><% = paragrafo %></p>
<div align="center"><%= corpo %></div>
</body>

</html>

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.