Liaison Gridview à XML

J’essaie de créer une simple vue de grid liée à un simple document xml, mais il me manque quelque chose car le message d’erreur persiste:

La source de données pour GridView avec l’ID ‘GridView1’ n’avait aucune propriété ou atsortingbut à partir duquel générer des colonnes. Assurez-vous que votre source de données a du contenu.

Code

      

XML

    1096 About Us 21/12/2009 17:03:43 writer   1099 News 21/12/2009 17:03:47 writer   1098 Another page 21/12/2009 17:03:52 writer   

Est-ce peut-être mon xpath qui est faux ou est-ce que je fais quelque chose de fondamentalement faux ici?

Il y a plusieurs façons de faire fonctionner ceci:

  1. Utilisez la solution de Brian, qui consiste à réécrire le code XML pour utiliser des atsortingbuts au lieu de sous-nœuds.
  2. Utilisez une transformation XSLT pour convertir dynamicment les nœuds enfants en atsortingbuts. Voir cette question SO pour un XSLT pouvant effectuer cette opération.
  3. Chargez les données XML dans un DataSet, qui effectue cette conversion en interne.

Voici un exemple de la façon de faire # 3:

 DataSet ds = new DataSet(); ds.ReadXml(MapPath("~/App_Data/mydata.xml")); GridView1.DataSource = ds; GridView1.DataBind(); 

La limite de cette dernière approche est que vous n’obtenez pas de liaison de données automatique comme vous le feriez avec un contrôle de source de données. Cependant, étant donné que XmlDataSource est un contrôle en lecture seule, ce n’est pas nécessairement une limitation sérieuse.

XmlDataSource fonctionne avec des atsortingbuts, pas des entités enfants. Tu as besoin de faire:

  

Au lieu d’utiliser des éléments enfants. Malheureusement, c’est comme ça. Je souhaite vraiment que cela fonctionne avec l’alternative; J’aime beaucoup mieux cette approche.

essayez de changer le xpath pour

ressembler à XPath="data/node"

Document dynamic au document XML

Si votre fichier XML est structuré avec plus d’informations, vous pourrez itérer sur la structure plus facilement, car il est plus facile d’identifier le nœud exact que vous recherchez.

Nous avons un service Web qui renvoie XML dans une structure ligne / colonne (similaire à votre exemple de données ci-dessus)

Pour la rapidité, j’ai copié / collé notre solution, mais vous devriez comprendre l’essentiel et pouvoir le pirater pour faire votre travail.

   Query Successful          SomeData             SomeData       

Voici l’implémentation c #

  • nous obtenons les noms de colonnes à transmettre aux données du tableau de noms Gridviews.Datakey
  • nous parcourons les lignes en ajoutant chaque ligne à l’dataset au fur et à mesure
  • nous définissons les vues de grid datasounce à l’dataset
  • nous lions ()

Il y a un peu de css et l’instance de contrôle pour votre facilité de copier / coller dans l’exemple ci-dessous.

 //In Code In Front... Table.DataGridView{float:left; width:100%;} Table.DataGridView tr{} Table.DataGridView th{ background-color:Gray; font-weight:bold; color:White;} Table.DataGridView td{ background-color:White; color:Black; font-weight:normal;}  //In Code Behind... XmlNode myXmlNodeObject = myXmlDocService.GetData(_xmlDataSsortingng); //Bind To GridView //Create a DataSet To Bind To DataSet ds = new DataSet(); ds.Tables.Add("XmlDataSet"); //Get Column Names as Ssortingng Array XmlDocument XMLDoc = new XmlDocument(); XMLDoc.LoadXml("" +myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).ParentNode.InnerXml + ""); //Get Row/Columns int colCount = myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).SelectNodes("column").Count; ssortingng[] ColumnNameArray = new ssortingng[colCount]; int iterator = 0; foreach(XmlNode node in myXmlNodeObject.ChildNodes.Item(0).ChildNodes.Item(2).SelectNodes("column")) { ColumnNameArray.SetValue(node.Atsortingbutes["name"].Value ,iterator); ds.Tables["XmlDataSet"].Columns.Add(node.Atsortingbutes["name"].Value); //Create individual columns in the dataset iterator++; } //Get Data Row By Row to populate the DataSet.Rows foreach(XmlNode RowNode in XMLDoc.ChildNodes.Item(0).SelectNodes("row")) { ssortingng[] rowArray = new ssortingng[colCount]; int iterator2 = 0; foreach(XmlNode ColumnNode in RowNode.ChildNodes) { rowArray.SetValue(ColumnNode.InnerText, iterator2); iterator2++; } ds.Tables["XmlDataSet"].Rows.Add(rowArray); } DataGridView.DataSource = ds.Tables["XmlDataSet"]; DataGridView.DataKeyNames = ColumnNameArray; DataGridView.DataBind(); DataGridView.Visible = true;