Csharp/CSharp Tutorial/XML/XPath — различия между версиями

Материал из .Net Framework эксперт
Перейти к: навигация, поиск
м (1 версия)
 
м (1 версия)
 
(нет различий)

Текущая версия на 15:17, 26 мая 2010

Содержание

Append child from XPathNavigator

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath;

   public class MainClass
   {
       public static void Main()
       {
           XmlDocument doc;
           XPathNavigator editor2;
           XmlWriter writer;
           doc = new XmlDocument();
           doc.Load("pubs.xml");
           foreach(XPathNavigator editor in doc.CreateNavigator().Select("/pubs/titles[authors/@au_lname="Green"]"))
           {
               editor2 = editor.SelectSingleNode("authors[@au_lname!="Green"]");
               if (editor2!=null) editor2.DeleteSelf();
               
               writer = editor.AppendChild();
               writer.WriteStartElement("authors");
               writer.WriteAttributeString("au_lname", "A");
               writer.WriteAttributeString("au_fname", "B");
               writer.Close();
           }
           doc.Save("output.xml");
       }
   }</source>

Append new node to XPathNavigator

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath;

   public class MainClass
   {
       public static void Main()
       {
           XmlDocument doc;
           XPathNavigator editor2;
           XmlWriter writer;
           doc = new XmlDocument();
           doc.Load("pubs.xml");
           doc.CreateNavigator().Select("/pubs/titles[authors/@au_lname="Green"]");
           foreach(XPathNavigator editor in doc.CreateNavigator().Select("/pubs/titles[authors/@au_lname="Green"]"))
           {
               editor2 = editor.SelectSingleNode("authors[@au_lname!="Green"]");
               if (editor2!=null) editor2.DeleteSelf();
               writer = editor.AppendChild();
               writer.WriteStartElement("authors");
               writer.WriteAttributeString("au_lname", "A");
               writer.WriteAttributeString("au_fname", "B");
               writer.Close();
           }
           doc.Save("output.xml");
       }
   }</source>

Compile XPath to create XPathExpression

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath;

   public class MainClass
   {
       public static void Main()
       {
           
           XPathDocument doc = new XPathDocument(Application.StartupPath + @"\employees.xml");
           XPathNavigator navigator = doc.CreateNavigator();
           XPathExpression expression = navigator.rupile("xpath");
           XPathNodeIterator iterator = navigator.Select(expression);
           try
           {
               Console.WriteLine("The expressions returned " + iterator.Count + " nodes");
               if (iterator.Count > 0)
               {
                   while (iterator.MoveNext())
                   {
                       Console.WriteLine(iterator.Current.OuterXml);
                   }
               }
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }
       }
   }</source>

Create XPathNavigator

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath;

   public class MainClass
   {
       public static void Main()
       {
           XPathNavigator navigator = null;
           XmlDocument doc = new XmlDocument();
           doc.Load(Application.StartupPath + @"/employees.xml");
           navigator = doc.CreateNavigator();
           //XPathDocument doc = new XPathDocument(Application.StartupPath + @"/employees.xml");
           //navigator = doc.CreateNavigator();
       }
   }</source>

Move to first child in XPathNavigator

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath;

   public class MainClass
   {
       public static void Main()
       {
          
           XPathDocument doc=new XPathDocument(Application.StartupPath + @"\employees.xml");
           XPathNavigator navigator = doc.CreateNavigator();
           XPathNavigator result=navigator.SelectSingleNode(@"employees/employee[@employeeid=1]");
           result.MoveToFirstChild();
           do
           {
               switch (result.Name)
               {
                   case "firstname":
                       Console.WriteLine(result.Value);
                       break;
                   case "lastname":
                       Console.WriteLine(result.Value);
                       break;
                   case "homephone":
                       Console.WriteLine(result.Value);
                       break;
                   case "notes":
                       Console.WriteLine(result.Value);
                       break;
               }
               
           }
           while (result.MoveToNext());
       }
   }</source>

Read sub tree from XPathNavigator

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath;

   public class MainClass
   {
       public static void Main()
       {
           XPathDocument doc=new XPathDocument(Application.StartupPath + @"\employees.xml");
           XPathNavigator navigator = doc.CreateNavigator();
           navigator.MoveToRoot();
           navigator.MoveToFirstChild();
           while (navigator.MoveToNext())
           {
               navigator.MoveToFirstChild();
               do
               {
                   string id = navigator.GetAttribute("employeeid", "");
                   if (id == "1")
                   {
                       XmlReader reader=navigator.ReadSubtree();
                       DisplayDetails(reader);
                   }
               }
               while (navigator.MoveToNext());
           }
       }
       private static void DisplayDetails(XmlReader reader)
       {
           while (reader.Read())
           {
               if (reader.NodeType == XmlNodeType.Element)
               {
                   switch (reader.Name)
                   {
                       case "firstname":
                           Console.WriteLine(reader.ReadString());
                           break;
                       case "lastname":
                           Console.WriteLine(reader.ReadString());
                           break;
                       case "homephone":
                           Console.WriteLine(reader.ReadString());
                           break;
                       case "notes":
                           Console.WriteLine(reader.ReadString());
                           break;
                   }
               }
           }
           reader.Close();
       }
   }</source>

Select All Author Nodes

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; public class MainClass {

   public static void Main()
   {
       XmlDocument mDocument = new XmlDocument();
       XmlNode mCurrentNode;
       mDocument.Load("XPathQuery.xml");
       mCurrentNode = mDocument.DocumentElement.SelectSingleNode("//books");
       XmlNodeList nodeList = mCurrentNode.SelectNodes("//book/author");
       DisplayList(nodeList);
   }
   static void DisplayList(XmlNodeList nodeList)
   {
       foreach (XmlNode node in nodeList)
       {
           RecurseXmlDocumentNoSiblings(node);
       }
   }
   static void RecurseXmlDocumentNoSiblings(XmlNode root)
   {
       if (root is XmlElement)
       {
           Console.WriteLine(root.Name);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
       }
       else if (root is XmlText)
       {
           string text = ((XmlText)root).Value;
           Console.WriteLine(text);
       }
       else if (root is XmlComment)
       {
           string text = root.Value;
           Console.WriteLine(text);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
       }
   }
   static void RecurseXmlDocument(XmlNode root)
   {
       if (root is XmlElement)
       {
           Console.WriteLine(root.Name);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
           if (root.NextSibling != null)
               RecurseXmlDocument(root.NextSibling);
       }
       else if (root is XmlText)
       {
           string text = ((XmlText)root).Value;
           Console.WriteLine(text);
       }
       else if (root is XmlComment)
       {
           string text = root.Value;
           Console.WriteLine(text);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
           if (root.NextSibling != null)
               RecurseXmlDocument(root.NextSibling);
       }
   }

}</source>

Select All Books

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; public class MainClass {

   public static void Main()
   {
       XmlDocument mDocument = new XmlDocument();
       XmlNode mCurrentNode;
       mDocument.Load("XPathQuery.xml");
       mCurrentNode = mDocument.DocumentElement;
       XmlNodeList nodeList = mCurrentNode.SelectNodes("//book");
       DisplayList(nodeList);
   }
   static void DisplayList(XmlNodeList nodeList)
   {
       foreach (XmlNode node in nodeList)
       {
           RecurseXmlDocumentNoSiblings(node);
       }
   }
   static void RecurseXmlDocumentNoSiblings(XmlNode root)
   {
       if (root is XmlElement)
       {
           Console.WriteLine(root.Name);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
       }
       else if (root is XmlText)
       {
           string text = ((XmlText)root).Value;
           Console.WriteLine(text);
       }
       else if (root is XmlComment)
       {
           string text = root.Value;
           Console.WriteLine(text);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
       }
   }
   static void RecurseXmlDocument(XmlNode root)
   {
       if (root is XmlElement)
       {
           Console.WriteLine(root.Name);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
           if (root.NextSibling != null)
               RecurseXmlDocument(root.NextSibling);
       }
       else if (root is XmlText)
       {
           string text = ((XmlText)root).Value;
           Console.WriteLine(text);
       }
       else if (root is XmlComment)
       {
           string text = root.Value;
           Console.WriteLine(text);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
           if (root.NextSibling != null)
               RecurseXmlDocument(root.NextSibling);
       }
   }

}</source>

Select All Child Nodes

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; public class MainClass {

   public static void Main()
   {
       XmlDocument mDocument = new XmlDocument();
       XmlNode mCurrentNode;
       mDocument.Load("XPathQuery.xml");
       mCurrentNode = mDocument.DocumentElement;
       XmlNodeList nodeList = mCurrentNode.SelectNodes("*");
       DisplayList(nodeList);
   }
   static void DisplayList(XmlNodeList nodeList)
   {
       foreach (XmlNode node in nodeList)
       {
           RecurseXmlDocumentNoSiblings(node);
       }
   }
   static void RecurseXmlDocumentNoSiblings(XmlNode root)
   {
       if (root is XmlElement)
       {
           Console.WriteLine(root.Name);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
       }
       else if (root is XmlText)
       {
           string text = ((XmlText)root).Value;
           Console.WriteLine(text);
       }
       else if (root is XmlComment)
       {
           string text = root.Value;
           Console.WriteLine(text);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
       }
   }
   static void RecurseXmlDocument(XmlNode root)
   {
       if (root is XmlElement)
       {
           Console.WriteLine(root.Name);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
           if (root.NextSibling != null)
               RecurseXmlDocument(root.NextSibling);
       }
       else if (root is XmlText)
       {
           string text = ((XmlText)root).Value;
           Console.WriteLine(text);
       }
       else if (root is XmlComment)
       {
           string text = root.Value;
           Console.WriteLine(text);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
           if (root.NextSibling != null)
               RecurseXmlDocument(root.NextSibling);
       }
   }

}</source>

Select node with asterisk

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; public class MainClass {

   public static void Main()
   {
       XmlDocument mDocument = new XmlDocument();
       XmlNode mCurrentNode;
       mDocument.Load("XPathQuery.xml");
       mCurrentNode = mDocument.DocumentElement;
       XmlNodeList nodeList = mCurrentNode.SelectNodes("*");
       DisplayList(nodeList);
   }
   static void DisplayList(XmlNodeList nodeList)
   {
       foreach (XmlNode node in nodeList)
       {
           RecurseXmlDocumentNoSiblings(node);
       }
   }
   static void RecurseXmlDocumentNoSiblings(XmlNode root)
   {
       if (root is XmlElement)
       {
           Console.WriteLine(root.Name);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
       }
       else if (root is XmlText)
       {
           string text = ((XmlText)root).Value;
           Console.WriteLine(text);
       }
       else if (root is XmlComment)
       {
           string text = root.Value;
           Console.WriteLine(text);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
       }
   }
   static void RecurseXmlDocument(XmlNode root)
   {
       if (root is XmlElement)
       {
           Console.WriteLine(root.Name);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
           if (root.NextSibling != null)
               RecurseXmlDocument(root.NextSibling);
       }
       else if (root is XmlText)
       {
           string text = ((XmlText)root).Value;
           Console.WriteLine(text);
       }
       else if (root is XmlComment)
       {
           string text = root.Value;
           Console.WriteLine(text);
           if (root.HasChildNodes)
               RecurseXmlDocument(root.FirstChild);
           if (root.NextSibling != null)
               RecurseXmlDocument(root.NextSibling);
       }
   }

}</source>

Select XPath from XPathNavigator

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.XPath;

   public class Customer
   {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string EmailAddress { get; set; }
       public override string ToString()
       {
           return string.Format("{0} {1}\nEmail:   {2}",FirstName, LastName, EmailAddress);
       }
   }
   public class Tester
   {
       static void Main()
       {
           List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
           XmlDocument customerXml = new XmlDocument();
           XmlElement rootElem = customerXml.CreateElement("Customers");
           customerXml.AppendChild(rootElem);
           foreach (Customer customer in customers)
           {
               XmlElement customerElem = customerXml.CreateElement("Customer");
               XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
               firstNameAttr.Value = customer.FirstName;
               customerElem.Attributes.Append(firstNameAttr);
               XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
               lastNameAttr.Value = customer.LastName;
               customerElem.Attributes.Append(lastNameAttr);
               XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
               emailAddress.InnerText = customer.EmailAddress;
               customerElem.AppendChild(emailAddress);
               rootElem.AppendChild(customerElem);
           }
           XPathNavigator nav = customerXml.CreateNavigator();
           string xPath = "descendant::Customer[starts-with(@LastName, "G") and contains(EmailAddress, "a.ru")]";
           XPathNodeIterator iter = nav.Select(xPath);
           if (iter.Count > 0)
           {
               while (iter.MoveNext())
                   Console.WriteLine(iter.Current.OuterXml);
           }
           else
               Console.WriteLine("Customer not found");
       }
   }</source>

Set new value through XPathNavigator

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml;

   public class MainClass
   {
       public static void Main()
       {
           XmlDocument doc;
           System.Xml.XPath.XPathNavigator editor;
           doc = new XmlDocument();
           doc.Load("pubs.xml");
           editor = doc.CreateNavigator().SelectSingleNode("/pubs/publishers[@pub_id="0736"]/@pub_name");
           editor.SetValue("new");
           doc.Save("output.xml");
       }
   }</source>

Show innter xml and outer xml from XPathNavigator

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath;

   public class MainClass
   {
       public static void Main()
       {
           XPathDocument doc=new XPathDocument(Application.StartupPath + @"\employees.xml");
           XPathNavigator navigator = doc.CreateNavigator();
           navigator.MoveToRoot();
           navigator.MoveToFirstChild();
           while (navigator.MoveToNext())
           {
               MessageBox.Show(navigator.InnerXml);
               MessageBox.Show(navigator.OuterXml);
           }
       }
   }</source>

Sorting XPathExpression with XmlSortOrder.Ascending, XmlCaseOrder.None

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.XPath;

   public class Customer
   {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string EmailAddress { get; set; }
       public override string ToString()
       {
           return string.Format("{0} {1}\nEmail:   {2}",FirstName, LastName, EmailAddress);
       }
   }
   public class Tester
   {
       static void Main()
       {
           List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
           XmlDocument customerXml = new XmlDocument();
           XmlElement rootElem = customerXml.CreateElement("Customers");
           customerXml.AppendChild(rootElem);
           foreach (Customer customer in customers)
           {
               XmlElement customerElem = customerXml.CreateElement("Customer");
               XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
               firstNameAttr.Value = customer.FirstName;
               customerElem.Attributes.Append(firstNameAttr);
               XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
               lastNameAttr.Value = customer.LastName;
               customerElem.Attributes.Append(lastNameAttr);
               XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
               emailAddress.InnerText = customer.EmailAddress;
               customerElem.AppendChild(emailAddress);
               rootElem.AppendChild(customerElem);
           }
           XPathNavigator nav = customerXml.CreateNavigator();
           string xPath = "descendant::Customer[starts-with(@LastName, "G") and contains(EmailAddress, "a.ru")]";
           XPathNodeIterator iter = nav.Select(xPath);
           XPathExpression expr2 = nav.rupile(xPath);
           expr2.AddSort("@FirstName", XmlSortOrder.Ascending, XmlCaseOrder.None, string.Empty, XmlDataType.Text);
           iter = nav.Select(expr2);
           while (iter.MoveNext())
               Console.WriteLine(iter.Current.OuterXml);
               
       }
   }</source>

Using XPathExpression to sort by first name

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.XPath;

   public class Customer
   {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string EmailAddress { get; set; }
       public override string ToString()
       {
           return string.Format("{0} {1}\nEmail:   {2}",FirstName, LastName, EmailAddress);
       }
   }
   public class Tester
   {
       static void Main()
       {
           List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
           XmlDocument customerXml = new XmlDocument();
           XmlElement rootElem = customerXml.CreateElement("Customers");
           customerXml.AppendChild(rootElem);
           foreach (Customer customer in customers)
           {
               XmlElement customerElem = customerXml.CreateElement("Customer");
               XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
               firstNameAttr.Value = customer.FirstName;
               customerElem.Attributes.Append(firstNameAttr);
               XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
               lastNameAttr.Value = customer.LastName;
               customerElem.Attributes.Append(lastNameAttr);
               XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
               emailAddress.InnerText = customer.EmailAddress;
               customerElem.AppendChild(emailAddress);
               rootElem.AppendChild(customerElem);
           }
           XPathNavigator nav = customerXml.CreateNavigator();
           string xPath = "descendant::Customer[starts-with(@LastName, "G") and contains(EmailAddress, "a.ru")]";
           XPathNodeIterator iter = nav.Select(xPath);
           XPathExpression expr = nav.rupile(xPath);
           expr.AddSort("@FirstName", Comparer<String>.Default);
           iter = nav.Select(expr);
           while (iter.MoveNext())
               Console.WriteLine(iter.Current.OuterXml);
       }
   }</source>

Using XPathNavigator to loop through code

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Xml.XPath;

   public class Customer
   {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string EmailAddress { get; set; }
       public override string ToString()
       {
           return string.Format("{0} {1}\nEmail:   {2}",FirstName, LastName, EmailAddress);
       }
   }
   public class Tester
   {
       static void Main()
       {
           List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
           XmlDocument customerXml = new XmlDocument();
           XmlElement rootElem = customerXml.CreateElement("Customers");
           customerXml.AppendChild(rootElem);
           foreach (Customer customer in customers)
           {
               XmlElement customerElem = customerXml.CreateElement("Customer");
               XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
               firstNameAttr.Value = customer.FirstName;
               customerElem.Attributes.Append(firstNameAttr);
               XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
               lastNameAttr.Value = customer.LastName;
               customerElem.Attributes.Append(lastNameAttr);
               XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
               emailAddress.InnerText = customer.EmailAddress;
               customerElem.AppendChild(emailAddress);
               rootElem.AppendChild(customerElem);
           }
           XPathNavigator nav = customerXml.CreateNavigator();
           string xPath = "descendant::Customer[@FirstName="D"]";
           XPathNavigator navNode = nav.SelectSingleNode(xPath);
           if (navNode != null)
           {
               Console.WriteLine(navNode.OuterXml);
               XmlElement elem = navNode.UnderlyingObject as XmlElement;
               if (elem != null)
                   Console.WriteLine(elem.OuterXml);
               else
                   Console.WriteLine("Found the wrong node!");
           }
           else
               Console.WriteLine("Customer not found");
       }
   }</source>

Using XPathNodeIterator

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath;

   public class MainClass
   {
       public static void Main()
       {
           XPathDocument doc = new XPathDocument(Application.StartupPath + @"\employees.xml");
           XPathNavigator navigator = doc.CreateNavigator();
           XPathNodeIterator iterator=navigator.Select("your input");
           try
           {
               Console.WriteLine("The expressions returned " + iterator.Count + " nodes");
               if (iterator.Count > 0)
               {
                   while (iterator.MoveNext())
                   {
                       Console.WriteLine(iterator.Current.OuterXml);
                   }
               }
           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.Message);
           }
       }
   }</source>

Using XPath to filter data from Database

<source lang="csharp">using System; using System.Data; using System.Data.SqlClient; using System.Xml; using System.IO; public class XPathSearch {

   private static string connectionString = "Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI";
   public static void Main() 
   {
       string SQL = "SELECT CategoryID, CategoryName, Description FROM Categories";
       SqlConnection con = new SqlConnection(connectionString);
       SqlCommand com = new SqlCommand(SQL, con);
       SqlDataAdapter adapter = new SqlDataAdapter(com);
       DataSet ds = new DataSet("Northwind");
       con.Open();
       adapter.FillSchema(ds, SchemaType.Mapped, "Categories");
       adapter.Fill(ds, "Categories");
       con.Close();
       XmlDataDocument dataDoc = new XmlDataDocument(ds);
       string XPath;
       XPath = @"//Categories[starts-with(child::CategoryName, "A")]";
       XmlNodeList nodes = dataDoc.DocumentElement.SelectNodes(XPath);
       foreach (XmlNode node in nodes)
       {
           foreach (XmlNode child in node.ChildNodes)
           {
               Console.WriteLine(child.InnerText);
           }
        }
   }

}</source>

Xpath Demo: //attribute[@name="capacity"] | //attribute[@name="weight"]

<source lang="csharp">using System; using System.Xml; using System.Collections.Generic; using System.Text;

   class Program
   {
       static void Main(string[] args)
       {
           XmlDocument docItems = new XmlDocument();
           docItems.Load("items.xml");
           XmlNodeList cw = docItems.SelectNodes("//attribute[@name="capacity"] | //attribute[@name="weight"]");
           Console.WriteLine("Heavy Items (descendant axis predicate):");
       }
   }</source>

Xpath Demo: /items/item

<source lang="csharp">using System; using System.Xml; using System.Collections.Generic; using System.Text;

   class Program
   {
       static void Main(string[] args)
       {
           XmlDocument docItems = new XmlDocument();
           docItems.Load("items.xml");
           XmlNodeList allItems = docItems.SelectNodes("/items/item");
           Console.WriteLine("Found {0} items", allItems.Count);
       }
   }</source>

Xpath Demo: /items/item[2]

<source lang="csharp">using System; using System.Xml; using System.Collections.Generic; using System.Text;

   class Program
   {
       static void Main(string[] args)
       {
           XmlDocument docItems = new XmlDocument();
           docItems.Load("items.xml");
           XmlNode thirdItem = docItems.SelectSingleNode("/items/item[2]");
           Console.WriteLine("Third node is {0}", thirdItem.Attributes["name"].Value);
       }
   }</source>

Xpath Demo: /items/item/attribute[@value > 10 and @name="weight"]

<source lang="csharp">using System; using System.Xml; using System.Collections.Generic; using System.Text;

   class Program
   {
       static void Main(string[] args)
       {
           XmlDocument docItems = new XmlDocument();
           docItems.Load("items.xml");
           XmlNodeList heavyAttribs = docItems.SelectNodes("/items/item/attribute[@value > 10 and @name="weight"]");
           foreach (XmlNode heavyAttrib in heavyAttribs)
           {
               Console.WriteLine(heavyAttrib.ParentNode.Attributes["name"].Value);
           }
       }
   }</source>

XPath Navigator

<source lang="csharp">using System; using System.Xml.XPath;

 class XPathNavigatorSample {
   [STAThread]
   static void Main(string[] args) {
     XPathDocument xpathDocument = new XPathDocument("../../sample.xml");
     XPathNavigator xpathNavigator = xpathDocument.CreateNavigator();
     xpathNavigator.MoveToRoot();
     NavigateTree(xpathNavigator);
   }
   private static void NavigateTree (XPathNavigator xpathNavigator) {
     if (xpathNavigator.HasChildren) {
       xpathNavigator.MoveToFirstChild();
       DisplayNode(xpathNavigator);
       NavigateTree(xpathNavigator);
       while (xpathNavigator.MoveToNext()) {
         DisplayNode(xpathNavigator);
         NavigateTree(xpathNavigator);
       }
       xpathNavigator.MoveToParent();
     }
   }
   private static void DisplayNode (XPathNavigator xpathNavigator) {
     if (xpathNavigator.NodeType == XPathNodeType.Text) {
       Console.Out.WriteLine(xpathNavigator.Value);
     } else {
       Console.Out.Write(xpathNavigator.Name);
       if (xpathNavigator.HasAttributes) {
         int attributesCount = 1;
         while (xpathNavigator.MoveToNextAttribute()) {
           attributesCount ++;
         }
         Console.Out.Write(attributesCount);
         if (attributesCount != 1) {
           xpathNavigator.MoveToParent();
         }
       }
     }
   }
 }</source>

XPathNavigator and TreeView

<source lang="csharp">using System; using System.Collections.Generic; using System.ruponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.Xml.XPath;

   public class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       private void Form1_Load(object sender, EventArgs e)
       {
       }
       private void button1_Click(object sender, EventArgs e)
       {
           XPathDocument doc = new XPathDocument(Application.StartupPath + @"\employees.xml");
           XPathNavigator navigator = doc.CreateNavigator();
           navigator.MoveToRoot();
           navigator.MoveToFirstChild();
           TreeNode root = treeView1.Nodes.Add("Employees");
           while (navigator.MoveToNext())
           {
               if (navigator.HasChildren)
               {
                   navigator.MoveToFirstChild();
                   do
                   {
                       string id = navigator.GetAttribute("employeeid", "");
                       TreeNode empnode = new TreeNode("Employee ID :" + id);
                       root.Nodes.Add(empnode);
                       navigator.MoveToFirstChild();
                       do
                       {
                           string name = navigator.Name;
                           TreeNode node = new TreeNode(name + " : " + navigator.Value);
                           empnode.Nodes.Add(node);
                       }
                       while (navigator.MoveToNext());
                       navigator.MoveToParent();
                   }
                   while (navigator.MoveToNext());
               }
           }
       }
       private void InitializeComponent()
       {
           this.button1 = new System.Windows.Forms.Button();
           this.treeView1 = new System.Windows.Forms.TreeView();
           this.SuspendLayout();
           // 
           // button1
           // 
           this.button1.Location = new System.Drawing.Point(120, 224);
           this.button1.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
           this.button1.Name = "button1";
           this.button1.Size = new System.Drawing.Size(100, 28);
           this.button1.TabIndex = 0;
           this.button1.Text = "Load Tree";
           this.button1.UseVisualStyleBackColor = true;
           this.button1.Click += new System.EventHandler(this.button1_Click);
           // 
           // treeView1
           // 
           this.treeView1.Dock = System.Windows.Forms.DockStyle.Top;
           this.treeView1.Location = new System.Drawing.Point(0, 0);
           this.treeView1.Name = "treeView1";
           this.treeView1.Size = new System.Drawing.Size(329, 216);
           this.treeView1.TabIndex = 1;
           // 
           // Form1
           // 
           this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
           this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
           this.ClientSize = new System.Drawing.Size(329, 262);
           this.Controls.Add(this.treeView1);
           this.Controls.Add(this.button1);
           this.Font = new System.Drawing.Font("Microsoft Sans Serif", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
           this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
           this.Name = "Form1";
           this.Text = "Form1";
           this.Load += new System.EventHandler(this.Form1_Load);
           this.ResumeLayout(false);
       }
       private System.Windows.Forms.Button button1;
       private System.Windows.Forms.TreeView treeView1;
       [STAThread]
       static void Main()
       {
           Application.EnableVisualStyles();
           Application.SetCompatibleTextRenderingDefault(false);
           Application.Run(new Form1());
       }
   }</source>

XPath Node Iterator

<source lang="csharp">using System; using System.Xml.XPath;

 class MainClass{
   static void Main(string[] args) {
     XPathDocument xpathDocument = new XPathDocument("sample.xml");
     XPathNavigator xpathNavigator = xpathDocument.CreateNavigator();
     XPathNodeIterator xpathNodeIterator = xpathNavigator.Select("//companies/cell-phone[last()]");
     int i = 0;
     Console.Out.WriteLine(xpathNodeIterator.Count);
     while (xpathNodeIterator.MoveNext()) {
       Console.Out.WriteLine((++i) + ". Name: <" + xpathNodeIterator.Current.Name + ">. Value: " + xpathNodeIterator.Current.Value + ".");
     }
   }
 }</source>

XPath Selecting: /Customers/Customer[@FirstName="D"]

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml;

   public class Customer
   {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string EmailAddress { get; set; }
       public override string ToString()
       {
           return string.Format("{0} {1}\nEmail:   {2}",FirstName, LastName, EmailAddress);
       }
   }
   public class Tester
   {
       static void Main()
       {
           List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
           XmlDocument customerXml = new XmlDocument();
           XmlElement rootElem = customerXml.CreateElement("Customers");
           customerXml.AppendChild(rootElem);
           foreach (Customer customer in customers)
           {
               XmlElement customerElem = customerXml.CreateElement("Customer");
               XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
               firstNameAttr.Value = customer.FirstName;
               customerElem.Attributes.Append(firstNameAttr);
               XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
               lastNameAttr.Value = customer.LastName;
               customerElem.Attributes.Append(lastNameAttr);
               XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
               emailAddress.InnerText = customer.EmailAddress;
               customerElem.AppendChild(emailAddress);
               rootElem.AppendChild(customerElem);
           }
           string xPath = "/Customers/Customer[@FirstName="D"]";
           XmlNode oneCustomer = customerXml.SelectSingleNode(xPath);
           if (oneCustomer != null)
               Console.WriteLine(oneCustomer.OuterXml);
           else
               Console.WriteLine("Not found");
       }
   }</source>

XPath selecting: descendant::Customer[attribute::FirstName="D"]

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml;

   public class Customer
   {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string EmailAddress { get; set; }
       public override string ToString()
       {
           return string.Format("{0} {1}\nEmail:   {2}",FirstName, LastName, EmailAddress);
       }
   }
   public class Tester
   {
       static void Main()
       {
           List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
           XmlDocument customerXml = new XmlDocument();
           XmlElement rootElem = customerXml.CreateElement("Customers");
           customerXml.AppendChild(rootElem);
           foreach (Customer customer in customers)
           {
               XmlElement customerElem = customerXml.CreateElement("Customer");
               XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
               firstNameAttr.Value = customer.FirstName;
               customerElem.Attributes.Append(firstNameAttr);
               XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
               lastNameAttr.Value = customer.LastName;
               customerElem.Attributes.Append(lastNameAttr);
               XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
               emailAddress.InnerText = customer.EmailAddress;
               customerElem.AppendChild(emailAddress);
               rootElem.AppendChild(customerElem);
           }
           string xPath = "descendant::Customer[attribute::FirstName="D"]";
           XmlElement oneCustomer = (XmlElement)customerXml.SelectSingleNode(xPath);
           if (oneCustomer != null)
               Console.WriteLine(oneCustomer.OuterXml);
           else
               Console.WriteLine("Not found");
       }
   }</source>

XPath selecting: descendant::Customer[contains(EmailAddress, "a.com")]

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml;

   public class Customer
   {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string EmailAddress { get; set; }
       public override string ToString()
       {
           return string.Format("{0} {1}\nEmail:   {2}",FirstName, LastName, EmailAddress);
       }
   }
   public class Tester
   {
       static void Main()
       {
           List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
           XmlDocument customerXml = new XmlDocument();
           XmlElement rootElem = customerXml.CreateElement("Customers");
           customerXml.AppendChild(rootElem);
           foreach (Customer customer in customers)
           {
               XmlElement customerElem = customerXml.CreateElement("Customer");
               XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
               firstNameAttr.Value = customer.FirstName;
               customerElem.Attributes.Append(firstNameAttr);
               XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
               lastNameAttr.Value = customer.LastName;
               customerElem.Attributes.Append(lastNameAttr);
               XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
               emailAddress.InnerText = customer.EmailAddress;
               customerElem.AppendChild(emailAddress);
               rootElem.AppendChild(customerElem);
           }
           string xPath = "descendant::Customer[contains(EmailAddress, "a.ru")]";
           XmlNodeList customerList = customerXml.SelectNodes(xPath);
           Console.WriteLine("\nSelectNodes(\"{0}\")...", xPath);
           if (customerList != null)
           {
               foreach (XmlNode customer in customerList)
                   Console.WriteLine(customer.OuterXml);
           }
           else
               Console.WriteLine("Not found");
       }
   }</source>

XPath selecting: descendant::Customer[EmailAddress="k@a.com"]

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml;

   public class Customer
   {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string EmailAddress { get; set; }
       public override string ToString()
       {
           return string.Format("{0} {1}\nEmail:   {2}",FirstName, LastName, EmailAddress);
       }
   }
   public class Tester
   {
       static void Main()
       {
           List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
           XmlDocument customerXml = new XmlDocument();
           XmlElement rootElem = customerXml.CreateElement("Customers");
           customerXml.AppendChild(rootElem);
           foreach (Customer customer in customers)
           {
               XmlElement customerElem = customerXml.CreateElement("Customer");
               XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
               firstNameAttr.Value = customer.FirstName;
               customerElem.Attributes.Append(firstNameAttr);
               XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
               lastNameAttr.Value = customer.LastName;
               customerElem.Attributes.Append(lastNameAttr);
               XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
               emailAddress.InnerText = customer.EmailAddress;
               customerElem.AppendChild(emailAddress);
               rootElem.AppendChild(customerElem);
           }
           string xPath = "descendant::Customer[EmailAddress="k@a.ru"]";
           XmlElement oneCustomer = (XmlElement)customerXml.SelectSingleNode(xPath);
           Console.WriteLine("\nSelectSingleNode(\"{0}\")...", xPath);
           if (oneCustomer != null)
               Console.WriteLine(oneCustomer.OuterXml);
           else
               Console.WriteLine("Not found");
       }
   }</source>

XPath selecting: descendant::Customer[@FirstName="D"]

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml; public class Customer {

   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string EmailAddress { get; set; }
   public override string ToString()
   {
       return string.Format("{0} {1}\nEmail:   {2}", FirstName, LastName, EmailAddress);
   }

} public class Tester {

   static void Main()
   {
       List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
       XmlDocument customerXml = new XmlDocument();
       XmlElement rootElem = customerXml.CreateElement("Customers");
       customerXml.AppendChild(rootElem);
       foreach (Customer customer in customers)
       {
           XmlElement customerElem = customerXml.CreateElement("Customer");
           XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
           firstNameAttr.Value = customer.FirstName;
           customerElem.Attributes.Append(firstNameAttr);
           XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
           lastNameAttr.Value = customer.LastName;
           customerElem.Attributes.Append(lastNameAttr);
           XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
           emailAddress.InnerText = customer.EmailAddress;
           customerElem.AppendChild(emailAddress);
           rootElem.AppendChild(customerElem);
       }
       string xPath = "descendant::Customer[@FirstName="D"]";
       XmlNode oneCustomer = customerXml.SelectSingleNode(xPath);
       Console.WriteLine("\nSelectSingleNode(\"{0}\")...", xPath);
       if (oneCustomer != null)
           Console.WriteLine(oneCustomer.OuterXml);
       else
           Console.WriteLine("Not found");
   }

}</source>

XPath selecting: descendant::Customer[starts-with(@LastName, "G") and contains(EmailAddress, "a.com")]

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml; public class Customer {

   public string FirstName { get; set; }
   public string LastName { get; set; }
   public string EmailAddress { get; set; }
   public override string ToString()
   {
       return string.Format("{0} {1}\nEmail:   {2}", FirstName, LastName, EmailAddress);
   }

} public class Tester {

   static void Main()
   {
       List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
       XmlDocument customerXml = new XmlDocument();
       XmlElement rootElem = customerXml.CreateElement("Customers");
       customerXml.AppendChild(rootElem);
       foreach (Customer customer in customers)
       {
           XmlElement customerElem = customerXml.CreateElement("Customer");
           XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
           firstNameAttr.Value = customer.FirstName;
           customerElem.Attributes.Append(firstNameAttr);
           XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
           lastNameAttr.Value = customer.LastName;
           customerElem.Attributes.Append(lastNameAttr);
           XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
           emailAddress.InnerText = customer.EmailAddress;
           customerElem.AppendChild(emailAddress);
           rootElem.AppendChild(customerElem);
       }
       string xPath = "descendant::Customer[starts-with(@LastName, "G") and contains(EmailAddress, "a.ru")]";
       XmlNodeList customerList = customerXml.SelectNodes(xPath);
       if (customerList != null)
       {
           foreach (XmlNode customer in customerList)
               Console.WriteLine(customer.OuterXml);
       }
       else
           Console.WriteLine("Not found");
   }

}</source>

XPath selecting: descendant::EmailAddress[text()="k@a.com"]

<source lang="csharp">using System; using System.Collections.Generic; using System.IO; using System.Xml;

   public class Customer
   {
       public string FirstName { get; set; }
       public string LastName { get; set; }
       public string EmailAddress { get; set; }
       public override string ToString()
       {
           return string.Format("{0} {1}\nEmail:   {2}",FirstName, LastName, EmailAddress);
       }
   }
   public class Tester
   {
       static void Main()
       {
           List<Customer> customers = new List<Customer>{
               new Customer { FirstName = "A", 
                              LastName = "G",
                              EmailAddress = "o@a.ru"},
               new Customer { FirstName = "B", 
                              LastName = "C",
                              EmailAddress = "k@a.ru" },
               new Customer { FirstName = "D", 
                              LastName = "C",
                              EmailAddress = "d@a.ru" },
               new Customer { FirstName = "E", 
                              LastName = "G",
                              EmailAddress = "j@a.ru" },
               new Customer { FirstName = "L", 
                              LastName = "H",
                              EmailAddress = "l@a.ru" }
           };
           XmlDocument customerXml = new XmlDocument();
           XmlElement rootElem = customerXml.CreateElement("Customers");
           customerXml.AppendChild(rootElem);
           foreach (Customer customer in customers)
           {
               XmlElement customerElem = customerXml.CreateElement("Customer");
               XmlAttribute firstNameAttr = customerXml.CreateAttribute("FirstName");
               firstNameAttr.Value = customer.FirstName;
               customerElem.Attributes.Append(firstNameAttr);
               XmlAttribute lastNameAttr = customerXml.CreateAttribute("LastName");
               lastNameAttr.Value = customer.LastName;
               customerElem.Attributes.Append(lastNameAttr);
               XmlElement emailAddress = customerXml.CreateElement("EmailAddress");
               emailAddress.InnerText = customer.EmailAddress;
               customerElem.AppendChild(emailAddress);
               rootElem.AppendChild(customerElem);
           }
           string xPath = "descendant::EmailAddress[text()="k@a.ru"]";
           XmlNode oneEmail = customerXml.SelectSingleNode(xPath);
           if (oneEmail != null)
               Console.WriteLine(oneEmail.OuterXml);
           else
               Console.WriteLine("Not found");
       }
   }</source>

XPath Select Nodes

<source lang="csharp">using System; using System.Xml; public class MainClass {

 [STAThread]
 private static void Main()
 {
   XmlDocument doc = new XmlDocument();
   doc.Load("Sample.xml");
   XmlNodeList nodes = doc.SelectNodes("/Order/Items/Item/Name");
       
   foreach (XmlNode node in nodes)
   {
     Console.WriteLine(node.InnerText);
   }
 }

}</source>

XPath XSLT transformation

<source lang="csharp">using System; using System.Xml; using System.Xml.Xsl; using System.Xml.XPath;

 class MainClass {
   [STAThread]
   static void Main(string[] args) {
     XslTransform xslTransform = new XslTransform();
     XPathDocument xpathDocument = new XPathDocument("../../sample.xml");
     XmlTextWriter xmlTextWriter = new XmlTextWriter("../../sample.html", null);
     xslTransform.Load("../../sample.xslt");
     xslTransform.Transform(xpathDocument, null, xmlTextWriter);
   }
 }</source>