如何获取xml节点名称和内部文本以及填充网格视图

时间:2014-02-11 09:09:11

标签: c# xml linq-to-xml

我有一个XML文件,显示如下,

现在我不知道“appsetting”元素下的节点数量。 我试图用这个XML文件填充网格视图,不知何故 Gridview具有节点名称列,如标签1,标签2,标签3 ......等 并且有一行具有相应的标签值,如val 1,val 2,val 3 ..

我尝试了一些自我,但我没有得到如何在不给出节点名称的情况下获取内部值。 我试试这个,

       XmlDocument doc = new XmlDocument();
        doc.Load(XmlPath);
        XmlNodeList xnList = doc.SelectNodes("appSettings");
        foreach (XmlNode xn in xnList)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Tag1");
            dt.Columns.Add("Tag2");
            dt.Columns.Add("Tag3");
            DataRow dr;
            dr = dt.NewRow();
            dr["Tag1"] = xn["Tag1"].InnerText;
            dr["Tag2"] = xn["Tag2"].InnerText;
            dr["Tag3"] = xn["Tag3"].InnerText;
            dt.Rows.Add(dr);

            dgv.DataSource = dt;
        }

        dgv.AllowUserToAddRows = false;
        dgv.ReadOnly = true;   

enter image description here

2 个答案:

答案 0 :(得分:1)

我在@ Arin Ghazarian的帮助下得到了这个答案, 我只是修改了他的代码,

        XmlDocument doc = new XmlDocument();
        doc.Load(XmlPath);


        DataTable dt = new DataTable();
        foreach (XmlNode xn in doc.ChildNodes[0])
        {
            string tagName = xn.Name;
            if (!dt.Columns.Contains(tagName))
            {
                dt.Columns.Add(tagName);
            }

        }
        DataRow dr = dt.NewRow();
        foreach (XmlNode xn in doc.ChildNodes[0])
        {

            dr[xn.Name] = xn.InnerText;


        }
        dt.Rows.Add(dr);

答案 1 :(得分:0)

使用此:

doc.Root.Elements().Where(xe => xe.Name.LocalName.StartsWith("tag", StringComparison.InvariantCultureIgnoreCase));

修改

如果您有不同的标记名称,但格式类似于<Tag>Value</Tag>,则可以遍历Elements并获取每个节点的值,如下所示:

        List<List<Tuple<string, string>>> tuples = new List<List<Tuple<string, string>>>();

        //if you have more than one row, some how you xml should be formatted hierarchically,
        //so you need to create an outer loop here and iterate through parent nodes (rows):
        List<Tuple<string, string>> tuple = new List<Tuple<string,string>>();
        foreach(var node in xdoc.Root.Elements())
        {
            string nodeName = node.Name.LocalName;
            if (!dt.Columns.Contains(nodeName))
            {
                dt.Columns.Add(nodeName);
            }
            tuple.Add(Tuple.Create(nodeName, node.Value));
        }
        tuples.Add(tuple);

        foreach (var row in tuples)
        {
            DataRow dr = dt.NewRow();
            foreach (var r in row)
            {
                dr[r.Item1] = r.Item2;
            }
            dt.Rows.Add(dr);
        }