【问题标题】:How do I access the XML data in my column using LINQ to XML?如何使用 LINQ to XML 访问列中的 XML 数据?
【发布时间】:2008-10-16 01:43:17
【问题描述】:

我的表中有一列中有这个 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 字段中获取值并显示出来。

【问题讨论】:

    标签: c# xml linq-to-sql linq-to-xml


    【解决方案1】:

    我再次感到惊讶的是,人们甚至没有尝试他们的答案,而且当他们不工作时人们仍然投票。 .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")
    

    【讨论】:

      【解决方案2】:

      这是一个示例代码:

      要读取关键字,我们需要调用 Elements("keyword") 而不是 Elements("keywords") 因为 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

      【讨论】:

        【解决方案3】:

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

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

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

        【讨论】:

        • k.Attributes["something"] 不会编译
        • ga.ArticleKeywords.Elements("Keywords") - 不返回关键字
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多