2009-08-01 12 views
1

このようなXMLファイルがあり、テーブルセル内のすべての位置属性を取得しようとしています。私はタイトルと説明を得ることができたが、何とかイベント内のすべての場所を取得できなかった。リピータのlinqでネストされたxml

誰かが私にこれを助けることができますか?

乾杯 テリー

私は今のところ出てくる次

var qListCurrentMonth = (from feed in doc.Descendants("item") 
         select new 
         { 
          title = feed.Element("title").Value, 
          description = feed.Element("description").Value, 
          events = (from ev in feed.Element("events").Elements("location") 
             select new 
               { 
                city = ev.Attribute("city") 
               }).ToList() 
         }); 

rptFeedItems.DataSource = qListCurrentMonth; 
rptFeedItems.DataBind(); 

、ここでXML

イベントできたもの ファッションショー1

<description>item descr</description> 
    <link>http://somelink</link> 

    <events> 
    <location city="nyc" date="12.12.08" link="http://www.etc.com" /> 
    <location city="nyc" date="25.11.08" link="http://www.etc.com" /> 
    <location city="sfo" date="11.11.08" link="http://www.etc.com" /> 
    <location city="sfo" date="22.01.08" link="http://www.etc.com" /> 
    <location city="dal" date="12.12.08" link="http://www.etc.com" /> 

    </events> 
</item> 

<item> 
    <title>Fashion show 2</title> 

    <description>item descr</description> 
    <link>http://somelink</link> 

    <events> 
    <location city="nyc" date="12.12.08" link="http://www.etc.com" /> 
    <location city="nyc" date="25.11.08" link="http://www.etc.com" /> 
    <location city="sfo" date="11.11.08" link="http://www.etc.com" /> 
    <location city="sfo" date="22.01.08" link="http://www.etc.com" /> 
    <location city="dal" date="12.12.08" link="http://www.etc.com" /> 

    </events> 
</item> 

、ここでリピータ

<table border="1"> 
      <asp:Repeater runat="server" ID="rptFeedItems"> 
       <ItemTemplate> 
        <tr> 
         <td><%# Eval("title")%></td> 
         <td><%# Eval("description")%></td> 
         <td><%# Eval("events")%></td> 
        </tr> 

       </ItemTemplate> 
      </asp:Repeater> 

     </table> 
+1

XSLTの使用を検討しましたか? :-) –

+0

LINQ to XMLをXMLに使うことができるのであれば、XSLTを使いたいと思うことは想像もできません。これは、非.NETシステムとの相互運用性が必要な場合や、後でシステムに変換を提供し、LINQ to XMLを許可する必要がある場合など、XSLTが正当な理由があると言われています任意のコードを注入する。 – Stilgar

答えて

1

私はあなたがジェネリックリスト型の代わりに、要素の値を取得していると思います。これは、EvalがToString()の結果を返し、ListのToString()がその型を返すためです。あなたができることはいくつかあります。 1つは、別のリピーターをネストしてイベントプロパティにバインドします。これは理論的には最もクリーンな解決策ですが、この場合はそれがそれに値するとは思えません。

もう1つのことは、eventsプロパティを文字列として累積することです。これは次のようにすることができます。

var qListCurrentMonth = 
    (from feed in doc.Descendants("item") 
    select new 
    { 
     title = feed.Element("title").Value, 
     description = feed.Element("description").Value, 
     events = 
      (from ev in feed.Element("events").Elements("location") 
      select ev.Attribute("city").Value).Aggregate((x,y) => x+ "<br />" + y) 
     }); 

Aggregateメソッドは、コレクションを1つのインスタンスに蓄積します。行平均5つ以上のイベントがある場合は、パフォーマンス上の理由から、StringBuilderをアキュムレータとして使用することをお勧めします(集計のオーバーロードがあります)。

.NET 3.5を使用しているので、Repeater ...の代わりにListViewを使用することをお勧めします。この場合も、テーブルを表現しているので、GridViewが優れている場合があります。最後に

- .NETの規則に従うと、あなたは自分のイベントセルに都市コードを一覧表示したい場合は、プロパティ名のために(代わりにイベントのすなわちイベント)

+0

ありがとうStilgar、私は集計メソッドの使用について考えたことはありませんでした。 –

1

をPascalCaseを使用してください:

var qListCurrentMonth = 
    from feed in doc.Descendants("item") 
    let cities = 
     (from location in feed.Element("events").Elements("location") 
     select location.Attribute("city").Value) 
     .ToArray()) 
    select new 
    { 
     title = feed.Element("title").Value, 
     description = feed.Element("description").Value, 
     events = string.Join(", ", cities) 
    }); 

StilgarのAggregateメソッドも素晴らしい提案です。