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リクエストに起因します。

ここで何をしているのか:

最初のデータ要素を取得し、次に前のデータ要素の最初のデータ要素を取得し、次にその2番目のデータ要素のすべての日付を取得します。

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

あなたがしたいことは:

2番目のレベルですべてのデータ要素を取得しますが、要素全体を取得するのではなく、各データ要素の最初の日付要素のみを取得します。

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

達成したいことは私にはわかりませんが、同じデータ要素にvalue要素が必要な場合は、日付だけを返す必要はないかもしれません。

また、なぜ2番目のforeachステートメントを使用するのですか?繰り返しになりますが、そのリクエストで受け取る要素は1つだけです。私はあなたがしたいことはこのようなものだと思います:

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

データを取得しようとすると、そこに欠けていることがいくつかあります。1つ目は、名前空間の使用です。これはさまざまな要素を解析し、あなたが持っているように2007年のものを取得します。

これは、コードを1対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);
    });
于 2012-04-23T20:13:13.813 に答える