2008-10-16 97 views
0

我有這樣的XML列在我的表:如何使用LINQ to XML訪問列中的XML數據?

<keywords> 
    <keyword name="First Name" value="|FIRSTNAME|" display="Jack" /> 
    <keyword name="Last Name" value="|LASTNAME|" display="Jones" /> 
    <keyword name="City" value="|CITY|" display="Anytown" /> 
    <keyword name="State" value="|STATE|" display="MD" /> 
</keywords> 

我得到一個記錄了使用LINQ該表的通過這SQL:

GeneratedArticle ga = db.GeneratedArticles.Single(p => p.GeneratedArticleId == generatedArticleId); 

這工作,我得到我的GeneratedArticle對象就好了。

我想瀏覽一下XML文檔ArticleKeywords字段中的數據。我開始這樣做:

var keywords = from k in ga.ArticleKeywords.Elements("Keywords") 
        select k; 

      foreach (var keyword in keywords) 
      { 
      //what goes here? 
      } 

我不是100%確定我能正確獲取這些數據。我需要正確語法的幫助來獲取值並顯示出我的XML字段。

回答

2

這裏是一個示例代碼:

要閱讀我們需要調用元素關鍵字(「關鍵字‘)元素(’關鍵字」)因爲關鍵字是根節點。

// IEnumerable sequence with keywords data 
var keywords = from kw in ga.ArticleKeywords.Elements("keyword") 
       select new { 
        Name = (string)kw.Attribute("name"), 
        Value = (string)kw.Attribute("value"), 
        Display = (string)kw.Attribute("display") 
       }; 


foreach (var keyword in keywords) 
{ 
    var kw = "Name: " + keyword.Name + 
      " Value: " + keyword.Value + 
      " Display: " + keyword.Display; 
    Console.WriteLine(kw); 
} 

你可以使用屬性foo.Attribute(「巴」)。值值,但是如果屬性缺少這種方法會拋出異常。安全的方式來獲得屬性值是(串)foo.Attribute(「巴」) - 它會給你如果屬性再次我很驚訝,人們甚至不試試自己的答案失蹤

0

我認爲像這樣的工作

var keywordData = from k in ga.ArticleKeywords.Elements("Keywords") 
        select new { Value = k.Attributes["value"].Value, 
           Display = k.Attributes["display"].Value}; 

這會給你包含一個值和一個Display屬性的匿名類型的IEnumerable。取決於你在做什麼,你可以很容易地用具體類型替換匿名類型。

+0

k.Attributes [「something」]不會編譯 – aku 2008-10-16 02:30:17

3

人們在不工作時仍然投票。 .Elements將獲取當前根元素的列表,而不是關鍵字。

而且使用.Attributes [「X」]的一個甚至不編譯你當然需要使用()再次將上的「關鍵詞」每個實例運行時,「關鍵字」

你可以使用

var keywords = from kw in ga.ArticleKeywords.Element("keywords").Elements() 

var keywords = from kw in ga.ArticleKeywords.Element("keywords").Elements("keyword") 

或(這將讓所有的關鍵字元素不分級別)

var keywords = from kw in ga.ArticleKeywords.Descendants("keyword")