0

私はまだ XML と C# を使って作業することを学んでいます。

これを適切に機能させる方法について多くの場所を見てきましたが、まだこれを解決できず、どこが間違っているのか誰かがわかるかどうか疑問に思っていましたか? 2 つの別々の機会の距離と期間のノード値を含むリストを取得しようとしています。最初は合計距離/期間のペアである 1 つのペアだけである必要があります: /DirectionsResponse/route/leg/distance/value、次にステップ バージョンを含む 2 番目のリストを取得しようとしています: /DirectionsResponse/route/leg/ステップ/距離/値。もし私が2番目のものを機能させることができれば、最初のものを理解することができます.

どうもありがとう

public class MyNode
    {
        public string Distance { get; set; }
        public string Duration { get; set; }        
    }

public class Program
{
    static void Main(string[] args)
    {
        //The full URI
        //http://maps.googleapis.com/maps/api/directions/xml?`enter code here`origin=Sydney+australia&destination=Melbourne+Australia&sensor=false

        //refer: https://developers.google.com/maps/documentation/webservices/
        string originAddress = "Canberra+Australia";
        string destinationAddress = "sydney+Australia";
        StringBuilder url = new StringBuilder();
        //http://maps.googleapis.com/maps/api/directions/xml?
        //different request format to distance API
        url.Append("http://maps.googleapis.com/maps/api/directions/xml?");
        url.Append(string.Format("origin={0}&", originAddress));
        url.Append(string.Format("destination={0}", destinationAddress));
        url.Append("&sensor=false&departure_time=1343605500&mode=driving");

        WebRequest request = HttpWebRequest.Create(url.ToString());

        var response = request.GetResponse();
        var stream = response.GetResponseStream();
        XDocument xdoc = XDocument.Load(stream);

        List<MyNode> routes =
            (from route in xdoc.Descendants("steps")
             select new MyNode
             {
                 Duration = route.Element("duration").Value,
                 Distance = route.Element("distance").Value,
             }).ToList<MyNode>();

        foreach (MyNode route in routes)
        {
            Console.WriteLine("Duration = {0}", route.Duration);
            Console.WriteLine("Distance = {0}", route.Distance);
        }

        stream.Dispose();

    }
}
4

1 に答える 1

0

私はあなたがなりたい場所にかなり近づいていると思います。少しデバッグするだけで一線を越えてしまうでしょう。

これは、LinqPad でまとめたものの小さなスニペットです。これを使用して、コードにコミットする前にスクラッチを使用します。

var origin = "Canberra+Australia";
var dest = "sydney+Australia";
var baseUrl = "http://maps.googleapis.com/maps/api/directions/xml?origin={0}&destination={1}&sensor=false&departure_time=1343605500&mode=driving";

var req = string.Format(baseUrl, origin, dest);
var resp = new System.Net.WebClient().DownloadString(req);
var doc = XDocument.Parse(resp);

var total = doc.Root.Element("route").Element("leg").Element("distance").Element("value").Value;
total.Dump();

var steps = (from row in doc.Root.Element("route").Element("leg").Elements("step")
             select new 
             { 
                Duration = row.Element("duration").Element("value").Value,
                Distance = row.Element("distance").Element("value").Value
             }).ToList();
steps.Dump();

Dump メソッドは結果を LinqPad の結果に吐き出します。歩数の結果には 16 項目のリストがあり、合計距離は 286372 の値でした。

お役に立てれば。

于 2013-03-30T10:30:38.120 に答える