2013-03-19 28 views
1

我有一個XMLXML得到具體的名字

<work> 
<worker name="Jason" job="admin"> 
<worker name="Frank" job="employee"> 
<worker name="John" job="admin"> 
<work> 

我試圖找回工人與作業管理命名的這個例子。

這是我現在的代碼的一部分。該代碼將檢索所有工作人員。

Worker = workerElement.Elements("work") 
         .Elements("worker") 
         .Select(c => (string)c.Attribute("name")) 
         .ToArray(); 

我一直在嘗試了以下解決方案

Worker = workerElement.Elements("work") 
         .Elements("worker") 
         .Select(c => (string)c.Attribute("name[@job='admin']")) 
         .ToArray(); 

我想找回在作業「稱號」等於管理的所有名稱。

+0

看看http://stackoverflow.com/questions/3885795/select-element-with-given-attribute-using-linq-to-xml – 2013-03-19 23:03:29

+0

我會建議在的XPath正確操作和導航XML數據。 [這裏是一個例子](http://stackoverflow.com/a/5946327/82682)。 – joce 2013-03-19 23:03:51

+6

沒有標籤在你的xml中被關閉...... – 2013-03-19 23:08:01

回答

1

首先有你的XML犯了一些錯誤,我已經低於糾正之後:

<work> 
<worker name="Jason" job="admin" /> 
<worker name="Frank" job="employee" /> 
<worker name="John" job="admin" /> 
</work> 

然後,如果你正在使用LINQ嘗試,嘗試使用這樣的:

Worker = workerElement.Elements("work") 
         .Elements("worker") 
         .Where(c => (string)c.Attribute("job") == "admin") 
         .Select(c => (string)c.Attribute("name")) 
         .ToArray(); 

或者如果您使用的是XPath,則可以使用:

var admins = workerElement.XPathSelectElements("//worker[@job='admin']") 
      .Select(w => (string)w.Attribute("name")); 
+0

非常感謝。一直在嘗試類似的東西。 – dumbel 2013-03-19 23:11:14

2

@Xtian的解決方案是正確的。下面是XPath的解決方案:

var workers = workerElement.XPathSelectElements("//worker[@job='admin']") 
          .Select(w => (string)w.Attribute("name")); 
+1

+1我經常使用XPath--在許多情況下,我發現各種選擇可以更清楚地寫入它。 – 2013-03-19 23:20:45

+0

@pst我希望選擇屬性值的方式將被添加到XPath中。然後所有查詢將在一行:) – 2013-03-19 23:23:49

+0

不要擔心,[XPathEvaluate](http://msdn.microsoft.com/en-us/library/bb341675.aspx)可以是相當不錯的! (儘管我偶爾會發現自己偶爾會使用它 - 通常當屬性是某個自動路徑的一部分時)。 – 2013-03-19 23:27:40