private const string xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
<root-environment id=""0"" name=""House"">
<environment id=""3"" name=""First Floor"">
<environment id=""1"" name=""Kitchen""/>
<environment id=""2"" name=""Living Room""/>
<environment id=""4"" name=""Second Floor"">
<environment id=""5"" name=""Bathroom""/>
<environment id=""6"" name=""Bedroom""/>
<application id=""0"" name=""Table"" environmentId=""1"" categoryId=""1"" category=""lights"" channelId=""0"" channel=""ON - OFF light"" >
<group id=""1"" name=""Group"">
<group-address address=""0x0C01"" flags=""W"" >
<dpt id=""1.001"" name=""DPT_Switch"" format=""B1"" /> <!-- vimarId not present, it is a standard datapoint -->
<dptx id=""1"" name=""DPTx_OnOff""/>
<group-address address=""0x0EC9"" flags=""RT"" >
<dpt id=""1.001"" name=""DPT_Switch"" format=""B1"" /> <!-- vimarId not present, it is a standard datapoint -->
<dptx id=""75"" name=""DPTx_OnOffInfo""/>
<application id=""1"" name=""Thermostat"" environmentId=""6"" categoryId=""4"" category=""climate control"" channelId=""2"" channel=""Heating and Air Conditioning"">
<group id=""1"" name=""Thermostat Group"">
<group-address address=""0x0C3F"" flags=""W"" >
<dpt id=""20.102"" vimarId=""60000.60076"" name=""DPT_Vimar_HVACMode"" format=""N8"" /> <!-- vimarId present, it is a custom datapoint, id is the nearest one -->
<dptx id=""212"" name=""DPTx_HvacMode""/>
<group-address address=""0x0C40"" flags=""RT"" >
<dpt id=""20.102"" vimarId=""60000.60076"" name=""DPT_Vimar_HVACMode"" format=""N8"" /> <!-- vimarId present, it is a custom datapoint, id is the nearest one -->
<dptx id=""213"" name=""DPTx_HvacModeInfo""/>
<group-address address=""0x0C41"" flags=""W"" >
<dpt id=""9.001"" name=""DPT_Value_Temp"" format=""F16"" /> <!-- vimarId not present, it is a standard datapoint -->
<dptx id=""214"" name=""DPTx_TemperatureSetpoint1""/>
<group-address address=""0x0C42"" flags=""RT"" >
<dpt id=""9.001"" name=""DPT_Value_Temp"" format=""F16"" /> <!-- vimarId not present, it is a standard datapoint -->
<dptx id=""215"" name=""DPTx_TemperatureSetpointInfo1""/>
<group id=""2"" name=""Output Group 2"">
<group-address address=""0x0C6A"" flags=""T"" >
<dpt id=""1.001"" name=""DPT_Switch"" format=""B1"" /> <!-- vimarId not present, it is a standard datapoint -->
<dptx id=""1"" name=""DPTx_OnOff""/>
<group-address address=""0x0C6B"" flags=""T"" >
<dpt id=""5.010"" vimarId=""60000.60083"" name=""DPT_Vimar_Fancoil_2T"" format=""U8"" /> <!-- vimarId present, it is a custom datapoint, id is the nearest one -->
<dptx id=""248"" name=""DPTx_Fancoil2Pipes""/>
public static void Main() {
XmlTextReader reader = null;
Console.Write("===========================================================================\n");
Console.Write("================================== XPath ===============================\n");
Console.Write("===========================================================================\n");
XmlDocument doc = new XmlDocument();
doc.Load(new System.IO.StringReader(xml));
XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes(".//environment");
Console.Write("XmlNodeList: {0} environments\n", nodes.Count);
foreach (XmlNode node in nodes) {
Console.Write("XmlNode: {0} id={1} name={2}\n", node.Name, node.Attributes["id"].Value, node.Attributes["name"].Value);