Как получить список <XElement>из этого XML? - PullRequest
0 голосов
/ 23 июня 2010

У меня есть блок XML, подобный следующему:

<factsheet>
<bilcontents >
  <config name="1" />
</bilcontents>

<singlefactsheet includeInBook="true">
  <config name="7" />
  <fund id="630" />
</singlefactsheet>

<doubleFactsheet includeInBook="true">
  <config name="8" />
  <fund id="623" />
  <fund id="624" />
</doubleFactsheet>

<tripplefactsheet includeInBook="true">
  <config name="6" />
  <fund id="36" />
  <fund id="37" />
  <fund id="38" />
</tripplefactsheet>
</factsheet>

Могу ли я получить список XElements, который содержит каждый из них, пока includeInBook="true", и с каждымэлемент, с которым я могу иметь дело в зависимости от типа узла.

Ответы [ 4 ]

2 голосов
/ 23 июня 2010

Абсолютно:

 var list = doc.Root
               .Elements()
               .Where(x => (bool?) x.Attribute("includeInBook") == true)
               .ToList();

Работа с обнуляемыми логическими значениями может быть немного странной, кстати.Альтернативный подход к лямбда-выражению может быть следующим:

x => (bool?) x.Attribute("includeInBook") ?? false

или

x => (string) x.Attribute("includeInBook") == "true"
0 голосов
/ 24 июня 2010

Вам следует подумать о создании структур данных для этого XML и использовании «сериализации».Это было бы намного более чистым способом взаимодействия с этой моделью данных.Просто кое-что рассмотреть ...

0 голосов
/ 24 июня 2010

Кроме того, вы можете использовать встроенные методы расширения XPath (они живут в System.Xml.Xpath:

XDocument doc;
// ...
var includeInBook = doc.XPathSelectElements("/factsheet/*[@includeInBook = 'true']")

Читать как:

  • /factsheet: выберите элемент «информационный лист»
  • /*: затем выберите всех детей
  • [ ... ]: читать квадратные скобки как «где»
    • @includeInBook = 'true': атрибут «includeInBook» имеет содержимое, равное «true»
0 голосов
/ 23 июня 2010

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

var inBook = nodes.Descendants()
    .Where(xx => xx.Attribute("includeInBook") != null)
    .Select(xx => xx).ToList();
...