从特定 XML 文件格式构建 TreeView

Build TreeView from Specific XML File Format

我正在尝试创建一个程序来读取以非常特定的格式生成的 XML 文件:-

<?xml version="1.0" encoding="utf-8"?>
<RDCMan programVersion="2.7" schemaVersion="3">
  <file>
    <properties>
      <name>Example File</name>
    </properties>
    <group>
      <properties>
        <name>Guests</name>
      </properties>
      <group>
        <properties>
          <name>Test Service</name>
        </properties>
        <group>
          <properties>
            <name>Location 1</name>
          </properties>
          <server>
            <properties>
              <displayName>Server1</displayName>
              <name>server1.domain.com</name>
            </properties>
          </server>
        </group>
        <group>
          <properties>
            <name>Location 2</name>
          </properties>
          <server>
            <properties>
              <displayName>Server2</displayName>
              <name>server2.domain.com</name>
            </properties>
          </server>
        </group>
      </group>
    </group>
    <group>
      <properties>
        <name>Hosts</name>
      </properties>
      <group>
        <properties>
          <name>Location1</name>
        </properties>
        <server>
          <properties>
            <displayName>Host1</displayName>
            <name>host1.domain.com</name>
          </properties>
        </server>
      </group>
      <group>
        <properties>
          <name>Location2</name>
        </properties>
        <server>
          <properties>
            <displayName>Host2</displayName>
            <name>host2.domain.com</name>
          </properties>
        </server>
      </group>
    </group>
  </file>
</RDCMan>

这将生成类似以下模型的 TreeView ;-

TreeView Mockup

谁能指出我正确的方向?我已经成功地从其他 XML 格式创建了 TreeViews,但是由于某种原因我无法使用这个格式!

(p.s 细心的人可能会注意到 XML 和远程桌面连接管理器文件之间惊人的相似之处!)

提前干杯

安迪

Xml 是 Xml。您真正想要的是在 c# 中获得与在不同机器上获得的结果相同的结果。问题是为什么您在本地机器上获得的服务器数量与远程机器不同。两台机器是否在同一子网中?这两台机器 运行 是否使用相同的操作系统 (windows/linux)?您要问的是 运行 远程计算机上的应用程序,然后在本地处理结果。这可能比解决本地和远程机器看到不同数量服务器的问题更复杂。看到不同数量的服务器通常意味着它们位于不同的子网上。您可能在本地计算机上收听了错误的以太网连接。要查看所有以太网数据,您需要确保正在收听接收所有子网的 IP.Any。

尝试以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication122
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            XElement file = doc.Descendants("file").FirstOrDefault();

            var result = file.Elements("group").Select(x => new
            {
                user = (string)x.Element("properties").Element("name"),
                server = x.Elements("group").Select(y => new {
                    serviceName = (string)y.Element("properties").Element("name"),
                    locations = y.Elements("group").Select(z => new {
                        locationName = (string)z.Element("properties").Element("name"),
                        servers = z.Elements("server").Select(a => new {
                            displayName = (string)a.Descendants("displayName").FirstOrDefault(),
                            serverName = (string)a.Descendants("name").FirstOrDefault()
                        }).ToList()
                    }).ToList()
                }).ToList()
            }).ToList();

         }
    }


}

这是加载树视图的代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;

namespace WindowsFormsApplication48
{
    public partial class Form1 : Form
    {
        const string FILENAME = @"c:\temp\test.xml";
        public Form1()
        {
            InitializeComponent();

            XDocument doc = XDocument.Load(FILENAME);
            XElement file = doc.Descendants("file").FirstOrDefault();

            foreach (XElement xUser in file.Elements("group"))
            {
                string user = (string)xUser.Element("properties").Element("name");
                TreeNode userNode = new TreeNode(user);
                treeView1.Nodes.Add(userNode);

                foreach (XElement xService in xUser.Elements("group"))
                {
                    string serviceName = (string)xService.Element("properties").Element("name");
                    TreeNode serviceNode = new TreeNode(serviceName);
                    userNode.Nodes.Add(serviceNode);
                    foreach (XElement xLocation in xService.Elements("group"))
                    {
                        string locationName = (string)xService.Element("properties").Element("name");
                        TreeNode locationNode = new TreeNode(locationName);
                        serviceNode.Nodes.Add(locationNode);
                        foreach (XElement xServer in xLocation.Elements("server"))
                        {
                            string displayName = (string)xServer.Descendants("displayName").FirstOrDefault();
                            string serverName = (string)xServer.Descendants("name").FirstOrDefault();
                            TreeNode serverNode = new TreeNode(displayName + "," + serverName);
                            locationNode.Nodes.Add(serverNode);

                        }
                    }
                }
            }
            treeView1.ExpandAll();
        }
    }
}

这是构建树视图的递归代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Linq;

namespace WindowsFormsApplication48
{
    public partial class Form1 : Form
    {
        const string FILENAME = @"c:\temp\test.xml";
        public Form1()
        {
            InitializeComponent();

            XDocument doc = XDocument.Load(FILENAME);
            XElement file = doc.Descendants("file").FirstOrDefault();

            string name = (string)file.Element("properties").Element("name");
            TreeNode fileNode = new TreeNode(name);
            treeView1.Nodes.Add(fileNode);
            GetTree(file, fileNode);

            treeView1.ExpandAll();
        }
        void GetTree(XElement xParent, TreeNode parentNode)
        {
            foreach (XElement group in xParent.Elements("group"))
            {
                string groupName = (string)group.Element("properties").Element("name");
                TreeNode groupNode = new TreeNode(groupName);
                parentNode.Nodes.Add(groupNode);
                GetTree(group, groupNode);
            }
            foreach (XElement xServer in xParent.Elements("server"))
            {
                string displayName = (string)xServer.Descendants("displayName").FirstOrDefault();
                string serverName = (string)xServer.Descendants("name").FirstOrDefault();
                TreeNode serverNode = new TreeNode(displayName + "," + serverName);
                parentNode.Nodes.Add(serverNode);

            }


        }
    }
}