【问题标题】:Need help parsing XML feed in Windows Phone需要帮助在 Windows Phone 中解析 XML 提要
【发布时间】:2012-06-24 00:23:23
【问题描述】:

我有一个通过 httpwebrequest 检索到的 XML 提要,但我在解析提要时遇到了问题,因为它与我过去尝试过的时间不同。到目前为止我有网址 http://webservices.nextbus.com/service/publicXMLFeed?command=routeConfig&a=sf-muni&r=N

我保存在里面

 XDocument doc = XDocument.Parse(feedString);

而且我知道,当我出于调试目的将所有内容转储到列表框中时,我得到了所有内容,只是在解析提要时遇到了问题:

<body copyright="All data copyright San Francisco Muni 2012.">
<route tag="N" title="N-Judah" color="003399" oppositeColor="ffffff" latMin="37.7601699" latMax="37.7932299" lonMin="-122.5092" lonMax="-122.38798">
<stop tag="5240" title="King St & 4th St" lat="37.7760599" lon="-122.39436"   stopId="15240"/>
<stop tag="5237" title="King St & 2nd St" lat="37.7796199" lon="-122.38982" stopId="15237"/>
<stop tag="7145" title="The Embarcadero & Brannan St" lat="37.7846299" lon="-122.38798" stopId="17145"/>
<stop tag="4510" title="Embarcadero Folsom St" lat="37.7907499" lon="-122.3898399" stopId="14510"/>
<stop tag="5629" title="Tunnel Entry Point Inbound Nea" lat="37.79279" lon="-122.39126" stopId="15629"/>

等等等等

我想将每个停止标记中的每个属性存储到一个数组中,但我完全不知道如何开始。

谢谢

更新: 我想我可以在第一个 msdn 链接上使用它,但这只是第一行:

 using (XmlReader reader = XmlReader.Create(new StringReader(feed)))
        {
            reader.ReadToFollowing("stop");
            reader.MoveToFirstAttribute();
            string tag = reader.Value;


            reader.MoveToNextAttribute();
            string title = reader.Value;

            reader.MoveToNextAttribute();
            string lat = reader.Value;

            reader.MoveToNextAttribute();
            string lon = reader.Value;


        }

如何使用上面的代码循环遍历每个站点?

谢谢

编辑:#2

这个循环有效,但一直显示第一行停止属性:

using (XmlReader reader = XmlReader.Create(new StringReader(feed)))
           {
               reader.ReadToFollowing("stop");
               while (reader.MoveToNextAttribute())
               {

               // Move the reader back to the element node.



                   //reader.ReadToFollowing("stop");
                   reader.MoveToFirstAttribute();
                   string tag = reader.Value;
                   MessageBox.Show(tag);

                   reader.MoveToNextAttribute();
                   string title = reader.Value;
                   MessageBox.Show(title);
                   reader.MoveToNextAttribute();
                   string lat = reader.Value;
                   MessageBox.Show(lat);
                   reader.MoveToNextAttribute();
                   string lon = reader.Value;
                   MessageBox.Show(lon);


               }
               reader.MoveToElement();
           }

我觉得我很接近弄明白了。

【问题讨论】:

标签: c# xml linq windows-phone-7 httpwebrequest


【解决方案1】:

这是一个借助 Linq 的完整解决方案。看看result 包含什么

using (WebClient w = new WebClient())
{
    string xml = w.DownloadString("http://webservices.nextbus.com/service/publicXMLFeed?command=routeConfig&a=sf-muni&r=N");
    XDocument xDoc = XDocument.Parse(xml);
    var result = xDoc.Descendants("stop")
                    .Select(n => new
                    {
                        Tag = (string)n.Attribute("tag"),
                        Title = (string)n.Attribute("title"),
                        Lat = (string)n.Attribute("lat"),
                        Lon = (string)n.Attribute("lon"),
                        StopId = (string)n.Attribute("stopId")
                    })
                    .ToArray();
}

【讨论】:

    【解决方案2】:

    这里有一些你可以使用的东西:

    XmlReader xmlReader = XmlReader.Create("http://webservices.nextbus.com/service/publicXMLFeed?   command=routeConfig&a=sf-muni&r=N");
    List<string> aTitle= new List<string>();
    
    // Add as many as attributes you have in your "stop" element
    
    while (xmlReader.Read())
    {
     //keep reading until we see your element
     if (xmlReader.Name.Equals("stop") && (xmlReader.NodeType == XmlNodeType.Element))
     {
       string title = xmlReader.GetAttribute("title");
       aTitle.Add(title);
    
       // Add code for all other attribute you would want to store in list.
      }
    }
    

    最后调用列表,根据索引可以得到所有项目。

    【讨论】:

      【解决方案3】:

      解析 XML 文件的方法有很多种。这是一种简单的方法:

              XDocument doc = XDocument.Load(feedString);
              var stops = doc.Document.Descendants(XName.Get("route"));
              // Loop over all stops in the XML
              foreach (var stop in stops)
              {
      
              }
      

      我不确定“将每个停止标记中的每个属性存储到一个数组中”是什么意思,但我会定义一个类型:

      class RouteStop
      {   // make setters private and init them in ctor to make it immutable
          public string Tag {get; set;} //maybe int ?
          public string Title {get; set;}
          public double Latitude {get; set;}
          public double Longitude {get; set;}
          public int ID {get; set;}
      }
      

      然后定义一个RouteStop列表

      List<RouteStop> routeStops = new List<RouteStop>();
      

      简单地在 foreach 循环中创建对象

      foreach (var stop in stops)
      {
          var tag = stop.Attribute("tag").Value;
          var title = stop.Attribute("title").Value;
          var long = double.Parse(stop.Attribute("lon").Value, 
                                  CultureInfo.InvariantCulture);
          //etc
          routeStops.add(new RouteStop() { Tag = tag } //and so on
      }
      

      【讨论】:

      • 啊,谢谢,这行得通。但我认为你需要“停止”而不是“路线”。
      • Bleh,我收到了该代码引发的异常。我说得太早了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      相关资源
      最近更新 更多