基于自定义XML节点填充数据表

时间:2017-08-29 08:20:13

标签: c# asp.net xml gridview datatable

我需要使用datatable在gridview中显示我的xml。 我的XML以这种方式组成:

Click here to see the XML

现在我以这种方式获取数据:

                XmlDocument doc = new XmlDocument();
            doc.Load(@"path\MyXml.xml"); //Percorso file xml

            DataTable dt = new DataTable();
            foreach (XmlNode xns in doc.SelectSingleNode("Settembre"))
            { 
                    string tagName = xns.Name; 
                    if (!dt.Columns.Contains(tagName))
                    {
                        dt.Columns.Add(tagName); 
                    }

            }

使用这部分代码,我根据" Settembre"的子标签添加我的列。 (例如" ven_01")并且这有效。

然后我正在写东西(" Settembre"的儿童标签的子标签的内部文本,例如" Mattina_Turno_1"" ven_01")进入以这种方式的细胞

     DataRow dr = dt.NewRow();
            foreach (XmlNode xns in doc.SelectSingleNode("Settembre"))
            {
                    dr[xns.Name] = xns.InnerText; 
            }
            dt.Rows.Add(dr); 

            GridView1.DataSource = dt;
            GridView1.DataBind();

这也有效,但我想要做的是显示由innerText的父节点组成的第一列作为每行第一列第一个单元格中的行名称(最大值为3,更好地解释是标签" Mattina_Turno1"," Mattina_Turno_2"和#34; Pomeriggio",里面可以是一些内部文字)

这是我试图做了一段时间。 此外,因为行名称只有3而列名称可以超过3我想要还原它们,所以,如果可能的话,在列标题中显示行名称(所以" Mattina_Turno1& #34;," Mattina_Turno_2"和#34; Pomeriggio"代替)和行命名" Settembre"子标签(例如" ven_01")。

我希望我让我理解

请不要标记为重复,因为我在网上搜索了很多并且没有找到解决方案,所以请不要进行downvote并将其标记为重复,否则不是。

1 个答案:

答案 0 :(得分:0)

我通过这样做找到了解决方案:

                DataTable dt = new DataTable();
            dt.Columns.Add("Data");
            foreach (XmlNode xns in doc.DocumentElement)
            {
                if (xns.Name == "Settembre") ///IMPLEMENTARE SELEZIONE AUTOMATICA DEL MESE IMPORTANTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

                    foreach (XmlNode xn in xns)
                    {
                        string tagName = xn.Name;
                        var a = dt.Rows.Add(tagName);
                     //   int index_of_a = dt.Rows.IndexOf(a);

                    }
            }
            dt.Columns.Add("Mattina Turno 1");
            dt.Columns.Add("Mattina Turno 2");
            dt.Columns.Add("Pomeriggio");


            expo_days.DataSource = dt;
            expo_days.DataBind();

            foreach (XmlNode xns in doc.DocumentElement)
            {
                if (xns.Name == "Settembre") ///IMPLEMENTARE SELEZIONE AUTOMATICA DEL MESE IMPORTANTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 

                    foreach (XmlNode xn in xns)
                    {
                        string tagName = xn.Name;
                        var a = dt.Rows.Add(tagName);
                        //   int index_of_a = dt.Rows.IndexOf(a);
                        DataRow[] rows = dt.Select("Data = '"+tagName+"'");

                        foreach (XmlNode xna in xn)
                        { //sistemare le celle in base alla colonna della gridview
                            if(xna.Name == "Mattina_Turno_1") //here i specify in wich column is the "Mattina_Turno_1" and fill in that cell, and so on
                            expo_days.Rows[dt.Rows.IndexOf(rows[0])].Cells[3].Text = xna.InnerText;
                            if (xna.Name == "Mattina_Turno_2")
                                expo_days.Rows[dt.Rows.IndexOf(rows[0])].Cells[4].Text = xna.InnerText;
                            if (xna.Name == "Pomeriggio")
                                expo_days.Rows[dt.Rows.IndexOf(rows[0])].Cells[5].Text = xna.InnerText;

                        }


                    }
            }