<前言> 发现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处理文本节点时
DOM认为元素节点包含文本即XmlElement,而元素节点的文本是存储在文本节点中的
5.而使用Linq查询时我发现他是这样操作的
01
02
因为我用一下代码发现他是这样的,也就是他把自己的子元素的文本也当作是自己的文本
应用:
遍历元素的所有子元素,有属性则GetAtribute,有文本才有GetText
我觉得这个写的没错吧,元素有文本了才会输出他的Value
xml文件的树格式是这样的,可以看到test既有属性又有文本,而Track有属性ID,Yype,还有子元素
然鹅TreeView生成树结构成为这样,可以看到Track扩展出了很多子元素得文本内容。
可以得出Linq解析——根元素得子元素的文本也是其文本
改代码!如果他有子元素那么他应该是没有文本了因为格式要求是这样
没有子元素则它可以有也可以没有,反正没有null的时候返回的字符串也为null
这下就完美多了
因此贴出整张代码!!!
#region TreeView读Xml文件树状结构private void btn_ReadXml_Click(object sender, EventArgs e){OpenFileDialog o = new OpenFileDialog();o.InitialDirectory = Application.StartupPath;o.Title = "打开文件";o.Multiselect = false;o.RestoreDirectory = true;o.Filter = "Xml文件(*.xml)|*.xml";if (o.ShowDialog() == DialogResult.OK){treeView.Nodes.Clear();XDocument xmlFile = XDocument.Load(o.FileName.Trim());XElement rootElement = xmlFile.Root;AddChildNodesToTreeView(treeView.Nodes, rootElement);treeView.ExpandAll();}}private void AddChildNodesToTreeView(TreeNodeCollection nodes,XElement xElement){IEnumerable<XElement> elements = xElement.Elements();foreach(XElement element in elements){string s = element.NodeType.ToString();TreeNode node = nodes.Add(element.Name.ToString() + ":" + GetAttributes(element) + GetText(element));AddChildNodesToTreeView(node.Nodes, element);}}//得到element的属性值private static string GetAttributes(XElement element){string result = null;IEnumerable<XAttribute> attributes = element.Attributes();foreach(XAttribute attribute in attributes){result += attribute.Name + "=" + attribute.Value + " ";}return result;}//判断element是否有属性值,如果没有属性值,判断是否有文本值,没有文本值再返回无值。/*由于XElement是利用Linq解析,所以其将其子元素的文本节点也视作自己的文本节点,* 因此判断时应该借用是否有子元素来进行判断* 如<Test ID="01">000</Test>即可以正确解读属性和文本节点* 而<Test ID="01"><a>01</a><b>02</b></Test>中Test有子元素但格式上无法拥有自己的文本节点*所以判断方法正确*/private static string GetText(XElement element){////问题代码:Linq查询根元素的文本包含其子元素的文本//if(element.Value!=null)//{// return element.Value;//}//else//{ return null; }if (element.HasElements){ return null; }else{ return element.Value.ToString(); }}#endregion
<总结>
1.IEnumerable这个我还没搞懂是什么,别人的东西我会用了也是我的喜喜,不过他的有问题我改了改,一定要搞懂这个!!
2.之后会需要学习一下DOM方式将xml文件树格式录入至TreeView,所以应该还有一个知识库文档待填满。
3.待完成:节点的属性框设置,还有编辑树结构然后写文件!
4.DevExPress丰富一下我的CSTool,加油咯!!!



