Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Nesse artigo vamos tratar o retorno do método FindProductList para exibição em uma aplicação. Antes de iniciar, faça o download dos arquivos do Wrapper .Net diretamente do nosso perfil no GitHub. Com os arquivos em mãos, adicione-os ao projeto no Visual Studio ou, se preferir, façam uma referência à .dll que também está disponível para download.
Como todos sabem, a API do Buscapé, bem como seu Wrapper em .Net, por padrão, envia como retorno às requisições um XML. Pórem, para desenvolver qualquer aplicação utilizando a API, ou um de seus wrappers, precisamos fazer o ?parse? desse XML, extraindo as informações que a aplicação necessita.
Vamos utilizar o XML de retorno do método FindProductList para exemplificar como exibir em uma aplicação uma listagem com os produtos retornados pelo método. Para conhecer mais sobre o método FindProductList do Wrapper .Net, consulte nossos artigos sobre o tema:
Vamos, então, invocar o método FindProductList e armazenar o XML de retorno em uma string:
Apiki_Buscape_API.Apiki_Buscape_API apiBuscape = new Apiki_Buscape_API.Apiki_Buscape_API("564771466d477a4458664d3d");
Apiki_Buscape_API.FiltrosFindProducts filtrosProdutos = new FiltrosFindProducts();
filtrosProdutos.CategoryId = 6424;
filtrosProdutos.Results = 5;
string result = apiBuscape.FindProductList(filtrosProdutos);
Response.Write(result);
Na linha 7 do código, temos a instrução para exibir no navegador a variável result que contém o XML de retorno do método. Prestem bastante atenção na estrutura do XML, pois precisamos entendê-la bem para conseguir extrair o que precisamos.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Result xmlns="urn:buscape" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" match="all" page="1" totalPages="867" totalResultsReturned="5" totalResultsAvailable="4334" xsi:schemaLocation="http://developer.buscape.com/admin/buscape.xsd">
<details>
<applicationID>564771466d477a4458664d3d</applicationID>
<applicationVersion>1.0.0.0</applicationVersion>
<applicationPath>[http://bws-apps.buscape.com/mobile/update](http://bws-apps.buscape.com/mobile/update)
<date>2012-01-03T10:04:47.540-02:00</date>
<elapsedTime>3</elapsedTime>
<status>success</status>
<code>0</code>
<message>success</message>
</details>
<category hasOffer="false" isFinal="true" parentCategoryId="2" id="6424">
<thumbnail url="http://imagem.buscape.com.br/bp5/categorias/6424.jpg"/>
<links>
<link type="category" url="http://compare.buscape.com.br/notebook.html?mdapp=100&mddtn=69672797"/>
<link type="xml" url="http://sandbox.buscape.com/service/findProductList/564771466d477a4458664d3d/br/?categoryId=6424"/>
</links>
<name>Notebook</name>
<filters></filters>
</category>
<product quantity="0" id="349482" eco="false" hasMetaSearch="false" categoryId="6424" totalSellers="1" fullDescription="false">
<productName>Dell Inspiron 14 Intel Core i3-2330M 2.2 GHz 4096 MB 500 GB</productName>
<productShortName>Notebook Dell Inspiron 14</productShortName>
Vejam que o XML tem os nós pai, details, que contém os detalhes da requisição efetuada; category, que contém os detalhes da categoria dos produtos; e vários nós product, com os detalhes dos produtos retornados. Nesse artigo vamos nos ater aos nós product, pois são eles que vamos tratar e exibir em nossa aplicação.
<product quantity="0" id="349482" eco="false" hasMetaSearch="false" categoryId="6424" totalSellers="1" fullDescription="false">
<productName>Dell Inspiron 14 Intel Core i3-2330M 2.2 GHz 4096 MB 500 GB</productName>
<productShortName>Notebook Dell Inspiron 14</productShortName>
<currency abbreviation="BRL"/>
<priceMin>1499.00</priceMin>
<priceMax>1499.00</priceMax>
<links>
<link type="product" url="http://compare.buscape.com.br/dell-inspiron-14-intel-core-i3-2330m-2-2-ghz-4096-mb-500-gb.html?mdapp=100&mddtn=69672797"/>
<link type="specification" url="http://compare.buscape.com.br/prod_ficha?idu=349482"/>
<link type="xml" url="http://sandbox.buscape.com/service/findOfferList/564771466d477a4458664d3d/br/?productId=349482"/>
</links>
<thumbnail url="http://imagem.buscape.com.br/thumbs/ensopado/6424/200x200_349482_1.jpg"/>
<rating>
<userAverageRating>
<numComments>5</numComments>
<rating>9.6</rating>
<links>
<link type="xml" url="http://sandbox.buscape.com/service/viewUserRatings/564771466d477a4458664d3d/br/?productId=349482"/>
</links>
</userAverageRating>
</rating>
<specification>
<links>
<link type="xml"
Dentro de um nó product temos vários outros nós, que chamaremos de elementos, e os atributos do nó. O que vamos fazer aqui é exibir os dados de cada elemento de product. Para isso, vamos utilizar os métodos de três classes do .Net: XmlDocument, um objeto DOM que representa um documento XML; XmlNodeList, que representa uma coleção de nós ou elementos de um XML e XmlNode, que representa um único nó de um XML. Porém, é bom ter em mente que mesmo esse único nó pode conter outros nós filhos e vários atributos.
Então, a primeira coisa que faremos será instanciar um objeto da classe XmlDocument e utilizar o seu método LoadXml para carregar o XML. A seguir, vamos separar todos os nós product em um objeto da classe XmlNodeList e vamos percorrer nossa coleção de produtos.
// Realiza a leitura do XML a partir do retorno do método FindProductList
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
xmldoc.LoadXml(result);
// Recupera somente os nós de produtos
System.Xml.XmlNodeList products = xmldoc.GetElementsByTagName("product");
foreach (System.Xml.XmlNode item in products)
{
// Percorre a coleção de produtos
}
Dentro do foreach implementado, trataremos com um nó produto de cada vez. Dessa forma, o que temos que fazer é percorrer todos os elementos do nó produto, recuperando seu valor e exibindo no navegador.
// Dentro de cada nó de produto é necessário recuperar todos os nós filhos
System.Xml.XmlNodeList productElements = item.ChildNodes;
foreach (System.Xml.XmlNode element in productElements)
{
// Dentro de cada nó filho de produto tratamos de acordo com a necessidade
switch (element.Name)
{
// Cada caso é um caso...
}
}
Cada elemento de produto tem uma estrutura específica, por esse motivo devemos mapear todos os elementos que queremos exibir e efetuar a lógica necessária em cada elemento para recuperar seu valor e exibi-lo.
case "productName" :
case "productShortName" :
case "priceMin" :
case "priceMax" :
// Para elementos sem nós filhos apenas escrevemos o nome do elemento e seu conteúdo
Response.Write(element.Name + ": " + element.InnerText + "<br />");
break;
case "rating" :
// Para o elemento rating devemos pegar o nó rating dentro do nó userAverageRating
System.Xml.XmlNode rating = element.FirstChild.ChildNodes.Item(1); // 1 é o índice do nó rating dentro de seu nó pai userAverageRating
Response.Write(element.Name + ": " + rating.InnerText + "<br />");
break;
case "specification" :
// Dentro do nó specification temos vários nós item, dentro de cada nó item podemos ter um ou mais nós com o valor da especificação
Response.Write(element.Name + ": <ul>");
System.Xml.XmlNodeList specItens = element.ChildNodes;
foreach (System.Xml.XmlNode spec in specItens)
{
if (spec.Name == "item")
{
Response.Write("<li>"+spec.Attributes.GetNamedItem("label").InnerText + ": <ul>");
System.Xml.XmlNodeList values = spec.ChildNodes;
foreach (System.Xml.XmlNode val in values)
Utilzamos o método Response.Write() para exibir no navegador os dados que recuperamos do XML retornado pelo método FindProductList. Podemos tratar esses dados de muitas outras formas, armazená-los em variáveis, ou até mesmo ter uma estrutura de classes em nosso projeto para armazenar essas informações de produtos, variando de acordo com a necessidade de cada aplicativo.
Para não facilitar a visualização e não ficar nenhum código perdido, aqui embaixo está o código completo do nosso artigo de hoje.
protected void Page_Load(object sender, EventArgs e)
{
// Instância as classes do Wrapper
Apiki_Buscape_API.Apiki_Buscape_API apiBuscape = new Apiki_Buscape_API.Apiki_Buscape_API("564771466d477a4458664d3d");
Apiki_Buscape_API.FiltrosFindProducts filtrosProdutos = new FiltrosFindProducts();
// Configura os filtros do método e obtém o XML de retorno
filtrosProdutos.CategoryId = 6424;
filtrosProdutos.Results = 5;
string result = apiBuscape.FindProductList(filtrosProdutos);
// Realiza a leitura do XML a partir do retorno do método FindProductList
System.Xml.XmlDocument xmldoc = new System.Xml.XmlDocument();
xmldoc.LoadXml(result);
// Recupera somente os nós de produtos
System.Xml.XmlNodeList products = xmldoc.GetElementsByTagName("product");
foreach (System.Xml.XmlNode item in products)
{
string productImage = string.Empty, productUrl = string.Empty;
// Dentro de cada nó de produto é necessário recuperar todos os nós filhos
System.Xml.XmlNodeList productElements = item.ChildNodes;
foreach (System.Xml.XmlNode element in productElements)
{
Carregando comentários...