我有一个像这样的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”元素时也是如此。
任何帮助将不胜感激。
答案 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);
}
}