2008-10-16 79 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")