c#XML解析为GeoCoordinate

时间:2011-07-18 16:18:47

标签: c# .net xml windows-phone-7 .net-4.0

我有这个XML(示例文件):

 <Record counter="1">
      <Fields>
       <Field name="id">4234</Field>
       <Field name="county"></Field>
     </Fields>          
     <Distance>
       <Miles>0.14</Miles>
       <KM>0.22</KM>
     </Distance>
     <Point>
       <Lat>51.498199</Lat>
       <Lon>-0.126334</Lon>
     </Point>
</Record>

我将下面的代码放在'vList'集合中  这一切都很好。但是,我需要在GeoCoordinate中转换lat和long。

做这样的事情:

GeoCoordinate Location = new GeoCoordinate(Convert.ToDouble(Lat), Convert.ToDouble(Lon));

它需要暴露,因此可以通过xaml页面看到它转换为Pushpins。 它需要与vList保持在同一个集合中,因此XML的所有元素都保存在一起。我希望这是有道理的。我花了一整天时间试图解决这个问题,但无法看到如何最终将这个Geolocation'Location'值添加到我的收藏中。感谢。

 public void ReadXML()
    {

        var sf = Application.GetResourceStream(new Uri("data.xml", UriKind.Relative));
     using (XmlReader xr = XmlReader.Create(sf.Stream))
     {
         XDocument doc = XDocument.Load(xr);
         var qn = XName.Get("Fields", "http://blahblah/");
         var record = XName.Get("Record", "http://blahblah");

         var Records = from c in doc.Descendants(record)
                      select c;
         ObservableCollection<Venue> vList = new ObservableCollection<Venue>();
         foreach (var x in Records)
         {
             var Fields = from c in x.Descendants(qn)
                          select c;

             Venue lv = new Venue();

             foreach (var t in Fields)
             {
                 foreach (var e in t.Elements())
                 {
                     lv.SaveData(e.Attribute("name").Value, e.Value, lv);
                 }
             }

             var dist = XName.Get("Distance", "http//blahblah");
             var Distance = from c in x.Descendants(dist)
                            select c;
             foreach (var d in Distance)
             {
                 foreach (var e in d.Elements())
                 {
                     lv.SaveData(e.Name.LocalName, e.Value, lv);
                 }
             }

             var pts = XName.Get("Point", "http://blahblah");
             var Point = from c in x.Descendants(pts)
                          select c;

             foreach (var d in Point)
             {
                 foreach (var e in d.Elements())
                 {
                     lv.SaveData(e.Name.LocalName, e.Value, lv);
                 }
             }

             vList.Add(lv);
             lv = null;
         }
         listBox1.ItemsSource = vList;

          mapItems.Items.Add(vList);
          //or
          mapItems.ItemsSource = vList;
     }

    }

    public class Venue //: INotifyPropertyChanged
    {
        public string id {get;set;}
        public string county { get; set; }
        public string Miles { get; set; }
        public string KM { get; set; }
        public string Lat { get; set; }
        public string Lon { get; set; }

        public void SaveData(string field, string value, Venue v)
        {
            foreach (MemberInfo mi in v.GetType().GetMembers())
            {              
                if (mi.MemberType == MemberTypes.Property)
                {
                    PropertyInfo pi = mi as PropertyInfo;
                    if (pi.Name == field)
                    {
                        pi.SetValue(v, value,null);
                    }
                }
            }
        }

    }

1 个答案:

答案 0 :(得分:0)

我认为你在Venue模型中需要一种GeoCoordinate。不要使用纬度和经度的单独属性。据我所知,XAML中的图钉只有一个可以绑定的Location属性,它期待一种GeoCoordinate。

另外,我并没有真正达到SaveData方法的目的。当你可以使用已经公开曝光的属性时,为什么要使用反射?

我建议使用反射部分去掉SaveData方法,添加GeoCoordinate属性并使用属性创建对象。