LINQ表达式不服从xml边界

本文关键字:边界 xml 不服从 表达式 LINQ | 更新日期: 2023-09-27 18:04:20

也许这个标题让人困惑。

我有一个非常奇怪的问题,而读取xml与linq。

我的XML是这样的:

<Result>
  <Hotels>    
    <Hotel>
      <Documents>
        <Image>
          <Url>http://www.someUrlToImage1</Url>
        </Image>
        <Image>
          <Url>http://www.someUrlToImage2</Url>
        </Image>
      </Documents>
      <Room>
        <Documents>
          <Image>
            <Url>http://www.someUrlToImage3</Url>
          </Image>
          <Image>
            <Url>http://www.someUrlToImage4</Url>
          </Image>
        </Documents>
       </Room>
    </Hotel>
  <Hotels>
<Result>

如果我想获得关于酒店的两张图片,我得到所有4张图片…:

Hotel temp = (from x in  doc.Descendants("Result").Descendants("Hotels").Descendants("Hotel")
             select new Hotel()
             HotelImages= new Collection<string>(
             x.Descendants("Documents").SelectMany(
               documents => documents.Descendants("Images").Select(
                document => (string)document.Descendants("URL").FirstOrDefault() ?? "")).ToList())
             }).First();
我希望有人在我之前遇到过这个问题。

LINQ表达式不服从xml边界

Descendants返回父元素内任何位置的所有匹配元素,而不仅仅是紧跟在之下的元素。x有两个后代Documents标签,您将从它们两个中获得图像。

试着用Elements代替Descendants

Descendants()选择当前节点的后代,而不仅仅是直接子节点,因此x.Descendants("Documents")选择了Documents的两个节点,而不仅仅是第一个。

这是怎么回事:

Hotel temp = (from x in  doc.Descendants("Hotel")
              select new Hotel()
              {
                HotelImages = new Collection<string>(
                                  x.Elements("Documents")
                                   .Descendants("Images")
                                   .Where(i => (string)i.Attribute("Class") == "jpg")
                                   .Select(img => (string)img.Element("URL") ?? "")
                                   .ToList()
                              )
              }).First();