0

我在表的列中有这个 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 to SQL 从该表中获取记录:

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

那行得通,我得到了我的 GeneratedArticle 对象就好了。

我想浏览一下 ArticleKeywords 字段中的数据,即 XML。我开始这样做:

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

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

我不能 100% 确定我是否正确获取了这些数据。我需要有关正确语法的帮助,以从我的 XML 字段中获取值和显示。

4

3 回答 3

3

再一次让我感到惊讶的是,人们甚至没有尝试他们的答案,而且当他们不工作时人们仍然投票。.Elements 将获取当前根的元素列表,这不是关键字。

同样使用 .Attributes["X"] 的那个甚至不编译你需要使用 () 当然再次它会在“keywords”而不是“keyword”的每个实例上运行

你可以使用

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")
于 2008-10-20T20:41:55.803 回答
2

这是一个示例代码:

要读取关键字,我们需要调用Elements(" keyword ")而不是Elements(" keywords "),因为关键字是根节点。

// 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("bar").Value获取属性值,但如果缺少属性,此方法会抛出异常。获取属性值的安全方法是(string)foo.Attribute("bar") -如果缺少属性,它会给你null

于 2008-10-16T02:16:05.150 回答
0

我认为这样的事情会起作用

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

这将为您提供一个匿名类型的 IEnumerable,其中包含一个 Value 和一个 Display 属性。根据您的操作,您可以轻松地将匿名类型替换为具体类型。

于 2008-10-16T02:13:14.123 回答