0

httpwebrequest 経由で取得した XML フィードがありますが、過去にこれを試したときとは異なり、フィードの解析に問題があります。これまでのところ、URL 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();
           }

私はそれを理解することにとても近づいているように感じます。

4

3 に答える 3

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();
}
于 2012-06-24T00:48:20.393 に答える
0

XML ファイルを解析するには多くの方法があります。簡単なアプローチの 1 つを次に示します。

        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
}
于 2012-06-24T00:41:00.127 に答える
0

使用できるものは次のとおりです。

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.
  }
}

最後にリストを呼び出し、インデックスに基づいてすべてのアイテムを取得できます。

于 2012-06-24T00:53:55.133 に答える