代码段
using System.Xml.Linq;
//写xml 这样循环写入xml 都写到根节点上去了,没有找到哪里的问题
private void WriteXML(TreeView t, string path)
{
XDocument xdoc = new XDocument();
TreeNode tn = t.Nodes[0];
XElement xe = new XElement(GetStr(tn.Text));
xe.Value = tn.Tag.ToString();
xdoc.Add(xe);
WriteXMLC(tn, xe);
xdoc.Save(path);
}
private void WriteXMLC(TreeNode tn, XElement xe)
{
foreach (TreeNode node in tn.Nodes)
{
XElement xec = new XElement(GetStr(node.Text));
xec.Value = node.Tag.ToString();
xe.Add(xec);
if (node.Nodes.Count > 0)
{
WriteXMLC(node, xec);
}
Console.WriteLine(node.Text );
}
}
//读xml
private void LoadXml(string path, TreeView t)
{
//根节点
XDocument xdoc = XDocument.Load(path);
XElement xe = xdoc.Root;
TreeNode tn = new TreeNode();
tn.Text = GetXMLValueName(xe.Value);
Console.WriteLine(xe.Value );
tn.Tag = xe.Value;
t.Nodes.Add(tn);
//加载子节点
LoadXmlC(xe, tn);
}
private void LoadXmlC(XElement xe, TreeNode tn)
{
foreach (XElement item in xe.Elements())
{
TreeNode tnc = new TreeNode();
tnc.Text = GetXMLValueName(item.Value);
tnc.Tag = item.Value;
tn.Nodes.Add(tnc);
if (item.Elements().Count() > 0)
{
LoadXmlC(item, tnc);
}
}
}
问题是 xdoc.nodes.add(xe);添加的根节点,但是调用 LoadXmlC(XElement xe, TreeNode tn)是把新创建的xelement对象添加到xe根节点下,是xe根节点的子节点。但是实际是 这样写入后,在读文件的时候 XElement xe = xdoc.Root;xe.Value获取的是整xe及子节点的字符串。
直接用XDocument.Add添加的肯定是根节点,要先确定你要添加到哪个节点下如 xdoc.Element("Child").Add(xe)
我的xml布局是这样的:
<root>
<item>
<X>x<X>
</item>
<item>
.......
</root>
str=节点值;
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load("MyInfo.xml");
XmlNode root = xmlDoc.SelectSingleNode("Root");
XmlElement xe1 = xmlDoc.CreateElement("Item");
XmlElement xesub1 = xmlDoc.CreateElement("X");
xesub1.InnerText = str;
xe1.AppendChild(xesub1);
root.AppendChild(xe1);
xmlDoc.Save("MyInfo.xml");
找到问题答案了。在写XML添加根元素的时候,不能添加根元素的Value值,应该添加属性保存它的数据,否则读XML文件用xe.Value想取根元素的值,就把根元素的value和它所有的子元素作为字符串全部取出。