2010-06-23 3 views
0

У меня есть блок XML, подобный следующему:Как получить список <XElement> из этого 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", и с каждым элементом я могу тогда дело с ним на основе типа узла.

ответ

2

Абсолютно:

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

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

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

или

x => (string) x.Attribute("includeInBook") == "true" 
+0

Спасибо, Джон, я на самом деле сам что-то сработал, поэтому разместил его ниже. – DaveDev

0

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

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

Это только проверка того, существует ли атрибут * *, если бы включили 'includeInBook =" false "элементы, которые, безусловно, не то, что вы хотите. Также обратите внимание, что вызов 'Select' является избыточным. –

+0

Полученные очки. благодаря – DaveDev

0

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

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

Читайте также:

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

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

Смежные вопросы