Как использовать Linq to Xml для получения данных дерева с рекурсивными запросами? - PullRequest
1 голос
/ 31 мая 2011

У меня есть следующий вид XML-данных из службы restful:

<nodeData>  
  <nodeObject>  
    <nodeName>Node 1</nodeName>
    <nodeChildren>
      <nodeObject>
        <nodeName>Node 1-1</nodeName>
        <nodeChildren>
          <nodeObject>
            <nodeName>Leaf 1-1-1</nodeName>
          </nodeObject>
          <nodeObject>
            <nodeName>Leaf 1-1-2</nodeName>
          </nodeObject>
          <nodeObject>
            <nodeName>Leaf 1-1-3</nodeName>
          </nodeObject>
          <nodeObject>
            <nodeName>schedule 4.pdf</nodeName>
          </nodeObject>
        </nodeChildren>
      </nodeObject>
      <nodeObject>
        <nodeName>Node 1-2</nodeName>
        <nodeChildren>
          <nodeObject>
            <nodeName>Leaf 1-2-1</nodeName>
          </nodeObject>
        </nodeChildren>
      </nodeObject>
    </nodeChildren>
  </nodeObject>
  <nodeObject>
    <nodeName>Node 2</nodeName>
    <nodeChildren>
      <nodeObject>
        <nodeName>Node 2-1</nodeName>
        <nodeChildren>
          <nodeObject>
            <nodeName>Leaf 2-1-1</nodeName>
          </nodeObject>
        </nodeChildren>
      </nodeObject>
    </nodeChildren>
  </nodeObject>
......
</nodeData> 

Итак, я хочу получить данные дерева, чтобы заполнить вид дерева при слабом освещении. Что я сделал, как показано ниже:

Создать внутренний класс:

public class nodeObject
    {
        public string nodeName { get; set; }
        public IEnumerable<nodeObject> nodeChildren { get; set; }
    }

Написать Linq как:

void proxy_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                XDocument xml = XDocument.Parse(e.Result);
                var dataSource = (from results in xml.Descendants("nodeObject")
                                  select new nodeObject
                                  {
                                    nodeName = results.Element("nodeName").Value.ToString(),
                                    nodeChildren = this.GetChilden(results)
                                  });

                this.dataTree.ItemsSource = dataSource.ToList();             
            }
        }

        private IEnumerable<nodeObject> GetChilden(XElement parent)
        {
            return (from results in parent.Descendants("nodeObject")
                    select new nodeObject
                    {
                        nodeName = results.Element("nodeName").Value.ToString(),
                    }).ToList<nodeObject>();
        }

затем запустите приложение silverlight. данные отображаются в древовидной структуре как (только 2 уровня с большим количеством дубликатов):

Node 1
  Node 1-1
  Leaf 1-1-1
  Leaf 1-1-2
  Leaf 1-1-3
  Node 1-2
  Leaf 2-1-1
Node 1-1
  Leaf 1-1-1
  Leaf 1-1-2
  Leaf 1-1-3
  Node 1-2
  Leaf 2-1-1
Node 1-2
  Leaf 2-1-1
Node 2
  Node 2-1
  Leaf 2-1-1
Node 2-1
  Leaf 2-1-1

Но ожидаемое отображение должно быть таким (без листа):

Node 1
  Node 1-1
  Node 1-2
Node 2
  Node 2-1

Или как (включая лист):

Node 1
  Node 1-1
    Leaf 1-1-1
    Leaf 1-1-2
    Leaf 1-1-3
  Node 1-2
    Leaf 2-1-1
Node 2
  Node 2-1
    Leaf 2-1-1

Как решить эту проблему?

1 Ответ

1 голос
/ 02 июня 2011

Разобрался: это связано с проблемой привязки в xaml. Linq запрос в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...