Vamos ver como fazer DataBinding em um GridView no ASP.NET com XmlDataSource
Para o exemplo iremos utilizar o XML abaixo como Fonte de Dados:
<?xml version="1.0" encoding="utf-8" ?>
<Dados>
<Usuarios>
<Usuario ID="1" Nome="Guilherme Bacellar Moralez" Idade="26">
<Familia>
<Pai>Pai de Guilherme Bacellar Moralez</Pai>
<Mae>Mãe de Guilherme Bacellar Moralez</Mae>
</Familia>
</Usuario>
<Usuario ID="2" Nome="Pablo Henrique Lima Roveroni" Idade="29">
<Familia>
<Pai>Pai de Pablo Henrique Lima Roveroni</Pai>
<Mae>Mãe de Pablo Henrique Lima Roveroni</Mae>
</Familia>
</Usuario>
</Usuarios>
</Dados>
Em Seguida, precisamos de um Objeto XmlDataSource para que possamos utilizar o XML como DataSource em nosso Grid.
C#
//
// Carrega um Arquivo XML Contendo o XML
// para a Fonte de Dados
System.Xml.XmlDocument xmlData = new System.Xml.XmlDocument();
xmlData.Load(@"c:\tmp\DataBindingGridXML\FonteDeDados.xml");
// Cria XMLDataSource
System.Web.UI.WebControls.XmlDataSource xmlDS = new System.Web.UI.WebControls.XmlDataSource();
// Desliga o Cache do XMLDataSource
xmlDS.EnableCaching = false;
// Configura os Dados em XML para o XMLDataSource utilizando o XML que Representa os Usuários (Nó Usuarios) do nosso XML de Dados
xmlDS.Data = xmlData.SelectSingleNode("Dados/Usuarios").OuterXml;
// Realiza o Bind no Grid
this.GridView1.DataSource = xmlDS;
this.GridView1.DataBind();
VB.NET
' Carrega um Arquivo XML Contendo o XML
' para a Fonte de Dados
Dim xmlData = New System.Xml.XmlDocument()
xmlData.Load("c:\tmp\DataBindingGridXML\FonteDeDados.xml")
' Cria XMLDataSource
Dim xmlDS = New XmlDataSource()
' Desliga o Cache do XMLDataSource
xmlDS.EnableCaching = False
' Configura os Dados em XML para o XMLDataSource utilizando o XML que Representa os Usuários (Nó Usuarios) do nosso XML de Dados
xmlDS.Data = xmlData.SelectSingleNode("Dados/Usuarios").OuterXml
' Realiza o Bind no Grid
Me.GridView1.DataSource = xmlDS
Me.GridView1.DataBind()
Neste exemplo em específico utilizamos um XMLDocument carregando um Arquivo (.xml) para carregar os dados no objeto XmlDataSource. Mas, você pode simplemente passar um XML (em formato de string) na propriedade (xmlDS.Data) do objeto.
Note que desligamos o Cache XmlDataSource (xmlDS.EnableCaching = False), isso porque o XmlDataSource possui um mecanismo de cache que pessoalmente não gosto muito de utilizar, mas, é bem útil sem situações que utilizamos arquivos (.xml) que normalmente não são atualizados.
Este procedimento em sí já resolve, mas, vamos ver como utilizar o evento (RowDataBound)
C#
protected void GridView1_RowDataBound (object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
if (e.Row.RowType == System.Web.UI.WebControls.DataControlRowType.DataRow)
{
// Cria Objetos
System.Xml.XPath.XPathNavigator navigator;
// Recupera o XPathNavigator com a Linha do XML que Representa a Linha Atual do Grid
navigator = ((System.Xml.XPath.IXPathNavigable)e.Row.DataItem). CreateNavigator();
// Recupera os Campos do XML
int id = navigator.SelectSingleNode("@ID").ValueAsInt;
int idade = navigator.SelectSingleNode("@Idade").ValueAsInt;
string nome = navigator.SelectSingleNode("@Nome").Value;
string nomeDoPai = navigator.SelectSingleNode("Familia/Pai").Value;
string nomeDaMae = navigator.SelectSingleNode("Familia/Mae").Value;
}
}
VB.NET
'
'
'
Protected Sub GridView1_RowDataBound (ByVal sender As System.Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound
If (e.Row.RowType = DataControlRowType.DataRow) Then
' Cria Objetos
Dim navigator As System.Xml.XPath.XPathNavigator
' Recupera o XPathNavigator com a Linha do XML que Representa a Linha Atual do Grid
navigator = CType(e.Row.DataItem, System.Xml.XPath.IXPathNavigable).CreateNavigator()
' Recupera os Campos do XML
Dim id As Integer = navigator.SelectSingleNode("@ID").ValueAsInt
Dim idade As Integer = navigator.SelectSingleNode("@Idade").ValueAsInt
Dim nome As String = navigator.SelectSingleNode("@Nome").Value
Dim nomeDoPai As String = navigator.SelectSingleNode("Familia/Pai").Value
Dim nomeDaMae As String = navigator.SelectSingleNode("Familia/Mae").Value
End If
End Sub
Neste ponto, observe que em cada linha do Grid (Row) uma linha de nosso XML que representa um Usuário é atribuia à DataSouce que convenientemente convertemos em um XPathNavigator para podermos navegar pelo XML.
Bom, espero que esse Post seja útil.
Até o Próximo
Posts Relacionados:



2 Respostas to “DataBind em GridView com XML e XMLDataSource no ASP.NET”
Bill
2 years ago
Muito bom o artigo!
DataBinding em Grid com XML é algo de extrema importância quando se quer baixo acoplamento e alta coesão.
Eduardo
1 year ago
Esse post foi muito produtivo. Entretanto, em nenhum lugar encontro algo relacionado a leitura de vários arquivos xml (identica estrutura) e databind em datagrid.
Se alguem conseguir me ajudar.
Bonelli