Linq to XML 查询仅返回第一条记录

时间:2021-02-08 18:12:22

标签: c# asp.net asp.net-mvc

我有以下查询,它只返回第一条记录。如何修改它以返回该类别中的所有元素?

代码:

XDocument xdoc = XDocument.Load(Server.MapPath("/Content/xml/Collections.xml"));
var result = xdoc.Descendants("Category")
             .Where(x => (string) x.Attribute("name") == "Apartment")
             .Select(x => x.Element("ListingId"));

XML:

       <Items>
         <Category name="Apartment">
           <ListingId>1100121</ListingId>
           <ListingId>1100089</ListingId>
           <ListingId>1100090</ListingId>
           <ListingId>1100092</ListingId>
           <ListingId>1100067</ListingId>
           <ListingId>1100136</ListingId>
           <ListingId>1100302</ListingId>
           <ListingId>1100248</ListingId>
           <ListingId>1100072</ListingId>
           <ListingId>1100167</ListingId>
           <ListingId>1100309</ListingId>
           <ListingId>1100023</ListingId>
         </Category>
         <Category name="Single Family">
           <ListingId>1100001</ListingId>
           <ListingId>1100002</ListingId>
           <ListingId>1100017</ListingId>
         </Category>
       </Items>           

1 个答案:

答案 0 :(得分:1)

您可以使用 Elements 而不是 Element 来获取所有匹配的元素,而不仅仅是第一个。

如果您只对一个类别感兴趣,那么您可以使用它来获取它的所有 ListingId 元素。

var result = xdoc.Descendants("Category")
         .FirstOrDefault(x => (string)x.Attribute("name") == "Apartment")
         ?.Elements("ListingId");

这将为您提供一个 IEnumerable<XElement>,其中包含 Apartment 类别的所有 ListingId 元素。

否则,如果您想从所有匹配的类别中获取所有 ListingId,您可以使用 SelectMany

var result = xdoc.Descendants("Category")
         .Where(x => (string)x.Attribute("name") == "Apartment")
         .SelectMany(x => x.Elements("ListingId"));