LINQ to XML简单查询

时间:2010-04-15 15:35:55

标签: c# linq-to-xml

我有一个像这样的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>

我想编写一个返回“Person”ID和所有“Fields”元素的XML查询。 我可以获得所有“Fields”元素但不能获得“Person”ID。 当我需要“Status”元素时也是如此。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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);
    }
}