2013-03-30 2 views
0

Я все еще участвую в работе с XML и C#.XML C# - попытка получить список элементов из XML-документа

Я искал много мест о том, как заставить это работать должным образом, но я пока не могу решить это, и мне было интересно, может ли кто-нибудь увидеть, где я ошибаюсь? Я пытаюсь получить список, содержащий значения узлов для расстояния и продолжительности для двух отдельных случаев. Сначала должна быть только одна пара, которая представляет собой общую пару dist/duration:/DirectionsResponse/route/leg/distance/value, затем я пытаюсь получить второй список, который будет содержать версию шагов:/DirectionsResponse/route/leg/шаги/расстояние/значение. Если я смогу получить вторую, я смогу разобраться в первой.

Большое спасибо Jaie

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(); 

    } 
} 

ответ

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.

Надеюсь, это поможет.

+0

Удивительный! Большое спасибо atom.gregg. Он отлично работает сейчас :) – Jaie

Смежные вопросы