This article has been localized into Portuguese by the community.
Usando XPath com a classe XmlDocument
Em um capítulo anterior, usamos a classe XmlDocument para obter informações de um arquivo XML. Fizemos isso usando um intervalo de chamadas para a propriedade ChildNodes, o que foi um pouco simples porque o exemplo era muito simples. Não adiantou muito a legibilidade do nosso código, portanto, neste capítulo, vamos ver outra abordagem, que é definitivamente mais poderosa e mais fácil de ler e manter. A tecnologia que usaremos para isso é chamada XPath e é mantida pela mesma organização que criou o padrão XML. O XPath é, na verdade, uma linguagem de consulta inteira, com muitas possibilidades, mas, como esse não é um tutorial do XPath, analisaremos apenas algumas consultas básicas. No entanto, mesmo em suas formas mais simples, o XPath ainda é poderoso, como você verá nos exemplos a seguir.
A classe XmlDocument tem vários métodos que leva uma consulta XPath como um parâmetro e, em seguida, retorna o XmlNode (s) resultante. Neste capítulo, examinaremos dois métodos: O método SelectSingleNode(), que retorna um único XmlNode com base na consulta XPath fornecida, e o método SelectNodes(), que retorna uma coleção XmlNodeList de objetos XmlNode com base na consulta XPath fornecida.
Vamos tentar ambos os métodos acima mencionados, mas em vez de usar o XML de informações sobre a moeda que testamos nos capítulos anteriores, tentaremos agora uma nova fonte XML. Os feeds RSS são essencialmente documentos XML construídos de uma maneira específica, para permitir que uma carga de diferentes leitores de notícias analise e mostre as mesmas informações à sua maneira.
Usaremos um feed RSS da CNN, localizado em http://rss.cnn.com/rss/edition_world.rss, com notícias de todo o mundo. Se você abri-lo em seu navegador, seu navegador pode renderizá-lo de uma maneira agradável, permitindo que você obtenha uma visão geral do feed e assine-o, mas não se deixe enganar por isso: Sob o capô, é apenas XML, que você verá se você fizer uma "Ver fonte" no seu navegador. Você verá que o elemento raiz é chamado "rss". O elemento rss geralmente tem um ou vários elementos de "canal" e, dentro desse elemento, podemos encontrar informações sobre o feed, bem como os nós de "item", que são os itens de notícias que normalmente queremos.
No exemplo a seguir, usaremos o método SelectSingleNode() para obter o título do feed. Se você olhar para o XML, verá que há um <title> elemento como um elemento filho do canal <channel> elemento, que é então um elemento filho do <rss> elemento, a raiz. Essa consulta pode ser descrita assim no XPath:
//rss/channel/title (// rss/channel/title)
Nós simplesmente escrevemos os nomes do elemento que estamos procurando, separados por uma barra (/), que indica que o elemento deve ser um filho para o elemento antes da barra anterior. Usando este XPath é tão simples como isto:
using System;
using System.Text;
using System.Xml;
namespace ParsingXml
{
class Program
{
static void Main(string[] args)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("http://rss.cnn.com/rss/edition_world.rss");
XmlNode titleNode = xmlDoc.SelectSingleNode("//rss/channel/title");
if(titleNode != null)
Console.WriteLine(titleNode.InnerText);
Console.ReadKey();
}
}
}
Usamos o método SelectSingleNode() para localizar o < title > elemento, que simplesmente leva o nosso XPath como um parâmetro de string. Em seguida, verificamos se ele retornou um resultado e, se ocorreu, imprimimos o InnerText do nó localizado, que deve ser o título do feed RSS.
No próximo exemplo, usaremos o método SelectNodes() para encontrar todos os nós de itens no feed RSS e, em seguida, imprimir informações sobre eles:
using System;
using System.Text;
using System.Xml;
namespace ParsingXml
{
class Program
{
static void Main(string[] args)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("http://rss.cnn.com/rss/edition_world.rss");
XmlNodeList itemNodes = xmlDoc.SelectNodes("//rss/channel/item");
foreach(XmlNode itemNode in itemNodes)
{
XmlNode titleNode = itemNode.SelectSingleNode("title");
XmlNode dateNode = itemNode.SelectSingleNode("pubDate");
if((titleNode != null) && (dateNode != null))
Console.WriteLine(dateNode.InnerText + ": " + titleNode.InnerText);
}
Console.ReadKey();
}
}
}
O método SelectNodes() usa uma consulta XPath como uma string, como vimos no exemplo anterior, e retorna uma lista de objetos XmlNode em uma coleção XmlNodeList. Nós iteramos através dele com um loop foreach, e de cada um dos nós do item, pedimos um nó filho chamado title e pubDate (data publicada) usando o SelectSingleNode() diretamente no nó do item. Se pegarmos os dois, imprimimos a data e o título na mesma linha e depois seguimos em frente.
Em nosso exemplo, desejamos dois valores diferentes de cada nó do item, e é por isso que solicitamos os nós de itens e processamos cada um deles. No entanto, se apenas precisássemos do por exemplo os títulos de cada item, poderíamos alterar a consulta XPath para algo como isto:
//rss/channel/item/title (// rss/channel/item/title)
Ele corresponderá a cada nó de título em cada um dos nós do item. Aqui está a consulta com algum código C # para fazer tudo acontecer:
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("http://rss.cnn.com/rss/edition_world.rss");
XmlNodeList titleNodes = xmlDoc.SelectNodes("//rss/channel/item/title");
foreach(XmlNode titleNode in titleNodes)
Console.WriteLine(titleNode.InnerText);
Console.ReadKey();