LINQ to XML, извлечение в правильном порядке правильных узлов - PullRequest
0 голосов
/ 19 мая 2010

Был ли у вас когда-нибудь один из тех дней, когда вы вырыли яму, но теперь вы настолько глубоко в ней, что единственный выход - продолжать копать и смотреть, где вы выходите? Я подумал только о хихиканье в последнем компоненте, который я пишу, чтобы использовать LINQ to XML, потому что пришло время увидеть, что же такое вся эта шумиха.

Проблема: я генерирую дерево XML для представления «коллекции» рядов на графе, каждая серия может иметь детей, потомков серии «означает», что эта серия точек (для построения графика) основана на родительская серия. Поэтому я создаю свой XML как набор правил, а затем передаю его в процедуру рисования, которая «должна» пройти по дереву и рисует их в таком порядке, то есть ни один дочерний элемент не отображается перед его родителем.

Мой XML создается программно. пример выглядит так (не уверен на 100%, что я все делаю правильно)

<Chart>
  <Chart_Config>
    <Color Color="white" />
    <Panels Panel="1" />
  </Chart_Config>
  <Series ID="0">
    <Name>1154.close</Name>
    <ID>0</ID>
    <IndID>-1</IndID>
    <PID>0</PID>
    <iType>0</iType>
    <Parent>0</Parent>
    <Series ID="1">
      <Name>1.Indicator</Name>
      <ID>1</ID>
      <IndID>0</IndID>
      <PID>0</PID>
      <iType>0</iType>
      <Parent>1154.close</Parent>
    </Series>
    <Series ID="2">
      <Name>2.Indicator</Name>
      <ID>2</ID>
      <IndID>0</IndID>
      <PID>0</PID>
      <iType>0</iType>
      <Parent>1154.close</Parent>
    </Series>
    <Series ID="3">
      <Name>3.Indicator</Name>
      <ID>3</ID>
      <IndID>0</IndID>
      <PID>0</PID>
      <iType>0</iType>
      <Parent>1154.close</Parent>
   </Series>
  </Series>
</Chart>

Приведенный выше xml немного хитрый, но дело в том, что в этом случае у меня есть 1 серия (id = 0), у которой 3 серии в качестве детей и, таким образом, 3 серии на основе ID = 0 серии.

Вопрос в том, какие команды LINQ я должен использовать, чтобы получить ВСЕ узлы <series>, чтобы они вошли в I.e. от корня до листьев.

Код, который я имею, получает только первый узел серии, а не его дочерние элементы. Я не могу разобраться с этим синтаксисом или концепциями LINQ.

        var result = from e in ChartRule.Elements("Series")
                     select e;

Любая помощь приветствуется. Я ожидаю, что это довольно просто, если у вас есть хоть какие-то подсказки; -)

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Если вам нужно получить все элементы Series, вы можете использовать Descendants (), что эквивалентно выражению "// Series" xpath:

from e in ChartRule.Descendants("Series")
                     select e

Тогда вы можете проверить данные родителей программно ...

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

Descendants (): Возвращает отфильтрованную коллекцию элементов-потомков для этого документа или элемента в порядке документа. В коллекцию включаются только элементы с соответствующим XName.

Это то, что вам нужно, как указано мамоо.

Я бы лучше написал это так:

from e in ChartRule.Descendants()
                   .Where(x => x.Name.LocalName == "Series")
                   select e

Это позволит избежать конфликтов пространства имен в случае, если вы получите эти данные, например, из веб-службы.

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