LINQ to XMLを使用して列のXMLデータにアクセスするにはどうすればよいですか?
-
03-07-2019 - |
質問
テーブルの列にこの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が得られます。何をするかに応じて、匿名型を具象型に簡単に置き換えることができます。