2010-08-17 12 views
1

這裏的下一個節點是我的XML的LINQ to 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> 

我如何獲得第二<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>的值。

回答

2

這是我落得這樣做。上面的答案好,但如果<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

我打了票,但我在這一天的票數不足 – 2010-08-17 21:06:32

+0

我會爲你做;; - )+1爲獨立於訂單的解決方案。很遺憾,必須編寫這麼多的代碼來處理這麼小的事情: - /但我不知道它如何變得更清潔/更小;-)。 – 2010-08-17 21:11:11

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(); 
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(); 
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 
      };