Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将XML解析为地理坐标_C#_.net_Xml_Windows Phone 7_.net 4.0 - Fatal编程技术网

C# 将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>

我有一个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>
而且它需要公开,以便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);
                    }
                }
            }
        }

    }