O que é XML?
Carregando um documento XML com XmlDocument
<%@ Page Language="C#" %>
<%@ Import namespace="System.Xml"%>
<html>
<script runat="server">
void Page_Load(Object Sender, EventArgs e)
{
//Cria a variável Doc para receber o arquivo XML
XmlDocument doc = new XmlDocument();
//Carrega em DOC o arquivo XML, o caminho pode ser uma url que poderia estar em qualquer site
//ou pode ser o caminho físico da sua área, por exemplo E:\home\seulginftp\web\forum.xml
doc.Load("http://www.xyz.com.br/forum.xml");
//Cria uma instância XmlElement na qual atribuímos a raiz do documento
XmlElement Elem = doc.DocumentElement;
//Percorre todos os elementos filhos que existem no elemento raiz
for(int i=0;i<Elem.ChildNodes.Count;i++)
{
//Percorre todos os elementos que estiverem dentro do elemento filho atual
for(int a=0;a<Elem.ChildNodes.Item(i).ChildNodes.Count;a++)
{
//Imprime o valor do elemento encontrado dentro do elemento Filho atual
Response.Write(Elem.ChildNodes.Item(i).ChildNodes.Item(a).InnerText + "<br>");
}
}
}
</script>
</html>
forum.xml
<?xml version="1.0" encoding="windows-1258" ?>
<XMLSchemaNotaFiscal >
<NotasFiscais xmlns="http://tempuri.org/XMLSchemaNotaFiscal.xsd">
<Numero>1</Numero>
<Data>2003-03-15T00:00:00.0000000-03:00</Data>
<Cliente>Jose</Cliente>
<Items>
<Produtos>1</Produtos>
<Quantidade>2</Quantidade>
<PrecoUnit>10</PrecoUnit>
<Total>20</Total>
</Items>
<Items>
<Produtos>2</Produtos>
<Quantidade>3</Quantidade>
<PrecoUnit>10</PrecoUnit>
<Total>30</Total>
</Items>
<Items>
<Produtos>3</Produtos>
<Quantidade>40</Quantidade>
<PrecoUnit>1</PrecoUnit>
<Total>40</Total>
</Items>
<Items>
<Produtos>4</Produtos>
<Quantidade>50</Quantidade>
<PrecoUnit>2</PrecoUnit>
<Total>100</Total>
</Items>
</NotasFiscais>
</XMLSchemaNotaFiscal>
Usando os Métodos FirstChild e LastChild
Acessando o primeiro e último elemento filho de um arquivo XML usando as propriedade FirstChild e LastChild.
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Xml"%>
<html>
<script runat="server">
void Page_Load(Object Sender, EventArgs e)
{
// Criamos a estância doc através do XmlDocumento
XmlDocument doc=new XmlDocument();
//Carrega em Doc o arquivo XML
doc.Load("http://www.xyz.com.br/alfabeto.xml");
//Carrega-se em Elem o elemento raiz do arquivo
XmlElement Elem=doc.DocumentElement;
//Acessamos o primeiro elemento usando as propriedades FirstChild e InnerText
Response.Write("Primeiro item= " + Elem.FirstChild.InnerText + "<br>");
//Acessamos o último elemento usando as propriedades LastChild e InnerText
Response.Write("Ultimo item= " + Elem.LastChild.InnerText);
}
</script>
</html>
alfabeto.xml
<?xml version="1.0" encoding="utf-8" ?>
<alfabeto>
<letra>A</letra>
<letra>B</letra>
<letra>C</letra>
<letra>D</letra>
........
........
<letra>Z</letra>
</alfabeto>
Usando SelectSingleNode
Usando o método SelectSingleNode podemos acessar um elemento específico, dentro do arquivo, informando o Xpath. Assim, podemos acessar apenas os elementos-filhos desejados.
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Xml"%>
<html>
<script runat="server">
void Page_Load(Object Sender, EventArgs e)
{
XmlDocument doc=new XmlDocument();
doc.Load("http://www.xyz.com.br/cadastro.xml");
//Definimos a propriedade No como XmlNode a informarmos o XPath para ela que será cadastro/funcionário
XmlNode No=doc.SelectSingleNode("cadastro/funcionario");
// Mostramos no navegador o resultado da busca deste path informando o índice deles diretamente.
Response.Write(No.ChildNodes.Item(0).InnerText + "<br>");
Response.Write(No.ChildNodes.Item(1).InnerText + "<br>");
}
</script>
</html>
cadastro.xml
<?xml version="1.0" encoding="utf-8" ?>
<cadastro>
<funcionario>
<nome>Joao da Silva</nome>
<cargo>Vendedor</cargo>
</funcionario>
<funcionario>
<nome>Getulio Vagas</nome>
<cargo>Gerente</cargo>
</funcionario>
</cadastro>
Usando o Método SelectNodes
Usando o método SelecNodes em vez de retorna um único elemento como no caso do SelectSingleNode, ele retorna um conjunto de elementos de acordo com o que for informado no Xpath.
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Xml"%>
<html>
<script runat="server">
void Page_Load(Object Sender, EventArgs e)
{
//Carregamos o documento normalmente
XmlDocument doc=new XmlDocument();
doc.Load("http://www.xyz.com.br/cadastro.xml");
//Criamos um objeto da classe XmlNodeList que contém o XPath informando ("cadastro/funcionario")
XmlNodeList No= doc.SelectNodes("cadastro/funcionario");
//Percorre todos os elementos contidos no objeto No e exibe o valor dos elementos-filhos do elemento funcionario
for(int i=0;i<No.Count;i++)
{
Response.Write(No.Item(i).InnerText + "<br>");
}
}
</script>
</html>
Usando o Método GetElementByTagName
Usando o método GetElementByTagName é possível acessar o conteúdo de um elemento específico. Como no exemplo abaixo:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Xml"%>
<html>
<script runat="server">
void Page_Load(Object Sender, EventArgs e)
{
//Carregamos o documento normalmente
XmlDocument doc=new XmlDocument();
doc.Load("http://www.xyz.com.br/regioes.xml");
//Diferente do métodos SelecNodes, aqui especificamos no XPath apenas o elemento que deverá ser consultado
XmlNodeList No= doc.GetElementsByTagName("capitais");
//Percorremos o objeto, mostrando no navegador os dados encontrados para aquele elemento especificado no XPath
for(int i=0;i<No.Count;i++)
{
Response.Write(No.Item(i).InnerText + "<br>");
}
}
</script>
</html>
regioes.xml
<?xml version="1.0" encoding="utf-8" ?>
<regioes>
<Sul>
<capitais>
<cidades>Curitiba</cidades>
<cidades>Florianópolis</cidades>
<cidades>Porto Alegre</cidades>
</capitais>
</Sul>
<Sudeste>
<capitais>
<cidades>Belo horizonte</cidades>
<cidades>São Paulo</cidades>
<cidades>Rio de Janeiro</cidades>
</capitais>
</Sudeste>
</regioes>
Usando o Método GetAttribute
Através do método GetAttribute, pode-se verificar qual foi o atributo definido para um elemento. Segue abaixo dois exemplos de como pode-se fazer isso:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Xml"%>
<html>
<script runat="server">
void Page_Load(Object Sender, EventArgs e)
{
//Carregamos o documento normalmente
XmlDocument doc=new XmlDocument();
doc.Load("http://www.xyz.com.br/estoque.xml");
//Definimos no XPath qual o nome do atributo que queremos buscar.
XmlNodeList No= doc.GetElementsByTagName("valor");
//Percorremos todos os elementos do objeto que contenham este valor definido.
for(int i=0;i<No.Count;i++)
{
Response.Write(No.Item(i).Attributes.GetNamedItem("moeda").Name + "=");
Response.Write(No.Item(i).Attributes.GetNamedItem("moeda").InnerText + "<br>");
}
}
</script>
</html>
O mesmo pode-se ser escrito usando a classe XmlTextReader que procura todos os atributos criados para um documento XML diretamente.
<%@ Page Language="C#" %>
<%@ Import Namespace="System.IO"%>
<%@ Import Namespace="System.Xml"%>
<html>
<script runat="server">
void Page_Load(Object Sender, EventArgs e)
{
//Carregamos o documento normalmente
XmlDocument doc=new XmlDocument();
doc.Load("http://www.xyz.com.br/estoque.xml");
//Definimos no XPath qual o nome do atributo que queremos buscar.
XmlNodeList No= doc.GetElementsByTagName("valor");
//Percorremos todos os elementos do objeto que contenham este valor definido.
for(int i=0;i<No.Count;i++)
{
Response.Write(No.Item(i).Attributes.GetNamedItem("moeda").Name + "=");
Response.Write(No.Item(i).Attributes.GetNamedItem("moeda").InnerText + "<br>");
}
}
</script>
</html>
estoque.xml
<?xml version="1.0" encoding="utf-8" ?>
<estoque>
<produto>
<descricao>Parafuso Rosca Soberba 20x50mm</descricao>
<valor moeda="R{{home}}quot;>2,00</valor>
</produto>
<produto>
<descricao>Prego 12x 27 1 Kg</descricao>
<valor moeda="R{{home}}quot;>1,50</valor>
</produto>
<produto>
<descricao>Chave de Fenda</descricao>
<valor moeda="R{{home}}quot;>2,80</valor>
</produto>
</estoque>
Usando a Classe XmlReader
É possível usar a Classe XmlReader para ler um documento inteiro em XML, ele cria um cursor forward-only e acesso somente leitura. Este é uma classe que é mais utilizada quando se trabalha com uma quantidade maior de dados. No exemplo abaixo, usamos esta classe para se movimentar dentro do arquivo apenas nos elementos desejados, ignorando o restante.
<%@ Page Language="C#" %>
<%@ import Namespace="System.Xml" %>
<html>
<script runat="server">
void Page_Load(Object Sender, EventArgs e)
{
// Cria-se uma instância da classe XmlTexReader informando o caminho do documento.
XmlTextReader r = new XmlTextReader("http://www.xyz.com.br/estoque.xml");
//No Loop while usando o método Read percorre todo o documento XML
while(r.Read())
{
//É feita uma verificação se o que está dento do nó é um elemento chamado descricao e usa-se o método
//MoveToContent para se mover para dentro do conteúdo do elemento
if(r.MoveToContent()==XmlNodeType.Element && r.Name=="descricao")
{
//Mostra no browser o valor do elemento usando o método ReadString
Response.Write(r.ReadString() + "<br>");
}
}
}
</script>
</html>
Usando DataSet
É possível ler um arquivo XML através de um DataSet, carregando no DataSet o conteúdo do documento e exibi-lo no browser como no exemplo abaixo:
<%@ Page Language="C#" %>
<%@ import Namespace="System" %>
<%@ import Namespace="System.Data" %>
<html>
<script runat="server">
// usando o ReadXml com DataSet
public void Page_Load(Object Sender, EventArgs e)
{
//Cria-se uma instância DataSet
DataSet ds = new DataSet();
//Com o método ReadXml carrega-se o documento XML no DataSet
//Poderia ser o caminho físico ou uma url
ds.ReadXml("e:\\home\\seulogiftp\\web\\XML\\estoque.xml");
//Percorre todas as linhas do DataSet(Rows)
foreach(DataRow a in ds.Tables["produto"].Rows)
{
//Exibe no Browser o conteúdo do elemento descrição
Response.Write(a["descricao"] + "<br>");
}
}
</script>
</html>