2010-09-17 5 views
3

J'ai un fichier XML qui a une sorte de structure similaire que vous pouvez voir ci-dessous: Je voudrais sélectionner le titre et les sous-postes en utilisant LINQ to XML. Les difficultés que j'ai: parfois un sous-élément peut être juste un et parfois il peut être 20 sous-éléments, et je dois les ajouter à la liste < chaîne>.LINQ to XML (XML dynamique)

<?xml version="1.0"?> 
<items> 
    <item> 
     <title>Name of the title</title> 
     <subitem>Test</subitem> 
     <subitem1>Test</subitem1> 
     <subitem2>Test</subitem2> 
     <subitem3>Test</subitem3> 
     <subitem4>Test</subitem4> 
     <subitem5>Test</subitem5> 
    </item> 
    <item> 
     <title>Name of the title</title> 
     <subitem>Test</subitem> 
     <subitem1>Test</subitem1> 
     <subitem2>Test</subitem2> 
     <subitem3>Test</subitem3> 
    </item> 
    <item> 
     <title>Name of the title</title> 
     <subitem>Test</subitem> 
     <subitem1>Test</subitem1> 
    </item> 
</items> 
+0

Pouvez-vous montrer un exemple de ce que vous voulez pour une sortie? – JSprang

Répondre

1

La solution, y compris l'obtention des titres, est:

XDocument yourXDocument = XDocument.Load(yourXmlFilePath); 
IEnumerable<Tuple<XElement, IEnumerable<XElement>>> yourSubItems = 
    yourXDocument.Root.Descendants() 
       .Where(xelem => xelem.Name == "title") 
       .Select(xelem => new Tuple<XElement, IEnumerable<XElement>>(xelem, xelem.Parent.Elements().Where(subelem => subelem.Name.LocalName.StartsWith("subitem"))); 
+0

qu'est ce que le Tuple signifie? – Eugene

+1

@Eugene: Un tuple vous donne une construction générique pour grouper différents types de données ensemble, un Tuple serait un objet qui a la propriété Item1 de type string, Item2 de type int, et Item3 de type DateTime , le tuple que j'ai créé a Item1 qui est le titre XElement, et Item2 qui est un IEnumerable de XElements représentant les sous-éléments du titre. –

1
XDocument xdoc = XDocument.Load(path_to_xml); 
var query = from i in xdoc.Descendants("item") 
      select new 
      { 
       Title = (string)i.Element("title"), 
       Subitems = i.Elements() 
          .Where(e => e.Name.LocalName.StartsWith("subitem")) 
          .Select(e => (string)e) 
          .ToList() 
      };