1

次のような XML があります。

<showcases>
<showcase id="260">
<artistID>2143</artistID>
<venueID>29</venueID>
<startdatetime>2012-09-12 17:30:00</startdatetime>
<enddatetime>2012-09-12 18:00:00</enddatetime>
</showcase>
[etc]
</showcases>

そして、同じ XML ファイル内に次のものがあります。

<showcaseartists>
<showcaseartist id="2129">
[other stuff about them]
</showcaseartist>
[etc]
</showcaseartists>

<venue id="19">
<name> ... </name>
<address> ... </address>
[etc]
</venue>

そのデータをリストに入れるにはどうすればよいですか?

このように:

var showcasedata = from query in loadedData.Descendants("showcase")
select new Showcase
{
    StartDateTime = (DateTime)query.Element("startdatetime"),
    ArtistName = ????,
    Venue = ????
};
ShowcasesList.ItemsSource = showcasedata.ToList();

何か方法があるはずなのに見つからない!

ありがとう。

4

2 に答える 2

0

迅速で汚い方法:

var showcasedata = from query in loadedData.Descendants("showcase")
select new Showcase
{
    StartDateTime = (DateTime)query.Element("startdatetime"),
    ArtistName = (string)loadedData.Elements("showcaseartist").First(e => (string)e.Attribute("id") == (string)query.Element("artistID"))
};
ShowcasesList.ItemsSource = showcasedata.ToList();

小さなXMLドキュメントでは機能するはずですが、大きなドキュメントではパフォーマンスの問題がすぐに発生します。それらについては、キャッシュに辞書を使用してください。

var artists = loadedData.Elements("showcaseartist").ToDictionary(e => (string)e.Attribute("id"), e => e);

var showcasedata = from query in loadedData.Descendants("showcase")
select new Showcase
{
    StartDateTime = (DateTime)query.Element("startdatetime"),
    ArtistName = (string)artists[(string)query.Attribute("id")].Element("artistID")
};

XMLノードではなく、「Artist」オブジェクトをディクショナリに配置することをお勧めします。可能な限り、コードをモデルオブジェクトに適合させます。

于 2012-05-18T05:21:11.590 に答える
0

あなたのクラスが次のように見えると言う

public class Showcase
{
  public DateTime StartDateTime;
  public string ArtistName;
  public string Venue;
}

これを試して

var showcasedata = 
  from query1 in loadedData.Descendants("showcase")
    select new Showcase() {
      StartDateTime = (DateTime)query1.Element( "startdatetime" ),
      ArtistName = ( from query2 in loadedData.Descendants("showcaseartist")
                     where (int)query1.Element( "artistID" ) == (int)query2.Attribute("id")
                     select (string)query2.Element("name") ).First(),
      Venue = ( from query3 in loadedData.Descendants("venue")
                where (int)query1.Element( "venueID" ) == (int)query3.Attribute("id")
                select (string)query3.Element("name") ).First(),
    };
于 2012-05-18T05:21:49.567 に答える