2010-04-15 7 views
2

J'ai un doc XML comme ceci:LINQ to XML requête simple

<Persons> 
<Person Id="10000" FullName="Jon Doe"> 
    <Status StatusID="1" StatusDesc="Active"/> 
     <Fields> 
      <Field FieldId="1" Value="xxxx"/> 
      <Field FieldId="2" Value="yyyy"/> 
      <Field FieldId="2" Value="zzzz"/> 
     </Fields> 
</Person> 
<Person Id="10001" FullName="John Smith"> 
    <Status StatusID="2" StatusDesc="New"/> 
    <Fields> 
     <Field FieldId="3" Value="aaaa"/> 
     <Field FieldId="4" Value="bbbb"/> 
    <Field FieldId="5" Value="ccccv"/> 
    </Fields> 
</Person> 
</Persons> 

Je veux écrire une requête XML qui renvoie l'ID "Personne" et tous les "champs" éléments. Je peux obtenir tous les éléments "Fields" mais pas l'identifiant "Person". Il en va de même lorsque j'ai besoin de l'élément "Status".

Toute aide sera appréciée.

+0

Quel code avez-vous à ce jour? – jball

Répondre

1

Essayez quelque chose comme ceci:

var result = XElement.Load("Example.xml") 
    .Elements("Person") 
    .Select(p => new { 
    Id = p.Attribute("Id").Value, 
    Fields = p.Descendants("Field").Select(f => new { 
     Id = f.Attribute("FieldId").Value, 
     Value = f.Attribute("Value").Value 
    }) 
    }); 

Cela vous donnera une séquence de types anonymes qui ressemblent à ceci:

class Anonymous 
{ 
    public String Id { get; } 
    public IEnumerable<AnonymousSubtype> Fields { get; } 
} 

class AnonymousSubtype 
{ 
    public String Id { get; } 
    public String Value { get; } 
} 

La raison pour laquelle je la méthode Descendants pour récupérer les champs C'est parce que l'élément avec lequel je travaille est l'élément Person. Puisque Elements ne renvoie que des nœuds qui sont des enfants directs, il ne fonctionnerait pas pour récupérer les champs, donc j'ai utilisé Descendants à la place.

Pour énumérer les résultats que vous pouvez faire:

foreach (var person in result) 
{ 
    Console.WriteLine("Person Id: {0}", person.Id); 
    foreach (var field in person.Fields) 
    { 
     Console.Write(" Field Id: {0}", field.Id); 
     Console.WriteLine(" Field Value: {0}", field.Value); 
    } 
} 
+0

C'est exactement ce que je cherche. Je vais essayer .. Merci Andrew. – anon2010

+0

@ anon2010 - J'ai un peu simplifié la requête - c'est la même requête avec une approche simplifiée. –

+0

Ty Andrew, cette déclaration "laisser les champs" m'a un peu troublé. Pourquoi avez-vous utilisé p.Descendants ("Field") et non p.Elements ("Field")? – anon2010