2012-04-23 53 views
0

這在Windows 7解析的XML數據的鏈接,我的XML數據的Xml世界銀行

http://api.worldbank.org/countries/IND/indicators/EN.ATM.CO2E.PC?per_page=10&date=2005:2012

我用下面的代碼來分析它並顯示,但未能如願。

public void Getinfo() 
    { 
     try 
     { 
      String url = http://api.worldbank.org/countries/IND/indicators/EN.ATM.CO2E.PC?per_page=10&date=2005:2012"; 
      WebClient wc = new WebClient(); 
      wc.OpenReadCompleted += wc_OpenReadCompleted; 
      wc.OpenReadAsync(new Uri(url)); 



     } 
     catch (Exception) 
     { 
      MessageBox.Show("Please retry unable to access Data"); 

     } 
    } 
    private void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
      MessageBox.Show(e.Error + ""); 
      return; 
     } 
     using (Stream s = e.Result) 
     { 
      XDocument doc = XDocument.Load(s); 
      XNamespace wb = "http://www.worldbank.org"; 

      foreach (var node in doc.Element(wb+"data").Element(wb+"data").Elements(wb+"date")) 
      { 
       String chk = node.Value.ToString(); 
       String year1 = "2007"; 
       if (chk == year1) 
       { 
        foreach (var node1 in doc.Element(wb+"data").Element(wb+"data").Elements(wb+"value")) 
        { 
         info1.Text = node1.Value.ToString(); 
        } 

       } 
+0

實際問題是什麼?說你不能這樣做不會有太多的事情要繼續下去。 – 2012-04-23 15:48:21

+0

我無法訪問xml文件中的所有值。我只能訪問第一個。 – 2012-04-23 16:51:57

回答

0

的問題來自於您的LINQ的要求:

你在這裏做什麼:

你拿第一數據元素,那麼在再次採取先數據元以前,然後你在所有的日期在那第二個數據元素。

data --> enter here 
-- data --> then here 
-- -- date --> and take all the date element in the parent data node 
       (but there is only one date element per data) 
-- data 
-- -- date 

你想要做的是:

採取一切數據元素在第二級,但不採取全要素,每個數據只是第日期元素元素。

foreach (var date in doc.Element(wb + "data").Elements(wb + "data").Select(data => data.Element(wb + "date"))) 
{ 
    ... 
} 

你想達到什麼是不明確的,對我來說那麼如果你需要元素在同一數據元素,也許沒有必要只返回日期

另外,你爲什麼使用第二個foreach語句?再次,您將只收到一個請求的元素。我想你想要做的是這樣的事情:

foreach (var node in doc.Element(wb + "data").Elements(wb + "data")) 
{ 
    if("2007".Equals(node.Element(wb + "date").Value){ 
     info1.Text = node.Element(wb + "value").Value; 
    } 
} 
0

在您嘗試獲取數據時,有幾件事缺少。首先是使用名稱空間。這通過各種元素進行解析,並從2007年開始獲得。

這不是一個1代替你的代碼,但它是爲了告訴你如何遍歷樹。希望這會讓你指向正確的方向。

XDocument doc = XDocument.Load(@"C:\temp\wb.xml"); 

var ns = XNamespace.Get("http://www.worldbank.org"); 

// Get the root element 
var root = doc.Element(ns.GetName("data")); 

//Get a collection of the elements underneath the root that are called "data" 
var elements = root.Elements(ns.GetName("data")); 

//Select only those that are from 2007 
var selectedElements = elements.Where(e=>e.Element(ns.GetName("date")).Value.Equals("2007")); 

//Iterate through each one 
selectedElements.ToList().ForEach(x=> 
    { 
     var val = decimal.Parse(x.Element(ns.GetName("value")).Value); 
     System.Diagnostics.Debug.WriteLine("Value is: {0}", val); 
    });