【问题标题】:How to parse XML with namespace using XmlDocument如何使用 XmlDocument 解析带有命名空间的 XML
【发布时间】:2019-03-17 20:57:19
【问题描述】:

我运行这段代码 https://gist.github.com/ccumaya/10b1a58efe06c1f8080045457c5cf4b8https://dotnetfiddle.net/ (该网站现在无法获取链接,所以我使用 gist。)

我的目的是获取 XML 文件中的 GPS 点,但 XPath

'/gpx/trk/trkseg/trkpt' 

不起作用。我不知道哪里出错了,但我正在使用XPath

'//*' 

并获得 1439 个结果。我需要帮助,感谢您的指导。

xml结构如下。

<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtrkx="http://www.garmin.com/xmlschemas/TrackStatsExtension/v1" xmlns:wptx1="http://www.garmin.com/xmlschemas/WaypointExtension/v1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="GPSMAP 64ST TWN" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackStatsExtension/v1 http://www8.garmin.com/xmlschemas/TrackStatsExtension.xsd http://www.garmin.com/xmlschemas/WaypointExtension/v1 http://www8.garmin.com/xmlschemas/WaypointExtensionv1.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
  <metadata>
    <link href="http://www.garmin.com">
      <text>Garmin International</text>
    </link>
    <time>2018-10-05T09:21:31Z</time>
  </metadata>
  <trk>
    <name>2018-10-05 17:21:26</name>
    <extensions>
      <gpxx:TrackExtension>
        <gpxx:DisplayColor>Cyan</gpxx:DisplayColor>
      </gpxx:TrackExtension>
      <gpxtrkx:TrackStatsExtension>
        <gpxtrkx:Distance>1033</gpxtrkx:Distance>
        <gpxtrkx:TotalElapsedTime>996</gpxtrkx:TotalElapsedTime>
        <gpxtrkx:MovingTime>870</gpxtrkx:MovingTime>
        <gpxtrkx:StoppedTime>86</gpxtrkx:StoppedTime>
        <gpxtrkx:MovingSpeed>1</gpxtrkx:MovingSpeed>
        <gpxtrkx:MaxSpeed>2</gpxtrkx:MaxSpeed>
        <gpxtrkx:MaxElevation>207</gpxtrkx:MaxElevation>
        <gpxtrkx:MinElevation>189</gpxtrkx:MinElevation>
        <gpxtrkx:Ascent>17</gpxtrkx:Ascent>
        <gpxtrkx:Descent>5</gpxtrkx:Descent>
        <gpxtrkx:AvgAscentRate>0</gpxtrkx:AvgAscentRate>
        <gpxtrkx:MaxAscentRate>0</gpxtrkx:MaxAscentRate>
        <gpxtrkx:AvgDescentRate>0</gpxtrkx:AvgDescentRate>
        <gpxtrkx:MaxDescentRate>-0</gpxtrkx:MaxDescentRate>
        </gpxtrkx:TrackStatsExtension>
      </extensions>
      <trkseg>
        <trkpt lat="25.0312615000" lon="121.3505846635">
        <ele>189.04</ele>
        <time>2018-10-05T09:04:55Z</time>
      </trkpt>
      <trkpt lat="25.0312520284" lon="121.3505897764">
        <ele>189.04</ele>
        <time>2018-10-05T09:04:57Z</time>
        </trkpt>
      <trkpt lat="25.0312457420" lon="121.3506018464">
        <ele>196.43</ele>
        <time>2018-10-05T09:04:59Z</time>
      </trkpt>
      <trkpt lat="25.0312426407" lon="121.3506035227">
        <ele>196.42</ele>
        <time>2018-10-05T09:05:01Z</time>
      </trkpt>
    </trkseg>
  </trk>
</gpx>

感谢您的帮助

【问题讨论】:

    标签: c# asp.net xml xpath xml-parsing


    【解决方案1】:

    如果您只需要纬度和经度,您可以使用 xml linq 轻松获取它,代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            const string FILENAME = @"c:\temp\gps.xml";
            static void Main(string[] args)
            {
                XDocument doc = XDocument.Load(FILENAME);
                XElement root = doc.Root;
                XNamespace ns = root.GetDefaultNamespace();
    
                var results = doc.Descendants(ns + "trkpt").Select(x => new
                {
                    lat = x.Attribute("lat"),
                    lon = x.Attribute("lon"),
                    ele = (decimal)x.Element(ns + "ele"),
                    time = (DateTime)x.Element(ns + "time")
                }).ToList();
    
            }
        }
    }
    

    【讨论】:

    • 如何在linq语句中获取“ele”和“time”值?我使用“ele = x.FirstNode.ToString()”,它显示 topografix.com/GPX/1/1">189.04</ele>,而不仅仅是 189.04
    【解决方案2】:

    我不知道为什么,但下面的代码对我来说效果很好。 我仍然没有为它们找到正确的 xpath。

    即使我获得了“trkpt”节点,我仍然无法通过 xpath 获得子节点,这不是完美的解决方案。

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(sss);
    
        XmlNodeList root = doc.GetElementsByTagName("trkpt");
        Console.WriteLine(root.Count);
    
        for (int i = 0; i < root.Count; i++)
        {
            Console.WriteLine("attr:" +root[i].Attributes["lat"].Value);
            Console.WriteLine("attr:" +root[i].Attributes["lon"].Value);
            Console.WriteLine("subnode:" +root[i].SelectNodes("./*")[0].InnerText);
            Console.WriteLine("subnode:" +root[i].SelectNodes("./*")[1].InnerText);
            Console.WriteLine("----");
        }
    

    【讨论】:

      【解决方案3】:

      这里是代码。请参阅我的第二个答案以了解我是如何生成代码的。 1439 个结果来自 OP 在 github 的链接中提供的完整 xml 文件,变量 'sss'。

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Xml;
      using System.Xml.Serialization;
      
      namespace ConsoleApplication1
      {
          class Program
          {
              const string FILENAME = @"c:\temp\gps.xml";
              static void Main(string[] args)
              {
                  XmlReader reader = XmlReader.Create(FILENAME);
                  XmlSerializer serializer = new XmlSerializer(typeof(gpxType));
                  gpxType gps = (gpxType)serializer.Deserialize(reader);
      
                  trksegType[] seg = gps.trk[0].trkseg;
                  wptType[] wpt = seg[0].trkpt;
                  var points = wpt.Select(x => new { lat = x.lat, lon = x.lon, elevation = x.ele, time = x.time}).ToList();
      
              }
          }
          // <auto-generated>
          //     This code was generated by a tool.
          //     Runtime Version:2.0.50727.6421
          //
          //     Changes to this file may cause incorrect behavior and will be lost if
          //     the code is regenerated.
          // </auto-generated>
          // This source code was auto-generated by xsd, Version=2.0.50727.3038.
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          [System.Xml.Serialization.XmlRootAttribute("gpx", Namespace="http://www.topografix.com/GPX/1/1", IsNullable=false)]
          public partial class gpxType {
              private metadataType metadataField;
              private wptType[] wptField;
              private rteType[] rteField;
              private trkType[] trkField;
              private extensionsType extensionsField;
              private string versionField;
              private string creatorField;
              public gpxType() {
                  this.versionField = "1.1";
              }
              /// <remarks/>
              public metadataType metadata {
                  get {
                      return this.metadataField;
                  }
                  set {
                      this.metadataField = value;
                  }
              }
              /// <remarks/>
              [System.Xml.Serialization.XmlElementAttribute("wpt")]
              public wptType[] wpt {
                  get {
                      return this.wptField;
                  }
                  set {
                      this.wptField = value;
                  }
              }
              /// <remarks/>
              [System.Xml.Serialization.XmlElementAttribute("rte")]
              public rteType[] rte {
                  get {
                      return this.rteField;
                  }
                  set {
                      this.rteField = value;
                  }
              }
              /// <remarks/>
              [System.Xml.Serialization.XmlElementAttribute("trk")]
              public trkType[] trk {
                  get {
                      return this.trkField;
                  }
                  set {
                      this.trkField = value;
                  }
              }
              /// <remarks/>
              public extensionsType extensions {
                  get {
                      return this.extensionsField;
                  }
                  set {
                      this.extensionsField = value;
                  }
              }
              /// <remarks/>
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public string version {
                  get {
                      return this.versionField;
                  }
                  set {
                      this.versionField = value;
                  }
              }
              /// <remarks/>
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public string creator {
                  get {
                      return this.creatorField;
                  }
                  set {
                      this.creatorField = value;
                  }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class metadataType {
              private string nameField;
              private string descField;
              private personType authorField;
              private copyrightType copyrightField;
              private linkType[] linkField;
              private System.DateTime timeField;
              private bool timeFieldSpecified;
              private string keywordsField;
              private boundsType boundsField;
              private extensionsType extensionsField;
              /// <remarks/>
              public string name {
                  get { return this.nameField; }
                  set { this.nameField = value; }
              }
              public string desc {
                  get { return this.descField; }
                  set { this.descField = value; }
              }
              public personType author {
                  get { return this.authorField; }
                  set { this.authorField = value; }
              }
              public copyrightType copyright {
                  get { return this.copyrightField; }
                  set { this.copyrightField = value; }
              }
              [System.Xml.Serialization.XmlElementAttribute("link")]
              public linkType[] link {
                  get { return this.linkField; }
                  set { this.linkField = value; }
              }
              public System.DateTime time {
                  get { return this.timeField; }
                  set { this.timeField = value; }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool timeSpecified {
                  get { return this.timeFieldSpecified; }
                  set { this.timeFieldSpecified = value; }
              }
              public string keywords {
                  get { return this.keywordsField; }
                  set { this.keywordsField = value; }
              }
              public boundsType bounds {
                  get { return this.boundsField; }
                  set { this.boundsField = value; }
              }
              public extensionsType extensions {
                  get { return this.extensionsField; }
                  set { this.extensionsField = value; }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class personType {
              private string nameField;
              private emailType emailField;
              private linkType linkField;
              /// <remarks/>
              public string name {
                  get {
                      return this.nameField;
                  }
                  set {
                      this.nameField = value;
                  }
              }
              /// <remarks/>
              public emailType email {
                  get {
                      return this.emailField;
                  }
                  set {
                      this.emailField = value;
                  }
              }
              /// <remarks/>
              public linkType link {
                  get {
                      return this.linkField;
                  }
                  set {
                      this.linkField = value;
                  }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class emailType {
              private string idField;
              private string domainField;
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public string id {
                  get { return this.idField; }
                  set { this.idField = value; }
              }
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public string domain {
                  get { return this.domainField; }
                  set { this.domainField = value; }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class trksegType {
              private wptType[] trkptField;
              private extensionsType extensionsField;
              [System.Xml.Serialization.XmlElementAttribute("trkpt")]
              public wptType[] trkpt {
                  get { return this.trkptField; }
                  set { this.trkptField = value; }
              }
              public extensionsType extensions {
                  get { return this.extensionsField; }
                  set { this.extensionsField = value; }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class wptType {
              private decimal eleField;
              private bool eleFieldSpecified;
              private System.DateTime timeField;
              private bool timeFieldSpecified;
              private decimal magvarField;
              private bool magvarFieldSpecified;
              private decimal geoidheightField;
              private bool geoidheightFieldSpecified;
              private string nameField;
              private string cmtField;
              private string descField;
              private string srcField;
              private linkType[] linkField;
              private string symField;
              private string typeField;
              private fixType fixField;
              private bool fixFieldSpecified;
              private string satField;
              private decimal hdopField;
              private bool hdopFieldSpecified;
              private decimal vdopField;
              private bool vdopFieldSpecified;
              private decimal pdopField;
              private bool pdopFieldSpecified;
              private decimal ageofdgpsdataField;
              private bool ageofdgpsdataFieldSpecified;
              private string dgpsidField;
              private extensionsType extensionsField;
              private decimal latField;
              private decimal lonField;
              public decimal ele {
                  get { return this.eleField; }
                  set { this.eleField = value; }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool eleSpecified {
                  get { return this.eleFieldSpecified; }
                  set { this.eleFieldSpecified = value; }
              }
              public System.DateTime time {
                  get { return this.timeField; }
                  set { this.timeField = value; }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool timeSpecified {
                  get { return this.timeFieldSpecified; }
                  set { this.timeFieldSpecified = value; }
              }
              public decimal magvar
              {
                  get { return this.magvarField; }
                  set { this.magvarField = value; }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool magvarSpecified {
                  get { return this.magvarFieldSpecified; }
                  set { this.magvarFieldSpecified = value; }
              }
              public decimal geoidheight {
                  get { return this.geoidheightField; }
                  set { this.geoidheightField = value; }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool geoidheightSpecified {
                  get { return this.geoidheightFieldSpecified; }
                  set { this.geoidheightFieldSpecified = value; }
              }
              public string name {
                  get { return this.nameField; }
                  set { this.nameField = value; }
              }
              public string cmt
              {
                  get { return this.cmtField; }
                  set { this.cmtField = value; }
              }
              public string desc {
                  get { return this.descField; }
                  set { this.descField = value; }
              }
              public string src {
                  get { return this.srcField; }
                  set { this.srcField = value; }
              }
              [System.Xml.Serialization.XmlElementAttribute("link")]
              public linkType[] link {
                  get { return this.linkField; }
                  set { this.linkField = value; }
              }
              public string sym
              {
                  get { return this.symField; }
                  set { this.symField = value; }
              }
              public string type {
                  get { return this.typeField; }
                  set { this.typeField = value; }
              }
              public fixType fix {
                  get { return this.fixField; }
                  set { this.fixField = value; }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool fixSpecified {
                  get { return this.fixFieldSpecified; }
                  set { this.fixFieldSpecified = value; }
              }
              [System.Xml.Serialization.XmlElementAttribute(DataType="nonNegativeInteger")]
              public string sat {
                  get { return this.satField; }
                  set { this.satField = value; }
              }
              public decimal hdop {
                  get { return this.hdopField; }
                  set { this.hdopField = value; }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool hdopSpecified {
                  get { return this.hdopFieldSpecified; }
                  set { this.hdopFieldSpecified = value; }
              }
              public decimal vdop {
                  get { return this.vdopField; }
                  set { this.vdopField = value; }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool vdopSpecified {
                  get { return this.vdopFieldSpecified; }
                  set { this.vdopFieldSpecified = value; }
              }
              public decimal pdop {
                  get { return this.pdopField; }
                  set { this.pdopField = value;
                  }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool pdopSpecified {
                  get { return this.pdopFieldSpecified; }
                  set { this.pdopFieldSpecified = value; }
              }
              public decimal ageofdgpsdata {
                  get { return this.ageofdgpsdataField; }
                  set { this.ageofdgpsdataField = value;
                  }
              }
              [System.Xml.Serialization.XmlIgnoreAttribute()]
              public bool ageofdgpsdataSpecified {
                  get {return this.ageofdgpsdataFieldSpecified; }
                  set { this.ageofdgpsdataFieldSpecified = value; }
              }
              [System.Xml.Serialization.XmlElementAttribute(DataType="integer")]
              public string dgpsid {
                  get { return this.dgpsidField; }
                  set { this.dgpsidField = value; }
              }
              public extensionsType extensions {
                  get { return this.extensionsField; }
                  set { this.extensionsField = value; }
              }
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public decimal lat {
                  get { return this.latField; }
                  set { this.latField = value; }
              }
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public decimal lon {
                  get { return this.lonField; }
                  set { this.lonField = value; }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class linkType {
              private string textField;
              private string typeField;
              private string hrefField;
              public string text {
                  get {
                      return this.textField;
                  }
                  set {
                      this.textField = value;
                  }
              }
              public string type {
                  get {
                      return this.typeField;
                  }
                  set {
                      this.typeField = value;
                  }
              }
              [System.Xml.Serialization.XmlAttributeAttribute(DataType="anyURI")]
              public string href {
                  get {
                      return this.hrefField;
                  }
                  set {
                      this.hrefField = value;
                  }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public enum fixType {
              none,
              [System.Xml.Serialization.XmlEnumAttribute("2d")]
              Item2d,
              [System.Xml.Serialization.XmlEnumAttribute("3d")]
              Item3d,
              dgps,
              pps,
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class extensionsType {
              private System.Xml.XmlElement[] anyField;
              [System.Xml.Serialization.XmlAnyElementAttribute()]
              public System.Xml.XmlElement[] Any {
                  get {
                      return this.anyField;
                  }
                  set {
                      this.anyField = value;
                  }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class trkType {
              private string nameField;
              private string cmtField;
              private string descField;
              private string srcField;
              private linkType[] linkField;
              private string numberField;
              private string typeField;
              private extensionsType extensionsField;
              private trksegType[] trksegField;
              public string name {
                  get {
                      return this.nameField;
                  }
                  set {
                      this.nameField = value;
                  }
              }
              public string cmt {
                  get {
                      return this.cmtField;
                  }
                  set {
                      this.cmtField = value;
                  }
              }
              public string desc {
                  get {
                      return this.descField;
                  }
                  set {
                      this.descField = value;
                  }
              }
              public string src {
                  get {
                      return this.srcField;
                  }
                  set {
                      this.srcField = value;
                  }
              }
              [System.Xml.Serialization.XmlElementAttribute("link")]
              public linkType[] link {
                  get {
                      return this.linkField;
                  }
                  set {
                      this.linkField = value;
                  }
              }
              [System.Xml.Serialization.XmlElementAttribute(DataType="nonNegativeInteger")]
              public string number {
                  get {
                      return this.numberField;
                  }
                  set {
                      this.numberField = value;
                  }
              }
              public string type {
                  get {
                      return this.typeField;
                  }
                  set {
                      this.typeField = value;
                  }
              }
              public extensionsType extensions {
                  get {
                      return this.extensionsField;
                  }
                  set {
                      this.extensionsField = value;
                  }
              }
              [System.Xml.Serialization.XmlElementAttribute("trkseg")]
              public trksegType[] trkseg {
                  get {
                      return this.trksegField;
                  }
                  set {
                      this.trksegField = value;
                  }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class rteType {
              private string nameField;
              private string cmtField;
              private string descField;
              private string srcField;
              private linkType[] linkField;
              private string numberField;
              private string typeField;
              private extensionsType extensionsField;
              private wptType[] rteptField;
              public string name {
                  get {
                      return this.nameField;
                  }
                  set {
                      this.nameField = value;
                  }
              }
              public string cmt {
                  get {
                      return this.cmtField;
                  }
                  set {
                      this.cmtField = value;
                  }
              }
              public string desc {
                  get {
                      return this.descField;
                  }
                  set {
                      this.descField = value;
                  }
              }
              public string src {
                  get {
                      return this.srcField;
                  }
                  set {
                      this.srcField = value;
                  }
              }
              [System.Xml.Serialization.XmlElementAttribute("link")]
              public linkType[] link {
                  get {
                      return this.linkField;
                  }
                  set {
                      this.linkField = value;
                  }
              }
              [System.Xml.Serialization.XmlElementAttribute(DataType="nonNegativeInteger")]
              public string number {
                  get {
                      return this.numberField;
                  }
                  set {
                      this.numberField = value;
                  }
              }
              public string type {
                  get {
                      return this.typeField;
                  }
                  set {
                      this.typeField = value;
                  }
              }
              public extensionsType extensions {
                  get {
                      return this.extensionsField;
                  }
                  set {
                      this.extensionsField = value;
                  }
              }
              [System.Xml.Serialization.XmlElementAttribute("rtept")]
              public wptType[] rtept {
                  get {
                      return this.rteptField;
                  }
                  set {
                      this.rteptField = value;
                  }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.topografix.com/GPX/1/1")]
          public partial class boundsType
          {
              private decimal minlatField;
              private decimal minlonField;
              private decimal maxlatField;
              private decimal maxlonField;
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public decimal minlat
              {
                  get
                  {
                      return this.minlatField;
                  }
                  set
                  {
                      this.minlatField = value;
                  }
              }
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public decimal minlon
              {
                  get
                  {
                      return this.minlonField;
                  }
                  set
                  {
                      this.minlonField = value;
                  }
              }
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public decimal maxlat
              {
                  get
                  {
                      return this.maxlatField;
                  }
                  set
                  {
                      this.maxlatField = value;
                  }
              }
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public decimal maxlon
              {
                  get
                  {
                      return this.maxlonField;
                  }
                  set
                  {
                      this.maxlonField = value;
                  }
              }
          }
          [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")]
          [System.SerializableAttribute()]
          [System.Diagnostics.DebuggerStepThroughAttribute()]
          [System.ComponentModel.DesignerCategoryAttribute("code")]
          [System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.topografix.com/GPX/1/1")]
          public partial class copyrightType {
              private string yearField;
              private string licenseField;
              private string authorField;
              /// <remarks/>
              [System.Xml.Serialization.XmlElementAttribute(DataType="gYear")]
              public string year {
                  get {
                      return this.yearField;
                  }
                  set {
                      this.yearField = value;
                  }
              }
              [System.Xml.Serialization.XmlElementAttribute(DataType="anyURI")]
              public string license {
                  get {
                      return this.licenseField;
                  }
                  set {
                      this.licenseField = value;
                  }
              }
              [System.Xml.Serialization.XmlAttributeAttribute()]
              public string author {
                  get {
                      return this.authorField;
                  }
                  set {
                      this.authorField = value;
                  }
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        当您有很多 xml 元素要解析并且有可用的架构时,大多数情况下最好反序列化以解析数据。

        所以我去了您的 xml (http://www.topografix.com/GPX/1/1) 中的架构网站,并通过将部分粘贴到标题中并进行一些附加编辑来创建下面的架构,以获得正确的结果。大多数情况下,网站都有完整的架构。这个网站没有。

        <?xml version="1.0" encoding="utf-8"?>
        <xsd:schema id="XMLSchema1"
            targetNamespace="http://www.topografix.com/GPX/1/1"
            elementFormDefault="qualified"
            xmlns="http://www.topografix.com/GPX/1/1"
            xmlns:xml="http://www.w3.org/XML/1998/namespace"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        
          <xsd:element name="gpx" type="gpxType"/>
          <xsd:complexType name="metadataType">
            <xsd:sequence>
              <!-- elements must appear in this order -->
              <xsd:element name="name" type="xsd:string" minOccurs="0"/>
              <xsd:element name="desc" type="xsd:string" minOccurs="0"/>
              <xsd:element name="author" type="personType" minOccurs="0"/>
              <xsd:element name="copyright" type="copyrightType" minOccurs="0"/>
              <xsd:element name="link" type="linkType" minOccurs="0" maxOccurs="unbounded"/>
              <xsd:element name="time" type="xsd:dateTime" minOccurs="0"/>
              <xsd:element name="keywords" type="xsd:string" minOccurs="0"/>
              <xsd:element name="bounds" type="boundsType" minOccurs="0"/>
              <xsd:element name="extensions" type="extensionsType" minOccurs="0"/>
            </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="gpxType">
            <xsd:sequence>
              <xsd:element name="metadata" type="metadataType" minOccurs="0"/>
              <xsd:element name="wpt" type="wptType" minOccurs="0" maxOccurs="unbounded"/>
              <xsd:element name="rte" type="rteType" minOccurs="0" maxOccurs="unbounded"/>
              <xsd:element name="trk" type="trkType" minOccurs="0" maxOccurs="unbounded"/>
              <xsd:element name="extensions" type="extensionsType" minOccurs="0"/>
            </xsd:sequence>
            <xsd:attribute name="version" type="xsd:string" use="required" fixed="1.1"/>
            <xsd:attribute name="creator" type="xsd:string" use="required"/>
          </xsd:complexType>
          <xsd:complexType name="wptType">
            <xsd:sequence>
              <!-- elements must appear in this order -->
              <!-- Position info -->
              <xsd:element name="ele" type="xsd:decimal" minOccurs="0"/>
              <xsd:element name="time" type="xsd:dateTime" minOccurs="0"/>
              <xsd:element name="magvar" type="degreesType" minOccurs="0"/>
              <xsd:element name="geoidheight" type="xsd:decimal" minOccurs="0"/>
              <!-- Description info -->
              <xsd:element name="name" type="xsd:string" minOccurs="0"/>
              <xsd:element name="cmt" type="xsd:string" minOccurs="0"/>
              <xsd:element name="desc" type="xsd:string" minOccurs="0"/>
              <xsd:element name="src" type="xsd:string" minOccurs="0"/>
              <xsd:element name="link" type="linkType" minOccurs="0" maxOccurs="unbounded"/>
              <xsd:element name="sym" type="xsd:string" minOccurs="0"/>
              <xsd:element name="type" type="xsd:string" minOccurs="0"/>
              <!-- Accuracy info -->
              <xsd:element name="fix" type="fixType" minOccurs="0"/>
              <xsd:element name="sat" type="xsd:nonNegativeInteger" minOccurs="0"/>
              <xsd:element name="hdop" type="xsd:decimal" minOccurs="0"/>
              <xsd:element name="vdop" type="xsd:decimal" minOccurs="0"/>
              <xsd:element name="pdop" type="xsd:decimal" minOccurs="0"/>
              <xsd:element name="ageofdgpsdata" type="xsd:decimal" minOccurs="0"/>
              <xsd:element name="dgpsid" type="dgpsStationType" minOccurs="0"/>
              <xsd:element name="extensions" type="extensionsType" minOccurs="0"/>
            </xsd:sequence>
            <xsd:attribute name="lat" type="latitudeType" use="required"/>
            <xsd:attribute name="lon" type="longitudeType" use="required"/>
          </xsd:complexType>
          <xsd:complexType name="rteType">
            <xsd:sequence>
              <xsd:element name="name" type="xsd:string" minOccurs="0"/>
              <xsd:element name="cmt" type="xsd:string" minOccurs="0"/>
              <xsd:element name="desc" type="xsd:string" minOccurs="0"/>
              <xsd:element name="src" type="xsd:string" minOccurs="0"/>
              <xsd:element name="link" type="linkType" minOccurs="0" maxOccurs="unbounded"/>
              <xsd:element name="number" type="xsd:nonNegativeInteger" minOccurs="0"/>
              <xsd:element name="type" type="xsd:string" minOccurs="0"/>
              <xsd:element name="extensions" type="extensionsType" minOccurs="0"/>
              <xsd:element name="rtept" type="wptType" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="trkType">
            <xsd:sequence>
              <xsd:element name="name" type="xsd:string" minOccurs="0"/>
              <xsd:element name="cmt" type="xsd:string" minOccurs="0"/>
              <xsd:element name="desc" type="xsd:string" minOccurs="0"/>
              <xsd:element name="src" type="xsd:string" minOccurs="0"/>
              <xsd:element name="link" type="linkType" minOccurs="0" maxOccurs="unbounded"/>
              <xsd:element name="number" type="xsd:nonNegativeInteger" minOccurs="0"/>
              <xsd:element name="type" type="xsd:string" minOccurs="0"/>
              <xsd:element name="extensions" type="extensionsType" minOccurs="0"/>
              <xsd:element name="trkseg" type="trksegType" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="extensionsType">
            <xsd:sequence>
              <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="trksegType">
            <xsd:sequence>
              <!-- elements must appear in this order -->
              <xsd:element name="trkpt" type="wptType" minOccurs="0" maxOccurs="unbounded"/>
              <xsd:element name="extensions" type="extensionsType" minOccurs="0"/>
            </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="copyrightType">
            <xsd:sequence>
              <!-- elements must appear in this order -->
              <xsd:element name="year" type="xsd:gYear" minOccurs="0"/>
              <xsd:element name="license" type="xsd:anyURI" minOccurs="0"/>
            </xsd:sequence>
            <xsd:attribute name="author" type="xsd:string" use="required"/>
          </xsd:complexType>
          <xsd:complexType name="linkType">
            <xsd:sequence>
              <!-- elements must appear in this order -->
              <xsd:element name="text" type="xsd:string" minOccurs="0"/>
              <xsd:element name="type" type="xsd:string" minOccurs="0"/>
            </xsd:sequence>
            <xsd:attribute name="href" type="xsd:anyURI" use="required"/>
          </xsd:complexType>
          <xsd:complexType name="emailType">
            <xsd:attribute name="id" type="xsd:string" use="required"/>
            <xsd:attribute name="domain" type="xsd:string" use="required"/>
          </xsd:complexType>
          <xsd:complexType name="personType">
            <xsd:sequence>
              <!-- elements must appear in this order -->
              <xsd:element name="name" type="xsd:string" minOccurs="0"/>
              <xsd:element name="email" type="emailType" minOccurs="0"/>
              <xsd:element name="link" type="linkType" minOccurs="0"/>
            </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="ptType">
            <xsd:sequence>
              <!-- elements must appear in this order -->
              <xsd:element name="ele" type="xsd:decimal" minOccurs="0"/>
              <xsd:element name="time" type="xsd:dateTime" minOccurs="0"/>
            </xsd:sequence>
            <xsd:attribute name="lat" type="latitudeType" use="required"/>
            <xsd:attribute name="lon" type="longitudeType" use="required"/>
          </xsd:complexType>
          <xsd:complexType name="ptsegType">
            <xsd:sequence>
              <!-- elements must appear in this order -->
              <xsd:element name="pt" type="ptType" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="boundsType">
            <xsd:attribute name="minlat" type="latitudeType" use="required"/>
            <xsd:attribute name="minlon" type="longitudeType" use="required"/>
            <xsd:attribute name="maxlat" type="latitudeType" use="required"/>
            <xsd:attribute name="maxlon" type="longitudeType" use="required"/>
          </xsd:complexType>
          <xsd:simpleType name="latitudeType">
            <xsd:restriction base="xsd:decimal">
              <xsd:minInclusive value="-90.0"/>
              <xsd:maxInclusive value="90.0"/>
            </xsd:restriction>
          </xsd:simpleType>
          <xsd:simpleType name="longitudeType">
            <xsd:restriction base="xsd:decimal">
              <xsd:minInclusive value="-180.0"/>
              <xsd:maxExclusive value="180.0"/>
            </xsd:restriction>
          </xsd:simpleType>
          <xsd:simpleType name="degreesType">
            <xsd:restriction base="xsd:decimal">
              <xsd:minInclusive value="0.0"/>
              <xsd:maxExclusive value="360.0"/>
            </xsd:restriction>
          </xsd:simpleType>
          <xsd:simpleType name="fixType">
            <xsd:restriction base="xsd:string">
              <xsd:enumeration value="none"/>
              <xsd:enumeration value="2d"/>
              <xsd:enumeration value="3d"/>
              <xsd:enumeration value="dgps"/>
              <xsd:enumeration value="pps"/>
            </xsd:restriction>
          </xsd:simpleType>
          <xsd:simpleType name="dgpsStationType">
            <xsd:restriction base="xsd:integer">
              <xsd:minInclusive value="0"/>
              <xsd:maxInclusive value="1023"/>
            </xsd:restriction>
          </xsd:simpleType>
        
        
        </xsd:schema>
        

        然后我使用了 msdn xsd 工具 (https://www.microsoft.com/en-us/download/details.aspx?id=19988)。我从 cmd.exe > xsd.exe /c /l:cs gps.xsd

        使用了以下命令行

        然后我将 xsd 工具中的 cs 代码粘贴到我的项目中,并在第二个答案中使用以下代码进行反序列化

        【讨论】:

        • 感谢 jdweng 的帮助,但这些对我来说是帖子中的许多新功能术语。我需要一些时间来理解这些。感谢您的详细回答和指导。
        猜你喜欢
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-01
        • 2012-06-09
        • 2010-09-12
        • 2014-07-28
        相关资源
        最近更新 更多