Linq to XML Чтение и вывод XML, сгенерированного из списка поиска - PullRequest
1 голос
/ 28 апреля 2010

Я пытаюсь использовать XML, созданный из списка поиска в SharePoint, в качестве источника данных для дерева. В форме:

<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>. Я не могу понять, как написать LINQ на C #, чтобы правильно вкладывать пункты меню. Друг рекомендовал мне опубликовать здесь. Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 28 мая 2010

Вы могли бы сделать что-то подобное, но я бы долго думал над тем, чтобы на самом деле внедрить это в рабочий код.

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;

Обратите внимание, что это предполагает, что элемент имеет родительский ключ "пустая строка" или входит в список источников после своего родителя.

Лично я бы отнес это (особенно агрегацию) к собственному методу.

...