LINQ to XML простой запрос - PullRequest
       13

LINQ to XML простой запрос

2 голосов
/ 15 апреля 2010

У меня есть документ 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» и все элементы «Fields». Я могу получить все элементы «Поля», но не идентификатор «Персона». То же самое относится, когда мне нужен элемент «Статус».

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

1 Ответ

1 голос
/ 15 апреля 2010

Попробуйте что-то вроде этого:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...