C# 使用XmlTextReader获取XML的子元素
我有以下XML:C# 使用XmlTextReader获取XML的子元素,c#,xml,xml-parsing,C#,Xml,Xml Parsing,我有以下XML: <UpsHistory> <UpsSettings> <Filename>modbusevent.xml</Filename> <FileDate>04.02.1970</FileDate> <FileTime>00:05:39</FileTime> <Type>ENERTRONIC I 3-3 20kVA</Type> <Loca
<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&p1=574&reload=/mbevents.cgi&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&p1=606&reload=/mbevents.cgi&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&p1=1000&reload=/mbevents.cgi&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&p1=1003&reload=/mbevents.cgi&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&p1=606&reload=/mbevents.cgi&wait=5</EventAction>
</UpsData>
</UpsHistory>
如何获取子元素值?谢谢 < P>如果您可以使用或考虑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”属性。如果您知道XML输入的大小将低于某个阈值,这似乎比XmlReader
更适合XmlDocument
的工作。DOM方法将使这变得更容易。如何获取和其他子元素的数据?@amaranth它速度更快,但开发成本和时间要多得多。如果XML文件很小(几百K或更少),请选择XmlDocument或XmlPathNagivator。正如您所知,XmlReader只是向前的,因此您需要找到UpsData元素,获取ID属性值,然后向前移动以检查它是否有子元素。
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);
}