2012-11-15 3 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는 업데이트 된 답변을 참조하십시오. 선택된주기의 모든'Rep' 요소의'T' 속성 값을 포함하는'List '을 반환합니다. * BTW *는 xpath가 느린 것 같습니다. http://blog.dreamlabsolutions.com/post/2008/12/04/LINQ-to-XML-and-LINQ-to-XML-with-XPath-performance-review.aspx –

+0

괜찮아 ! 나는 잠시이 속성들에 대해 조금 혼란스러워서 미안해. 그래서 정상적인 목록으로 사용할 수있는 목록이 나에게 돌아온다. – Kiwimoisi

0

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); 
} 
같은 값을 조회하는 XPath를 사용해보십시오