2012-09-11 31 views
0

我有以下XML XML的子元素:獲取與XmlTextReader的

<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:

流SW = CopyAndClose( 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

如果您可以使用XmlDocumentXmlPathNagivator,請考慮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

我想使用XmlReader來獲得更快的readng XML。 – amaranth

+0

@amaranth它速度更快,但開發成本和時間明顯更多。如果XML文件很小(幾百K或更小),請使用XmlDocument或XmlPathNagivator。如你所知,XmlReader只是向前的,所以你需要找到UpsData元素,獲取ID屬性值,然後向前移動以檢查它是否有子節點。 – akton