構造のxmlファイルがあります
<MainList>
<number>5<number/>
<first id="1" name="test" />
<second/>
<third/>
<MainList/>
「MainList」と「number」を削除して、これをツリービューに表示したい
ツリーを次の形式で表示したい
first
id
name
second
third
私は今xmlreaderを使用しています
ここで @AS-CII によって提供された回答 ( Binding hierarchy xml to treeview ) に基づいて、そこに投稿されたコードを変更してニーズを満たすことができます。
TreeNode
直接追加します(ルート要素がないため)Nodes
TreeView
TreeNode
作成するAttribute
Element
例えば:
private void Form1_Load ( object sender, EventArgs e )
{
string xml = "<MainList><number>5</number><first id=\"1\" name=\"test\" /><second/><third/></MainList>";
XDocument doc = XDocument.Parse ( xml );
var elements = doc.Root // "MainList"
.Elements () // Elements inside "MainList"
.Skip ( 1 ); // Skip first item ("number")
// Add a TreeNode for each element on first level (inside MainList)
foreach ( var item in elements )
{
// Create first-level-node
TreeNode node = new TreeNode ( item.Name.LocalName );
// Create subtree, if necessary
TreeNode[] nodes = this.GetNodes ( node, item ).ToArray ();
// Add node with subtree to TreeView
treeView1.Nodes.AddRange ( nodes );
}
}
上記のコードは、次のメソッドを使用して、XML ドキュメントの要素と属性から TreeNodes を作成します。
private IEnumerable<TreeNode> GetNodes ( TreeNode node, XElement element )
{
List<TreeNode> result = new List<TreeNode> ();
// First, create TreeNodes for attributes of current element and add them to the result
if ( element.HasAttributes )
result.AddRange ( node.AddRange (
from item in element.Attributes ()
select new TreeNode ( "[A] " + item.Name.LocalName ) ) );
// Next, create subtree and add it to the result
if ( element.HasElements )
result.AddRange ( node.AddRange (
from item in element.Elements ()
let tree = new TreeNode ( item.Name.LocalName )
from newNode in GetNodes ( tree, item )
select newNode ) );
// If there aren't any attributes or subelements, return the node that was originally passed in
if ( result.Count == 0 )
result.Add ( node );
// Return the result
return result;
}
さらに、次の拡張メソッドが必要です。
public static class TreeNodeEx
{
public static IEnumerable<TreeNode> AddRange ( this TreeNode collection, IEnumerable<TreeNode> nodes )
{
collection.Nodes.AddRange ( nodes.ToArray () );
return new[] { collection };
}
}