簡體   English   中英

Linq to XML讀取和輸出從查找列表生成的XML

[英]Linq to XML Read and output XML generated from lookup list

我正在嘗試使用從SharePoint中的查找列表創建的XML作為樹視圖的數據源。 它的形式為:

<NewDataSet>
  <test_data>
    <ID>1</ID>
    <Title>MenuItem_1</Title>
    <child_of />    
  </test_data>
  <test_data>
    <ID>2</ID>
    <Title>Subitem_1</Title>
    <Action>http://www.google.com</Action>
    <child_of>MenuItem_1</child_of>   
  </test_data>
  <test_data>
    <ID>3</ID>
    <Title>Subitem_2</Title>
    <Action>http://www.google.com</Action>
    <child_of>MenuItem_1</child_of>
  </test_data>
  <test_data>
    <ID>4</ID>
    <Title>MenuItem_2</Title>
    <child_of />
  </test_data>
  <test_data>
    <ID>5</ID>
    <Title>Subitem_2_1</Title>
    <Action>http://www.google.com</Action>
    <child_of>MenuItem_2</child_of>
  </test_data>
  <test_data>
    <ID>6</ID>
    <Title>Subitem_2_2</Title>
    <Action>http://www.google.com</Action>
    <child_of>MenuItem_2</child_of>
  </test_data>
  <test_data>
    <ID>7</ID>
    <Title>Subitem_2_2_1</Title>
    <Action>http://www.google.com</Action>
    <child_of>Subitem_2_2</child_of>
  </test_data>
</NewDataSet>

可能有N層,但這些項目通過<child_of>元素與父級相關。 我似乎無法弄清楚如何用C#編寫LINQ來正確嵌套菜單項。 一位朋友推薦我在這里發布。 任何幫助是極大的贊賞。

您可以執行類似的操作,但是我會考慮將其實際用於生產代碼中的時間很長。

from n in testData.Elements("test_data")
                  .Aggregate(new Dictionary<string, TreeNode<string>>() 
                        {{ string.Empty, new TreeNode<string>() }},
                        (d, e) =>
                        {
                            var curNode = new TreeNode<string>(e.Element("ID").Value);
                            d.Add(e.Element("Title").Value, curNode);
                            d[e.Element("child_of").Value].AddChild(curNode);
                            return d;
                        })
                  .Values
where n.Parent == null
select n;

請注意,這假定元素的父鍵為“空字符串”或在源列表中位於其父之后。

就我個人而言,我會將其(尤其是聚合)分解為自己的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM