0

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

+DB2

  • user3@abc.com

  • user4@abc.com

+DB3

  • user5@abc.com

  • user6@abc.com

過去数時間、Web を検索してきましたが、どれも役に立ちませんでした。近いものもありますが、おそらくプロパティが表示されなかったり、ノードの名前が表示されなかったりします。

私は Visual Studio 2010 で c# を書いています。助けてくれてありがとう!

4

2 に答える 2

1

これを試して:

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);
    }
}
于 2013-01-11T07:07:18.573 に答える
1

TreeNodesこのクエリは、メール ノードが既に追加されている一連の DB を返します。

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());
于 2013-01-11T07:26:51.397 に答える