2012-09-11 3 views
0

하여 XmlTextReader와 XML의 하위 요소 가져 오기 :내가 XML 다음 한

<UpsHistory> 
<UpsSettings> 
    <Filename>modbusevent.xml</Filename> 
    <FileDate>04.02.1970</FileDate> 
    <FileTime>00:05:39</FileTime> 
    <Type>ENERTRONIC I 3-3 20kVA</Type> 
    <Location></Location> 
    <Phases>3</Phases> 
    <UpsContact> 
    <Company></Company> 
    <Department></Department> 
    <Contact></Contact> 
    <City></City> 
    <Street></Street> 
    <Phone></Phone> 
    </UpsContact> 
</UpsSettings> 
<UpsData id="1"> 
    <Date>09.08.2012</Date> 
    <Time>12:05:53.52</Time> 
    <EventCode>574</EventCode> 
    <EventState>A</EventState> 
    <EventText><![CDATA[IGBT - DRIVERBOARD FAILURE]]></EventText> 
    <EventAction>/upsexe.cgi?cmd=2003&amp;p1=574&amp;reload=/mbevents.cgi&amp;wait=5</EventAction> 
</UpsData> 
<UpsData id="2"> 
    <Date>09.08.2012</Date> 
    <Time>11:23:08.88</Time> 
    <EventCode>606</EventCode> 
    <EventState>E</EventState> 
    <EventText><![CDATA[BYPASS VOLTAGE FAILURE]]></EventText> 
    <EventAction>/upsexe.cgi?cmd=2003&amp;p1=606&amp;reload=/mbevents.cgi&amp;wait=5</EventAction> 
</UpsData> 
<UpsData id="3"> 
    <Date>09.08.2012</Date> 
    <Time>11:23:07.06</Time> 
    <EventCode>1000</EventCode> 
    <EventState>E</EventState> 
    <EventText><![CDATA[CUSTOMER RELAY 1 ON]]></EventText> 
    <EventAction>/upsexe.cgi?cmd=2003&amp;p1=1000&amp;reload=/mbevents.cgi&amp;wait=5</EventAction> 
</UpsData> 
<UpsData id="4"> 
    <Date>09.08.2012</Date> 
    <Time>11:23:06.97</Time> 
    <EventCode>1003</EventCode> 
    <EventState>E</EventState> 
    <EventText><![CDATA[CUSTOMER RELAY 2 OFF]]></EventText> 
    <EventAction>/upsexe.cgi?cmd=2003&amp;p1=1003&amp;reload=/mbevents.cgi&amp;wait=5</EventAction> 
</UpsData> 

... 

<UpsData id="602"> 
    <Date>08.09.2012</Date> 
    <Time>11:06:13.84</Time> 
    <EventCode>606</EventCode> 
    <EventState>E</EventState> 
    <EventText><![CDATA[BYPASS VOLTAGE FAILURE]]></EventText> 
    <EventAction>/upsexe.cgi?cmd=2003&amp;p1=606&amp;reload=/mbevents.cgi&amp;wait=5</EventAction> 
</UpsData> 
</UpsHistory> 

내가 자식 요소의 값을 갖는 모든 UpsData 요소를 싶어,하지만 난 단지 UpsData 요소 ID response.GetResponseStream());

XmlTextReader rdr = new XmlTextReader(sw); 
          while (rdr.Read()) 
          { 
           if (rdr.IsStartElement()) 
           { 
            if (rdr.NodeType == XmlNodeType.Element) 
            { 
             if (rdr.Name == "UpsData") 
             { 
              rdr.MoveToAttribute("id"); 
              if (rdr.Name == "Date") 
              { 
               ConsoleInfo(rdr.Value); 
              } 
             } 
            } 
           } 
          } 

어떻게 하위 요소 값을 가져올 수 있습니까? 감사!

+0

XML 입력 크기가 특정 임계 값보다 작을 것이라는 것을 알고 있다면 이것은 XmlReader보다 "XmlDocument"에 더 적합한 작업처럼 보입니다. DOM 메소드를 사용하면 훨씬 쉽게 처리 할 수 ​​있습니다. –

+0

및 기타 하위 요소의 데이터를 가져 오는 방법은 무엇입니까? – amaranth

답변

0

XmlDocument 또는 XmlPathNagivator을 사용할 수있는 경우 XPath를 고려하십시오. 예를 들어 :

using System.Xml; 

... 

XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.LoadXml(xml); 
foreach (XmlNode xmlNode in 
    xmlDocument.DocumentElement.SelectNodes("UpsData/@id[/*]")) 
{ 
    // Do something, for example: 
    Console.Out.WriteLine("Value: " + xmlNode.Value); 
} 

는 XPath "UpsData/@id[/*]"는 소위 "UpsData"의 자식 노드와 자녀가하고 "ID"속성을 반환에 "ID"속성을 찾아 말했다.

+0

더 빠른 readng XML을 위해 XmlReader를 사용하고 싶습니다. – amaranth

+0

@amaranth 더 빠르지 만 더 많은 개발 비용과 시간이 소요됩니다. XML 파일이 작 으면 (몇백 K 이하) XmlDocument 또는 XmlPathNagivator로 이동하십시오. 아시다시피 XmlReader는 앞으로 만 진행되므로 UpsData 요소를 찾아 ID 특성 값을 가져온 다음 앞으로 이동하여 자식이 있는지 확인해야합니다. – akton