« 4つの目標を掲げてみました。 | トップページ | LINQ to XMLで苦戦中(解決) »

2008年12月10日 (水)

LINQ to XMLで苦戦中…。

以下のXMLをDataGridにバインドして表示するWebプログラムをC#で組もうとしたら・・・。


<商品情報>
<商品 地方発送="なし">
<品番>udon_01
<品名 イメージ="tenpura.gif">天ぷらうどん
<セット内容 セット="5" 単価="700">うどん、かけつゆ、えび天ぷら、あげ巻き
<価格>3500

<商品 地方発送="なし">
<品番>udon_02
<品名 イメージ="kakiage.gif">かきあげうどん
<セット内容 セット="5" 単価="560">うどん、かけつゆ、季節のかきあげ、かまぼこ
<価格>2800

<商品 地方発送="あり">
<品番>udon_03
<品名 イメージ="kitsune.gif">きつねうどん
<セット内容 セット="4" 単価="375">うどん、かけつゆ、味付け油あげ、かまぼこ
<価格>1500

<商品 地方発送="なし">
<品番>udon_04
<品名 イメージ="tsukimi.gif">月見うどん
<セット内容 セット="4" 単価="150">うどん、かけつゆ、生卵
<価格>600

<商品 地方発送="あり">
<品番>udon_05
<品名 イメージ="kakeudon.gif">かけうどん
<セット内容 セット="6" 単価="250">うどん、ぶっかけつゆ、あげ巻き、乾燥薬味
<価格>1500

<商品 地方発送="あり">
<品番>udon_06
<品名 イメージ="wakame.gif">わかめうどん
<セット内容 セット="10" 単価="250">うどん、かけつゆ、乾燥わかめ、かまぼこ
<価格>2500

<商品 地方発送="あり">
<品番>udon_07
<品名 イメージ="sansai.gif">山菜うどん
<セット内容 セット="10" 単価="250">うどん、かけつゆ、しいたけ、しめじ、山菜、かまぼこ
<価格>2500

<商品 地方発送="なし">
<品番>udon_08
<品名 イメージ="nikomi.gif">煮込みうどん
<セット内容 セット="7" 単価="400">うどん、かけつゆ、しめじ、きじ肉、ほうれんそう、あげ巻き
<価格>2800

<商品 地方発送="なし">
<品番>udon_09
<品名 イメージ="misonikomi.gif">味噌煮込みうどん
<セット内容 セット="7" 単価="400">うどん、いりこだし、麦みそ、じゃこ天、ごぼう天、きじ肉、かぼちゃ、乾燥ねぎ
<価格>2800

<商品 地方発送="なし">
<品番>udon_10
<品名 イメージ="curry.gif">カレーうどん
<セット内容 セット="5" 単価="600">うどん、かけつゆ、粉末カレー、きじ肉、野菜
<価格>3000


以下のプログラムでそのままバインドできると思ったら、
LINQでデータを取るところで「匿名型では、同じ名前を持つ複数のプロパティを含む事はできません。」
とコンパイルエラーになってしまいました。
protected void Page_Load(object sender, EventArgs e)
{
string strFilePath = Server.MapPath("./");
XElement xmldoc = XElement.Load(strFilePath + "App_Data/udons_2008_forControl.xml");

var query = from c in xmldoc.Elements("商品")
select new
{
c.Element("品番").Value,
c.Element("品名").Value,
c.Attribute("地方発送").Value,
c.Element("品名").Attribute("イメージ").Value,
c.Element("セット内容").Value,
c.Element("セット内容").Attribute("セット").Value,
c.Element("セット内容").Attribute("単価").Value,
c.Element("価格").Value
};

GridView1.DataSource = query;
GridView1.DataBind();
}

VB.NETの場合はc.Element("XXX")の部分をc.<品番>.Valueで取得できるみたいなのですが、
C#に翻訳しようと思うと何か足りないのだろうか…。

タイムオーバーになったのでまた明日以降ということで。。。

|

« 4つの目標を掲げてみました。 | トップページ | LINQ to XMLで苦戦中(解決) »

C#」カテゴリの記事

コメント

以下でできましたよ。

private String filePath;
private XElement xmldoc;
private DataTable dt;

private void DBind() {
GridView1.DataSource = dt;
GridView1.DataBind();
}

private void DShow() {
dt = new DataTable();
dt.Columns.Add("品番");
dt.Columns.Add("品名");
dt.Columns.Add("価格");
var query = from c in
xmldoc.Descendants("商品")
select new {
品番 = c.Element("品番").Value,
品名 = c.Element("品名").Value,
価格 = c.Element("価格").Value
};
foreach (var p in query) {
DataRow dr = dt.NewRow();
dr[0] = p.品番;
dr[1] = p.品名;
dr[2] = p.価格;
dt.Rows.Add(dr);
}
}

protected void Page_Load(
object sender, EventArgs e) {
filePath =
Request.PhysicalApplicationPath;
xmldoc =
XElement.Load(
filePath + @"App_Data\UDON1.xml");
DShow();
if (!IsPostBack) {
DBind();
// IsPostBack : false
if (Session.IsNewSession == true) {
} else {
}
} else {
}
}

投稿: SAME | 2008年12月11日 (木) 21時33分

>SAMEさん
ありがとうございます。
私の方でも参考にして動作を確認しました。

どうやら、一旦一時的な変数にセットする
形をとらないといけないようですね。

とりあえず、Sessionやらは一旦置いといて…
のコードはこれからブログに上げようと思います。
(ちなみにDataTableに一旦入れなくても
一時変数をそのまま渡してもいけるみたいですね)

投稿: T-1000 | 2008年12月11日 (木) 22時23分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/50625/43373758

この記事へのトラックバック一覧です: LINQ to XMLで苦戦中…。:

» LINQ to XMLで苦戦中(解決) [T-1000の日記]
苦戦していたLINQなんですが、SAMEさんからのヒントにより うまくGridV [続きを読む]

受信: 2008年12月11日 (木) 22時36分

« 4つの目標を掲げてみました。 | トップページ | LINQ to XMLで苦戦中(解決) »