Linq to XML Получить следующий узел с тем же именем - PullRequest
1 голос
/ 18 августа 2010

Вот мой 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>

Как получить значение 2-го <metadata>, содержащее URI?

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 ]

2 голосов
/ 18 августа 2010

Я так и сделал.Ответы выше, где хорошо, но если <metadata> не в порядке, то я получу неправильные данные.Таким образом, я делаю запрос и получаю правильный, независимо от порядка.

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>();
0 голосов
/ 18 августа 2010

Этот код даст вам 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
             };
0 голосов
/ 18 августа 2010
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();
0 голосов
/ 18 августа 2010

Кажется, что .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();
...