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