C#遍历XML文件节点内容

图片说明

如上图所示,我要依次遍历XML文件中,ELEMENTS下,所有子节点IMPLEMENTATION-DATA-TYPE下的内容,显示在dataggridview中,类似如下图。

图片说明

一行显示一个子节点IMPLEMENTATION-DATA-TYPE的内容,

但是因为部分子节点结构不一样,遇到CATEGORY的值是STRUCT的情况,会有SUB-ELEMENTS,如下图所示。

图片说明

当中的子节点可以在另外一个datagridview中单独显示,这个怎么判断?
具体不知道怎么写,

xml文件下载地址

图片说明

你把xml文件的内容转成什么了呢?实体类还是json呢?反正就是在读xml的时候加上判断,如果有下级,那么装入对应的属性或者json的子级,都是可以的。

请问下你想把xml文件里内容遍历后以什么形式存放?可以通过XML Helper 读取就可以遍历整个XML文件的内容。。

先确定一下需求。“另一个datagridview”是指什么?暂且设为B,之前那个主datagridview设为A,读取xml填充A后,每当在A中选中一条记录,B中会自动载入其SUB-ELEMENTS的内容,条件是CATEGORY的值是STRUCT,需求是不是这样?

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace Q694896
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public Form1(XmlNode pnode) : this()
        {
            parentNode = pnode;
            if (this.Height > 160)
            {
                this.Height -= 40;
                this.Width -= 60;
            }
        }

        string clickme = "click me";

        XmlNode parentNode;

        class DataItem
        {
            public string ShortName { get; set; }
            public string Category { get; set; }
            public string BaseTypeRef { get; set; }
            public object Node { get; set; }
            public DataItem(string a, string b, string c)
            {
                ShortName = a;
                Category = b;
                BaseTypeRef = c;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            List<DataItem> data = new List<DataItem>();
            IEnumerable<XmlNode> nodes;
            if (parentNode == null)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(@"TunerServiceInterface.arxml");
                nodes = doc.GetElementsByTagName("IMPLEMENTATION-DATA-TYPE").Cast<XmlNode>();
            }
            else
            {
                nodes = parentNode.ChildNodes.Cast<XmlNode>().Where(x => x.Name == "IMPLEMENTATION-DATA-TYPE-ELEMENT");
            }
            foreach (XmlNode node in nodes)
            {
                string sn = "";
                try
                {
                    sn = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "SHORT-NAME").InnerText;
                    var c = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "CATEGORY").InnerText;
                    var btf = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "SW-DATA-DEF-PROPS").InnerText;
                    data.Add(new DataItem(sn, c, btf) { Node = node });
                }
                catch
                {
                    if (node.ChildNodes.Cast<XmlNode>().Any(x => x.Name == "SUB-ELEMENTS"))
                    {
                        data.Add(new DataItem(sn, clickme, "") { Node = node.ChildNodes.Cast<XmlNode>().FirstOrDefault(x => x.Name == "SUB-ELEMENTS") });
                    }
                }
            }
            dataGridView1.DataSource = data;
        }

        private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            string s = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
            if (s == clickme)
            {
                var f = new Form1((XmlNode)dataGridView1.Rows[e.RowIndex].Cells[dataGridView1.Rows[e.RowIndex].Cells.Count - 1].Value);
                f.StartPosition = FormStartPosition.CenterParent;
                f.ShowDialog();
            }
        }
    }
}

完整的代码下载:https://download.csdn.net/download/caozhy/10547003