从特定 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);
}
}
}
}
我正在尝试创建一个程序来读取以非常特定的格式生成的 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);
}
}
}
}