我正在尝试编写Linq2XML查询来查询以下XML。我需要它来拉回给定GalleryID的所有照片。
<Albums>
<Album GalleryId="1" Cover="AlbumCover1.jpg" Title="Album 1">
<Photos>
<Photo Title="Image1" URL="img1.jpg" DateAdded="01/01/2010 09:20"/>
<Photo Title="Image2" URL="img2.jpg" DateAdded="01/01/2010 09:20"/>
<Photo Title="Image3" URL="img3.jpg" DateAdded="01/01/2010 09:20"/>
</Photos>
</Album>
<Album GalleryId="2" Cover="AlbumCover1.jpg" Title="Album 2">
<Photos>
<Photo Title="Image1" URL="img1.jpg" DateAdded="01/01/2010 09:20"/>
<Photo Title="Image2" URL="img2.jpg" DateAdded="01/01/2010 09:20"/>
</Photos>
</Album>
</Albums>
我提出的最好的是
XDocument xmlDoc = XDocument.Load(GalleryFilePath);
var x = from c in xmlDoc.Descendants("Album")
where int.Parse(c.Attribute("GalleryId").Value) == GalleryId
orderby c.Attribute("Title").Value descending
select new
{
Title = c.Element("Photos").Element("Photo").Attribute("Title").Value,
URL = c.Element("Photos").Element("Photo").Attribute("URL").Value,
DateAdded = c.Element("Photos").Element("Photo").Attribute("DateAdded").Value
};
这没有任何回报,我猜这是因为我告诉它查询Album元素然后尝试循环浏览照片元素。关于如何做到这一点的任何提示?
由于
编辑:更新代码以反映答案
答案 0 :(得分:3)
将Attribute
对象与值混淆是一个常见的错误。您应该使用Attribute("x").Value
来检索它的值。
尝试更正此代码:
XDocument xmlDoc = XDocument.Load(GalleryFilePath);
var x = from c in xmlDoc.Descendants("Photo")
where c.Parent.Parent.Attribute("GalleryId").Value.Equals(GalleryId)
orderby c.Parent.Parent.Attribute("Title").Value descending
select new
{
Title = c.Attribute("Title").Value,
URL = c.Attribute("URL").Value,
DateAdded = c.Attribute("DateAdded").Value
};
[更新] 要检索照片列表,我已将照片元素设置为照片元素,以及相册的位置,即所提供的示例XML中的2级。 / p>