【问题标题】:Build TreeView from Specific XML File Format从特定 XML 文件格式构建 TreeView
【发布时间】:2019-07-30 00:28:36
【问题描述】:

我正在尝试创建一个程序来读取以特定格式生成的 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 格式的原因之一。此外,使用这种格式,我可以轻松地重复使用我们的 RDC 管理器文件(其中包含数千台服务器!),而不是重新发明轮子并且必须维护两个单独的、非常大的系统列表。

标签: xml vb.net treeview


【解决方案1】:

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);

            }


        }
    }
}

【讨论】:

  • 对不起,我想你误会了我。我没有连接到任何东西。我只是试图获得一个例程(在 VB.NET 或 C# 中),它读取上述 XML 并构建一个 TreeView,如附加的模型所示。
  • 我用一些代码更新了答案。由于递归标签名称,代码很棘手。您可以根据我的结果创建树视图。
  • 啊,处理 XML 以获取其元素 处理 TreeView 之前!好东西!感谢您的信息。现在效果很好,让我摆脱了困境:)
  • 最后的递归解法很好。
猜你喜欢
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
相关资源
最近更新 更多