【发布时间】:2014-01-20 10:36:29
【问题描述】:
将以下 xml 文件的元素和属性加载到树视图后,编辑节点并将树视图保存回同一 xml 文件。所有元素和属性都需要保存。但是,只有嵌套元素的属性会在保存过程中消失。保存后,元素d&e的所有属性都丢失了!这是因为我无法在 addTreeNode 函数中检索存储在 tag 属性中的属性值。(请参阅内联 cmets)有谁知道实现此目的的更简单或更简洁的方法?提供代码 sn-ps 会很有帮助。
XML 结构:
<?xml version="1.0" encoding="utf-8"?>
<root>
<a axa="1" axb="2" axc="3">content_of_tag _a</a>
<b bxa="10" bxb="20" bxc="30">content_of_tag_b</b>
<c cxa="11" cxb="21" cxc="31">
content_of_tag_c
<d dxa="101" dxb="201" dxc="301">
content_of_tag_d
<e exa="110" exb="210" exc="310">
content_of_tag_e
</e>
</d>
</c>
</root>
C#代码:
private void Xml2TreeNode(XElement xNode, TreeNode treeNode)
{
if (xNode.HasElements) //if node has children
{
TreeNode tNode = null;
int i = 0;
foreach (XElement subNode in xNode.Elements())
{
if (subNode.Descendants().Count() > 0)
{
TreeNode tn = treeNode.Nodes.Add(subNode.Name.ToString().Trim());
tn.Nodes.Add(new TreeNode(subNode.FirstNode.ToString().Trim()));
treeNode.Nodes[i].Tag = subNode.Attributes().ToList(); //-------->this attribure values are NOT retrievable in saveNodes function!
tNode = tn; //add child nodes
}
else
{
TreeNode tn = treeNode.Nodes.Add(subNode.Name.ToString().Trim()); //show name of a leaf node element
tn.Nodes.Add(new TreeNode(subNode.Value.ToString().Trim())); //show value of above element as a child of its name
treeNode.Nodes[i].Tag = subNode.Attributes().ToList(); //---->these values are retrivable in saveNodes function
tNode = treeNode.Nodes[i++]; //add sibling node
}
addTreeNode(subNode, tNode); //recursively add child nodes
}
}
}
private void TreeNode2Xml(TreeNodeCollection tnc)
{
foreach (TreeNode node in tnc)
{
if (node.Nodes.Count > 0)
{
xr.WriteStartElement(node.Text);
if (node.Tag != null) //attribures retrieved here
{
List<XAttribute> attributeList = node.Tag as List<XAttribute>;
foreach (XAttribute attribute in attributeList)
{
xr.WriteAttributeString(attribute.Name.ToString(), attribute.Value.ToString());
}
}
saveNodes(node.Nodes);
xr.WriteEndElement();
}
else //No child nodes, so we just write the text
{
xr.WriteString(node.Text);
}
}
}
xr = new XmlTextWriter(filename, System.Text.Encoding.UTF8); //System.Text.Encoding.UTF8
xr.Formatting = Formatting.Indented;
xr.WriteStartDocument();
//Write our root node
xr.WriteStartElement(treeView1.Nodes[0].Text);
foreach (TreeNode node in tv.Nodes)
{
**TreeNode2Xml(node.Nodes);**
}
//Close the root node
xr.WriteEndElement();
xr.Close();
xDoc = XDocument.Load(dlg.FileName);
treeView1.Nodes.Clear();
treeView1.Nodes.Add(new TreeNode(xDoc.Document.Root.Name.ToString().Trim()));
TreeNode tNode = new TreeNode();
tNode = (TreeNode)treeView1.Nodes[0];
**Xml2TreeNode(xDoc.Root, tNode);**
treeView1.ExpandAll();
【问题讨论】:
标签: c# xml treeview xml-serialization linq-to-xml