2012-11-15 262 views
0

我正在尝试阅读这段XML。阅读XML属性

http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/xml/351352?res=3hourly&key=99b9f578-ad3d-446c-9d29-0bbee028b483

我不知道我怎么可能只读与价值= “2012-11-15Z”

所以下面的一个节点期:

这是我使用的代码

using (XmlReader reader = XmlReader.Create("http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/xml/351352?res=3hourly&key=99b9f578-ad3d-446c-9d29-0bbee028b483")) 
    { 
     reader.MoveToContent(); 
     while (reader.Read()) 
     { 
      if (reader.NodeType == XmlNodeType.Element 
       && reader.Name == "Period") 
      { 
       while (reader.Read()) 
       { 
        if (reader.NodeType == XmlNodeType.Element && 
         reader.Name == "Rep") 
        { 
         first.Text = reader.GetAttribute("T"); 
        } 
       } 


      } 
     } 
    } 

什么是我只读这个节点?

我应该写

if (reader.NodeType == XmlNodeType.Element && reader.Name == "Period" && reader.GetAttribute("value") == "2012-11-15Z")

这似乎并没有工作..

有人能帮助我吗?

回答

2

您可以轻松地做到这一点与LINQ到XML:

XDocument xdoc = XDocument.Load(path_to_xml); 
var period = xdoc.Descendants("Period") 
       .Where(p => (string)p.Attribute("value") == "2012-11-15Z") 
       .SingleOrDefault(); 

它将返回的XElement,但您可以从期限选择的任何数据。例如。 T属性:

List<int> tList = xdoc.Descendants("Period") 
         .Where(p => (string)p.Attribute("value") == "2012-11-15Z") 
         .SelectMany(p => p.Elements()) 
         .Select(rep => (int)rep.Attribute("T")) 
         .ToList(); 

var query = xdoc.Descendants("Period") 
       .Where(p => (string)p.Attribute("value") == "2012-11-15Z") 
       .SelectMany(p => p.Elements()) 
       .Select(rep => new { 
         T = (int)rep.Attribute("T"), 
         D = (string)rep.Attribute("D") }) 
       .ToList(); 

末的查询将与整型属性T和字符串属性D返回强类型的匿名对象的名单:

foreach(var x in query) 
    // use x.T and x.D 
+0

那么我将如何获得属性“T”?因为这是返回所有的值,如360 570 720等。 – Kiwimoisi

+0

@Demipouce看到更新的答案。它将返回'List ',其中包含选定时间段内所有“Rep”元素的'T'属性的值。 *顺便说一句*似乎xpath要慢http://blog.dreamlabsolutions.com/post/2008/12/04/LINQ-to-XML-and-LINQ-to-XML-with-XPath-performance-review.aspx –

+0

好吧 !我看到了,对不起,我刚刚在关于这些属性的时刻有点困惑。 因此,它返回我可以用作普通列表的列表? – Kiwimoisi

0

尝试使用XPath来查找这样

XmlDocument doc = new XmlDocument(); 
using (XmlReader reader = XmlReader.Create("http://datapoint.metoffice.gov.uk/public/data/val/wxfcs/all/xml/351352?res=3hourly&key=99b9f578-ad3d-446c-9d29-0bbee028b483")) 
{ 
    doc.Load(reader); 
    XmlNodeList list = doc.SelectNodes("//Period[@value='2012-11-15Z']"); 
    Console.WriteLine(list.Count); 
}