在Windows 7中对来自世界银行的xml数据进行Xml解析

时间:2012-04-23 15:45:35

标签: xml windows-phone-7

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

                }

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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);
    });