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);
}
}
}
}
}
我认为你需要一个类型的GeoCoordinate在你的Venue模型。不要为Latitude和Longitude使用单独的属性。据我所知,在XAML的图钉只有一个位置属性,你可以绑定,这是期望GeoCoordinate类型。
我也没有真正理解SaveData方法的目的。当您可以使用已经公开暴露的属性时,为什么要使用反射呢?
我建议摆脱SaveData方法与反射部分,添加一个GeoCoordinate属性和创建您的对象使用属性。