2017-11-08 9 views
0

gpx 파일을 클래스로 deserialize하려고하는데 문제가 있습니다. Xml2CSharp에 gpx 파일 텍스트를 입력하고 그런 식으로 클래스를 생성 해 보았습니다. 그러나 올바른지 확실하지 않습니다 (http://xmltocsharp.azurewebsites.net/). 디버거를 사용할 때 gpx는 null입니다. 누군가 내가 잘못하고있는 것에 대해 통찰력을 줄 수 있습니까? 감사.Xml Deserializer가 gpx 파일에 작동하지 않습니다.

GPX 텍스트 :

<gpx xmlns="http://www.topografix.com/GPX/1/1" version="1.0"> 
    <trk> 
     <trkseg> 
     <start lat="37.48996833333333" lon="-122.20991333333335"> 
      <ele>127.1</ele> 
      <time>2017-11-07T02:53:07Z</time> 
     </start> 
     <trkpt lat="37.48996833333333" lon="-122.20991333333335"> 
      <ele>127.1</ele> 
      <time>2017-11-07T02:53:07Z</time> 
     </trkpt> 
     <trkpt lat="37.48996833333333" lon="-122.20991333333335"> 
      <ele>127.1</ele> 
      <time>2017-11-07T02:53:07Z</time> 
     </trkpt> 
     </trkseg> 
    </trk> 
</gpx> 

현재 클래스 :

public class XmlSerializeGpx 
{ 
    public Gpx gpx { get; set; } 

    public class Start 
    { 
     public string Ele { get; set; } 
     public string Time { get; set; } 
     public string Lat { get; set; } 
     public string Lon { get; set; } 
    } 

    public class Trkpt 
    { 
     public string Ele { get; set; } 
     public string Time { get; set; } 
     public string Lat { get; set; } 
     public string Lon { get; set; } 
    } 

    public class Trkseg 
    { 
     public Start Start { get; set; } 
     public List<Trkpt> Trkpt { get; set; } 
    } 

    public class Trk 
    { 
     public Trkseg Trkseg { get; set; } 
    } 

    public class Gpx 
    { 
     public Trk Trk { get; set; } 
     public string Xmlns { get; set; } 
     public string Version { get; set; } 
    } 
} 

이 내 디시리얼라이저입니다 : 당신은, 대소 문자가 정확받을 필요가

XmlRootAttribute xRoot = new XmlRootAttribute(); 
xRoot.ElementName = "gpx"; 
xRoot.Namespace = gpxNs.NamespaceName; 
xRoot.IsNullable = true; 

XmlSerializer xmlSerializer = new XmlSerializer(typeof(XmlSerializeGpx),xRoot); 
FileStream fs = new FileStream(file.Path, FileMode.Open); 
XmlReader reader = XmlReader.Create(fs); 

XmlSerializeGpx gpxObj; 

gpxObj = (XmlSerializeGpx)xmlSerializer.Deserialize(reader); 

fs.Close(); 
+0

http://xmltocsharp.azurewebsites.net/? –

+0

네, 제 XML 파일을 C# 클래스로 변환하려고했습니다. – HelpinCodingpls

답변

1

. 아래 테스트 코드 참조

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Serialization; 
using System.IO; 


namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XmlSerializer xmlSerializer = new XmlSerializer(typeof(XmlSerializeGpx.Gpx), "http://www.topografix.com/GPX/1/1"); 

      FileStream fs = new FileStream(FILENAME, FileMode.Open); 
      XmlReader reader = XmlReader.Create(fs); 

      XmlSerializeGpx.Gpx gpxObj = (XmlSerializeGpx.Gpx)xmlSerializer.Deserialize(reader); 

     } 
    } 
    public class XmlSerializeGpx 
    { 

     [XmlRoot(ElementName = "start", Namespace = "http://www.topografix.com/GPX/1/1")] 
     public class Start 
     { 
      public double ele { get; set; } 
      public DateTime time { get; set; } 
      [XmlAttribute("lat")] 
      public double lat { get; set; } 
      [XmlAttribute("lon")] 
      public double lon { get; set; } 
     } 

     [XmlRoot(ElementName = "trkpt", Namespace = "http://www.topografix.com/GPX/1/1")] 
     public class Trkpt 
     { 
      public double ele { get; set; } 
      public DateTime time { get; set; } 
      [XmlAttribute("lat")] 
      public double lat { get; set; } 
      [XmlAttribute("lon")] 
      public double lon { get; set; } 
     } 

     [XmlRoot(ElementName = "trkseg", Namespace = "http://www.topografix.com/GPX/1/1")] 
     public class Trkseg 
     { 
      [XmlElement("start")] 
      public List<Start> start { get; set; } 
      [XmlElement("trkpt")] 
      public List<Trkpt> trkpt { get; set; } 
     } 

     [XmlRoot(ElementName = "trk", Namespace = "http://www.topografix.com/GPX/1/1")] 
     public class Trk 
     { 
      public Trkseg trkseg { get; set; } 
     } 

     [XmlRoot(ElementName = "gpx", Namespace = "http://www.topografix.com/GPX/1/1")] 
     public class Gpx 
     { 
      public Trk trk { get; set; } 
     } 
    } 
} 
+0

감사합니다. 클래스 이름의 소문자가 문제였습니다. 그러나 또한 deserialize 대신 XmlSerializeGpx.Gpx 대신 XmlSerializeGpx를 캐스팅했습니다. – HelpinCodingpls