我在表格的一栏中有这个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字段。

有帮助吗?

解决方案

以下是示例代码:

要阅读关键字,我们需要调用元素(“关键字”)而不是元素(&quot; 关键字&quot; )因为关键字是根节点。

// 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(&quot; bar&quot;)。值获取属性值,但如果缺少属性,此方法将抛出异常。获取属性值的安全方法是(string)foo.Attribute(&quot; bar&quot;) - 如果属性缺失,它将为您提供 null

其他提示

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

使用.Attributes [&quot; X&quot;]的人甚至不编译你需要使用()当然它也会在每个“关键字”实例上运行。不是“关键字”

您可以使用

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")

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top