2010-04-15 5 views
2

У меня есть XML-документ, как это:LINQ к XML простого запросу

<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> 

Я хочу написать запрос XML, который возвращает «Person» ID и все элементы «Поле». Я могу получить все элементы «Поля», но не идентификатор «Человек». То же самое относится, когда мне нужен элемент «Статус».

Любая помощь будет оценена по достоинству.

+0

Какой код у вас до сих пор? – jball

ответ

1

попробовать что-то вроде этого:

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 
    }) 
    }); 

Это даст вам последовательность анонимных типов, которые выглядят примерно так:

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

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

Причина, по которой я использовал метод Descendants для извлечения полей потому что элемент, с которым я впервые работаю, - это элемент Person. Поскольку Elements возвращает только узлы, которые являются прямыми дочерними, это не помогло бы получить поля, поэтому вместо этого я использовал Descendants.

Чтобы перечислить результаты, которые вы можете сделать это:

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

Это именно то, что я ищу. Я попробую. Спасибо, Андрей. – anon2010

+0

@ anon2010 - Я немного упростил запрос - это тот же запрос только с упрощенным подходом. –

+0

Ty Andrew, что заявление «let fields» немного смутило меня. Почему вы использовали p.Descendants («Поле»), а не p.Elements («Поле»)? – anon2010

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