<前言> 发现Xml文件可以用两种方法:一种是DOM(文档对象模型)好像主要用于xml文件的编辑与保存
    另一种是SAX—好像是读到一个标题就进行处理。

    <做的过程中发现的问题>

    1.经常有这样的代码
    XmlDocument doc = new XmlDocument();
    doc.Load(“aaa.xml”);
    load方式主要是将文件load至内存,所以文件大小较小时应用比较方便,如果内存过大如2G???
    2.存在多个同名元素的问题??
    3.XmlDocument主要是用于处理xml节点的。
    而XElement位于System.Xml.Linq是对xml进行Linq的查询操作 。
    4.DOM处理文本节点时
    01 01为文本节点
    DOM认为元素节点包含文本即XmlElement,而元素节点的文本是存储在文本节点中的
    image.png

    5.而使用Linq查询时我发现他是这样操作的

    01
    02

    因为我用一下代码发现他是这样的,也就是他把自己的子元素的文本也当作是自己的文本
    应用:
    遍历元素的所有子元素,有属性则GetAtribute,有文本才有GetText
    image.png
    我觉得这个写的没错吧,元素有文本了才会输出他的Value
    image.png
    xml文件的树格式是这样的,可以看到test既有属性又有文本,而Track有属性ID,Yype,还有子元素
    image.png
    然鹅TreeView生成树结构成为这样,可以看到Track扩展出了很多子元素得文本内容。
    image.png

    可以得出Linq解析——根元素得子元素的文本也是其文本

    改代码!如果他有子元素那么他应该是没有文本了因为格式要求是这样
    没有子元素则它可以有也可以没有,反正没有null的时候返回的字符串也为null
    image.png
    这下就完美多了
    image.png

    因此贴出整张代码!!!

    1. #region TreeView读Xml文件树状结构
    2. private void btn_ReadXml_Click(object sender, EventArgs e)
    3. {
    4. OpenFileDialog o = new OpenFileDialog();
    5. o.InitialDirectory = Application.StartupPath;
    6. o.Title = "打开文件";
    7. o.Multiselect = false;
    8. o.RestoreDirectory = true;
    9. o.Filter = "Xml文件(*.xml)|*.xml";
    10. if (o.ShowDialog() == DialogResult.OK)
    11. {
    12. treeView.Nodes.Clear();
    13. XDocument xmlFile = XDocument.Load(o.FileName.Trim());
    14. XElement rootElement = xmlFile.Root;
    15. AddChildNodesToTreeView(treeView.Nodes, rootElement);
    16. treeView.ExpandAll();
    17. }
    18. }
    19. private void AddChildNodesToTreeView(TreeNodeCollection nodes,XElement xElement)
    20. {
    21. IEnumerable<XElement> elements = xElement.Elements();
    22. foreach(XElement element in elements)
    23. {
    24. string s = element.NodeType.ToString();
    25. TreeNode node = nodes.Add(element.Name.ToString() + ":" + GetAttributes(element) + GetText(element));
    26. AddChildNodesToTreeView(node.Nodes, element);
    27. }
    28. }
    29. //得到element的属性值
    30. private static string GetAttributes(XElement element)
    31. {
    32. string result = null;
    33. IEnumerable<XAttribute> attributes = element.Attributes();
    34. foreach(XAttribute attribute in attributes)
    35. {
    36. result += attribute.Name + "=" + attribute.Value + " ";
    37. }
    38. return result;
    39. }
    40. //判断element是否有属性值,如果没有属性值,判断是否有文本值,没有文本值再返回无值。
    41. /*由于XElement是利用Linq解析,所以其将其子元素的文本节点也视作自己的文本节点,
    42. * 因此判断时应该借用是否有子元素来进行判断
    43. * 如<Test ID="01">000</Test>即可以正确解读属性和文本节点
    44. * 而<Test ID="01"><a>01</a><b>02</b></Test>中Test有子元素但格式上无法拥有自己的文本节点
    45. *所以判断方法正确*/
    46. private static string GetText(XElement element)
    47. {
    48. ////问题代码:Linq查询根元素的文本包含其子元素的文本
    49. //if(element.Value!=null)
    50. //{
    51. // return element.Value;
    52. //}
    53. //else
    54. //{ return null; }
    55. if (element.HasElements)
    56. { return null; }
    57. else
    58. { return element.Value.ToString(); }
    59. }
    60. #endregion

    <总结>
    1.IEnumerable这个我还没搞懂是什么,别人的东西我会用了也是我的喜喜,不过他的有问题我改了改,一定要搞懂这个!!
    2.之后会需要学习一下DOM方式将xml文件树格式录入至TreeView,所以应该还有一个知识库文档待填满。
    3.待完成:节点的属性框设置,还有编辑树结构然后写文件!
    4.DevExPress丰富一下我的CSTool,加油咯!!!
    image.png
    image.png
    image.png
    image.png