<前言> 发现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,加油咯!!!