1

如何使用 Linq To XML 在 TreeView 控件中显示 XML 数据,以及使用 Linq 在 XML 中保存 TreeView 数据

示例 xml 文件

<?xml version="1.0" encoding="utf-8"?>
<factors>
  <factor number="1" price="1000">
    <code>12</code>
    <group>A</group>
  </factor>
</factors>

我正在使用 Windows 窗体和 C#

4

1 回答 1

2

解析您的 XML,并根据您想要作为节点的 XML 元素添加它们:

var xmlSource = @"<?xml version=""1.0"" encoding=""utf-8""?>
                    <factors>
                        <factor number=""1"" price=""1000"">
                            <code>12</code>
                            <group>A</group>
                        </factor>
                        <factor number=""2"" price=""10"">
                            <code>1</code>
                            <group>B</group>
                        </factor>
                    </factors>";

var xml = XDocument.Parse(xmlSource);
var factors = xml.Root.Descendants("factor").ToList();
// create tree and add root node
// TreeView tr = new TreeView();
// var root = tr.Nodes.Add("Factors");
foreach (var factor in factors)
{
    var nodeNumber = factor.Attribute("number").Value;
    var subNodeCode = factor.Element("code").Value;
    // add attribute as node name
    // var node = root.Nodes.Add(nodeNumber);
    // add elements as sub nodes
    // node.Nodes.Add(subNodeCode)
}

从树保存到 XML 的代码完全相同,只是在相反的方向 - 遍历所有节点并提取和构建 xml 元素和/或属性。您应该最清楚要将哪个元素或属性显示为树节点,反之亦然。

阅读TreeView 类和 LINQ2XML 的文档,例如从XDocument 帮助器类开始


假设您的 TreeView 被命名为树,那么您可以使用以下代码从节点快速创建 XML 文档:

var xml = new XDocument();
var rootElement = new XElement("factors");
foreach (TreeNode node in tree.Nodes)
{
    foreach (TreeNode subNode in node.Nodes)
    {
        var attribute = new XAttribute("number", subNode.Text);
        var element = new XElement("factor", attribute);
        foreach (TreeNode subSubNode in subNode.Nodes)
        {
            var subElement = new XElement("code", subSubNode.Text);
            element.Add(subElement);
        }
        rootElement.Add(element);
    }
}
xml.Add(rootElement);
xml.ToString(); // gives you the XML code
// OR save the XML directly to file
//xml.Save(@"c:\temp\output.xml");

更好和更有效的是编写一个递归函数,让您返回填充的 XElement 对象。您还应该使用Tag TreeNode 属性来存储每个 TreeNode 的信息。

于 2013-05-25T06:48:45.840 回答