0

这是我的 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();
                    }

                }
4

2 回答 2

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")))
{
    ...
}

我不清楚您想要实现的目标,但是如果您需要同一数据元素中的value元素,则可能不需要仅返回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;
    }
}
于 2012-04-23T19:14:14.897 回答
0

您尝试获取数据时缺少一些东西。第一个是您对命名空间的使用。这会解析各种元素,并像您一样从 2007 年获得一个。

这不是您的代码的一对一替换,但它旨在向您展示如何遍历树。希望这将为您指明正确的方向。

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);
    });
于 2012-04-23T20:13:13.813 回答