2012-11-15 196 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); 
}