c# XML parsing into a GeoCoordinate

本文关键字:GeoCoordinate into parsing XML | 更新日期: 2023-09-27 18:02:31

我有这个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中转换纬度和长度。

做这样的事情:

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

并且它需要被暴露,以便xaml页面可以看到它以转换为Pushpins。它需要与vList保持在同一个集合中,以便XML的所有元素保持在一起。我希望这是有意义的。我花了一整天的时间试图解决这个问题,但不知道如何最终将这个地理位置"位置"值添加到我的收藏中。谢谢。

 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);
                    }
                }
            }
        }
    }

c# XML parsing into a GeoCoordinate

我认为你需要一个类型的GeoCoordinate在你的Venue模型。不要为Latitude和Longitude使用单独的属性。据我所知,在XAML的图钉只有一个位置属性,你可以绑定,这是期望GeoCoordinate类型。

我也没有真正理解SaveData方法的目的。当您可以使用已经公开暴露的属性时,为什么要使用反射呢?

我建议摆脱SaveData方法与反射部分,添加一个GeoCoordinate属性和创建您的对象使用属性。