未知昵称
2018-07-17 03:17
采纳率: 89.7%
浏览 1.2k

C#遍历XML文件节点内容

图片说明

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

图片说明

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

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

图片说明

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

xml文件下载地址

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

6条回答 默认 最新

  • threenewbee 2018-07-17 09:01
    已采纳

    图片说明

    已采纳该答案
    打赏 评论
  • 逍遥岚轩 2018-07-17 03:49

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

    打赏 评论
  • 苇蔚 2018-07-17 04:09

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

    打赏 评论
  • mylogic 2018-07-17 08:36

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

    打赏 评论
  • threenewbee 2018-07-17 09:03
     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();
                }
            }
        }
    }
    
    
    打赏 评论
  • threenewbee 2018-07-17 09:10
    打赏 评论

相关推荐 更多相似问题