作者name2name2 (yang~hi)
看板C_Sharp
標題Re: [問題] XML to treeview
時間Fri Oct 14 01:47:29 2016
之前剛好有碰xml和TreeNode,
剛才有空花一小時試寫的結果在此提供參考,有討論或問題我之後可再回覆
我剛有放上github,
https://github.com/name2name2/TreeViewXMLTest
可下載看源碼
我主要是用winform測試的,
主要專案為TreeViewXMLTest所以也是起始專案
(另外一個Test專案是我做一點測試用的)
item的XML部份我是放在專案的XML.xml檔,讀取內容後生成TreeView
---------------------
放主程式碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Linq;
namespace TreeViewXMLTest
{
public partial class Form1 : Form
{
TreeView treeView = new TreeView();
public Form1()
{
InitializeComponent();
//取得XElement
XElement X = XElement.Load("XML.xml");
var Xitems = X.XmlSerachElementXI("item");
if (Xitems != null)
{
TreeNode rootNode = new TreeNode("Root");
//為每個item建立一個property的依序層級node,並加至rootNode
foreach (XElement item in Xitems)
{
TreeNode ItemNode = new
TreeNode(item.Elements().ElementAt(0).Value);
AddChildNode(ItemNode, item, 1);
rootNode.Nodes.Add(ItemNode);
}
treeView.Nodes.Add(rootNode);
}
treeView.Width = 300;
treeView.Height = 300;
this.Controls.Add(treeView);
}
/// <summary>
/// 遞迴加子節點
/// </summary>
/// <param name="tNode"></param>
/// <param name="item"></param>
/// <param name="pos"></param>
private void AddChildNode(TreeNode tNode, XElement item, int pos)
{
var property = item.Elements().ElementAtOrDefault(pos);
if (property!=null)
{
tNode.Nodes.Add(property.Value);
AddChildNode(tNode.FirstNode, item, ++pos);
}
}
}
}
-----------
一個自訂輔助方法
public static class Assit
{
public static IEnumerable<XElement> XmlSerachElementXI(this XElement
X, string SearchEleXPath)
{//XI >>> Xml的IEnumerable的簡寫
IEnumerable XI = (IEnumerable)X.XPathEvaluate(SearchEleXPath);
IEnumerable<XElement> XAList = XI.Cast<XElement>();
if (XAList.LongCount() > 0)
return XAList;
else return null;//等於0
}
}
--------
結果畫面
http://i.imgur.com/xLcycty.png
※ 引述《largesperm (reindeer)》之銘言:
: 想請教一下有一份 XML 文件 格式大概是長這樣
: <item>
: <type>A</type>
: <weight>11</weight>
: <length>111</length>
: <volts>110</volts>
: <aged>1</aged>
: <old>True</old>
: </items>
: <item>
: <type>B</type>
: <weight>22</weight>
: <length>222</length>
: <volts>220</volts>
: <aged>2</aged>
: <old>False</old>
: </items>
: 想把它變成 treeview 類似
: Root
: -> A
: -> 11
: -> 111
: -> 110
: -> 1
: -> True
: -> B
: -> 22
: -> 222
: -> 220
: -> 2
: -> False
: 試了一些方法 感覺都很笨
: 總覺得應該有什麼聰明的方法
: 謝謝
--
應無所住,而生其心
Sent from my
PCMan Combo
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.42.213.240
※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1476380854.A.3E6.html
※ 編輯: name2name2 (114.42.213.240), 10/14/2016 01:50:47
※ 編輯: name2name2 (114.42.213.240), 10/14/2016 01:53:05
推 largesperm: 喔喔 感謝 我來研究看看 10/14 08:45
推 oilcaptain: 感謝分享 10/14 09:57