Linq to XML获取同名的下一个节点

时间:2010-08-17 20:36:48

标签: c# xml linq-to-xml

这是我的XML

<assets>
    <asset>
        <metadata Id="ItemType" Value="Image"/>
        <metadata Id="ItemUri" Value="http://blah.png"/>
    </asset>
    <asset>
        <metadata Id="ItemType" Value="Image"/>
        <metadata Id="ItemUri" Value="http://blah2.png"/>
    </asset>
</assets>

如何获取包含URI的第二个<metadata>值?

List<Asset> assets = (from asset in xmlDocument.Descendants("asset")
                              select new Asset
                              {
                                  ItemType = asset.Element("metadata").Attribute("Value").Value,
                                  ItemUri = asset.Element("metadata").Attribute("Value").Value
                              }).ToList<Asset>();

目前我的代码只返回第一个<metadata>的相同值。

4 个答案:

答案 0 :(得分:2)

这就是我最终要做的事情。上面的答案哪里好,但如果<metadata> s不正常,那么我将得到错误的数据。通过这种方式,无论顺序如何,我都会进行查询并获得正确的查询。

List<Asset> assets = (from asset in xmlDocument.Descendants("asset")
                              select new Asset
                              {
                                  ItemType = asset.Elements().Single(x => x.Attribute("Id").Value == "ItemType").Attribute("Value").Value,
                                  ItemUri = asset.Elements().Single(x => x.Attribute("Id").Value == "ItemUri").Attribute("Value").Value,    
                              }).ToList<Asset>();

答案 1 :(得分:0)

如果存在多个元素,似乎.Element(..)获取具有匹配名称的第一个元素。 您可以将linq查询编辑为类似

的内容
var assets = (from asset in doc.Descendants("asset")
                 let metadata = asset.Descendants("metadata").ToArray()
                 let type = metadata[0].Attribute("Value").Value
                 let uri = metadata[1].Attribute("Value").Value
                 select new Asset { ItemType = type, ItemUri = uri }).ToList();

答案 2 :(得分:0)

var assets = (from asset in xmlDocument.Descendants("asset")
              select new Asset
              {
                  ItemType = (string)asset.Element("metadata").Attribute("Value"),
                  ItemUri = (string)asset.Elements("metadata").ElementAt(1).Attribute("Value")
              }).ToList();

答案 3 :(得分:0)

此代码会为您提供一些匿名类型的IEnumerable,但您已经知道如何将其转换为正确的类型。

var assets = from asset in xd.Descendants("asset")
             from metaType in asset.Descendants("metadata")
             from metaUri in asset.Descendants("metadata")
             where metaType.Attribute("Id").Value == "ItemType"
             && metaUri.Attribute("Id").Value == "ItemUri"
             select new
             {
                 ItemType = metaType.Attribute("Value").Value,
                 ItemUri = metaUri.Attribute("Value").Value
             };