C# 将XML解析为地理坐标
我有一个XML示例文件:C# 将XML解析为地理坐标,c#,.net,xml,windows-phone-7,.net-4.0,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>
<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>
而且它需要公开,以便xaml页面可以看到它,并将其转换为图钉。
它需要与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);
}
}
}
}
}
我想你需要在你的场地模型中使用一种地理坐标。不要对纬度和经度使用单独的属性。据我所知,XAML中的图钉只有一个可以绑定的Location属性,它需要一种GeoCoordinate类型 此外,我还没有真正了解SaveData方法的用途。既然可以使用已经公开的属性,为什么还要使用反射呢
我建议去掉反射部分的SaveData方法,添加GeoCoordinate属性,并使用这些属性创建对象。您的问题不太清楚。谁在生成XML?如果你需要你的代码,为什么你不使用像XmlSerializer这样更直接的反序列化方法呢?例如,反序列化?我强烈建议你避免使用像“d”和“e”这样的变量,这样人们就可以理解你的代码。从“e”点变量中提取X和Y值
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);
}
}
}
}
}