0

構造のxmlファイルがあります

<MainList>
<number>5<number/>
<first id="1" name="test" />
<second/>
<third/>
<MainList/>

「MainList」と「number」を削除して、これをツリービューに表示したい

ツリーを次の形式で表示したい

first
  id
  name
second
third

私は今xmlreaderを使用しています

4

1 に答える 1

1

ここで @AS-CII によって提供された回答 ( Binding hierarchy xml to treeview ) に基づいて、そこに投稿されたコードを変更してニーズを満たすことができます。

  1. ルート要素と最初の子要素をスキップする
  2. first- level- を -collection にTreeNode直接追加します(ルート要素がないため)NodesTreeView
  3. だけでなく、のためにTreeNode作成するAttributeElement

例えば:

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 };
    }
}
于 2012-07-25T10:17:45.693 に答える