数据绑定:在一个XML节点中使用值来查找另一个XML节点

时间:2012-05-18 04:50:36

标签: windows-phone-7

我的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();

我认为必须有办法,但我找不到它!

感谢。

2 个答案:

答案 0 :(得分: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")
};

将“Artist”对象放在Dictionary而不是XML节点中会更好。尽可能地将代码调整到模型对象。

答案 1 :(得分: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(),
    };