从XML格式的字符串中读取输入,并以TreeView格式呈现
本文关键字:格式 并以 TreeView 输入 读取 XML 字符串 | 更新日期: 2023-09-27 17:51:24
我试图使用TreeView控件将XML格式的字符串加载到我的GUI中。但是,XML格式的字符串是专有的布局。
XML格式的字符串结构如下:
<Response>
<Data>
<Settings>
<Setting>
<SettingsXml>
<ScanJobs>
<ScanJobsData>
<Mailboxes>
<Name>user1@abc.com|DB1</Name>
<Value>true</Name>
</Mailboxes>
<Mailboxes>
<Name>user2@abc.com|DB1</Name>
<Value>true</Name>
</Mailboxes>
<Mailboxes>
<Name>user3@abc.com|DB2</Name>
<Value>true</Name>
</Mailboxes>
<Mailboxes>
<Name>user4@abc.com|DB2</Name>
<Value>true</Name>
</Mailboxes>
<Mailboxes>
<Name>user5@abc.com|DB3</Name>
<Value>true</Name>
</Mailboxes>
<Mailboxes>
<Name>user6@abc.com|DB3</Name>
<Value>true</Name>
</Mailboxes>
</ScanJobsData>
</ScanJobs>
</SettingsXml>
</Setting>
</Setting>
</Settings>
</Data>
</Response>
在标签里面我们有一个和标签。标记表示附加了该邮箱所属的"数据库名称"的邮箱的名称。例如,user1@abc.com是与名称为DB1的数据库相关联的邮箱的名称。现在我在一个字符串中得到上述xml格式的数据,而不是xml文件。
我希望在TreeView中按如下方式结构化输出:
+ DB1
user1@abc.com
user2@abc.com
+
user3@abc.com
user4@abc.com
+ db4
user5@abc.com
user6@abc.com
我在过去的几个小时里一直在网上搜索,没有任何结果对我有帮助。有些已经接近了,但也许属性不会显示,或者节点的名称不会显示,等等。
我是在Visual Studio 2010中用c#写的。谢谢你的帮助!
试试这个:
TreeView treeview = new TreeView();
// Get all the <Name> elements
XDocument doc = XDocument.Parse(xmlAsString);
var mailboxNames = doc.Element("Response").Element("Data").Element("Settings").Element("SettingsXml").Element("ScanJobs").Element("ScanJobsData").Elements("Mailboxes").Select(m => m.Element("Name"));
// Extract the email and db in each <Name> element
foreach (var name in mailboxNames)
{
var namesSplit = name.Value.Split('|');
var email = namesSplit[0];
var db = namesSplit[1];
// Create new db node if it not exists and add the email there
if (!treeview.Nodes.ContainsKey(db))
{
TreeNode[] emails = new TreeNode[] { new TreeNode(email) };
TreeNode node = new TreeNode(db, emails);
treeview.Nodes.Add(node);
}
// If db node already exists, add email to currently existing node
else
{
treeview.Nodes[db].Nodes.Add(email);
}
}
此查询将返回已添加邮件节点的DB TreeNodes
序列:
XDocument xdoc = XDocument.Load(path_to_xml);
// or XDocument.Parse(xml_string);
var nodes = from m in xdoc.Descendants("Mailboxes")
let name = m.Element("Name").Value.Split('|')
select new {
Mail = name[0],
Db = name[1]
} into md
group md by md.Db into g
select new TreeNode(g.Key,
g.Select(x => new TreeNode(x.Mail)).ToArray());
那么简单
treeView.Nodes.AddRange(nodes.ToArray());