如上图所示,我要依次遍历XML文件中,ELEMENTS下,所有子节点IMPLEMENTATION-DATA-TYPE下的内容,显示在dataggridview中,类似如下图。
一行显示一个子节点IMPLEMENTATION-DATA-TYPE的内容,
但是因为部分子节点结构不一样,遇到CATEGORY的值是STRUCT的情况,会有SUB-ELEMENTS,如下图所示。
当中的子节点可以在另外一个datagridview中单独显示,这个怎么判断?
具体不知道怎么写,
你把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();
}
}
}
}