LINQ to XMLを使用して列のXMLデータにアクセスするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/207157

質問

テーブルの列にこの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オブジェクトは問題ありません。

XMLであるArticleKeywordsフィールドのデータを見ていきたいと思います。私はこれを始めました:

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

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

そのデータが正しく取得されているかどうかは100%確信できません。 XMLフィールドから値を取得して表示するには、適切な構文に関するヘルプが必要です。

役に立ちましたか?

解決

サンプルコードを次に示します。

キーワードを読み取るには、 Elements(&quot; keywords &quot;ではなく Elements(&quot; keyword &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;)。Value を使用して属性値を取得できますが、属性が見つからない場合、このメソッドは例外をスローします。属性値を取得する安全な方法は(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