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();
我希望有人在我之前遇到过这个问题。
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();