XPath积累

测试使用两个xml文件。 

文件1.XML内容如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
  <book>
    <title lang="eng">Harry Potter</title>
    <price>29.99</price>
  </book>
</book>
<book>
  <title lang="abcdef">Learning XML</title>
  <price>39.95</price>
</book>
</bookstore>

文件2.XML内容如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>
<book>
  <title lang="abcdef">Learning XML</title>
  <price>39.95</price>  
  <title>999</title>
</book>
</bookstore>

C#操作代码如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Xml;
  6 namespace XPath学习
  7 {
  8     class Program
  9     {
 10         static void Main(string[] args)
 11         {
 12             Fun1();
 13             //Fun2();
 14         }
 15         /// <summary>
 16         /// XPath选取节点
 17         /// </summary>
 18         static void Fun1()
 19         {
 20             XmlDocument xml = new XmlDocument();
 21             xml.Load(@"1.xml");
 22             //返回“bookstore”,选取根元素 bookstore 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!   
 23             Console.WriteLine(xml.SelectSingleNode("/bookstore").Name);
 24             //返回2,选取所有属于 bookstore 的子元素的 book 元素   
 25             Console.WriteLine(xml.SelectNodes("bookstore/book").Count);
 26             //返回1,选取所有属于 bookstore 的子元素 book 的子元素的 book 元素   
 27             Console.WriteLine(xml.SelectNodes("bookstore/book/book").Count);
 28             //返回3,选取所有 book 子元素,而不管它们在文档中的位置 
 29             Console.WriteLine(xml.SelectNodes("//book").Count);
 30             //返回3,选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下的什么位置
 31             Console.WriteLine(xml.SelectNodes("bookstore//book").Count);
 32 
 33             //下面两个例子说明SelectNodes方法参数中不带“/”搜索的是使用该方法的元素的子元素而非后代元素
 34             //返回1
 35             Console.WriteLine(xml.GetElementsByTagName("book")[0].SelectNodes("book").Count);
 36             //返回0
 37             Console.WriteLine(xml.SelectNodes("book").Count);
 38             //“..”是选取当前节点的父节点,返回bookstore
 39             Console.WriteLine(xml.GetElementsByTagName("book")[0].SelectSingleNode("..").Name);
 40             //“.”是选取当前节点,返回第一个book元素的子元素数量,即3
 41             Console.WriteLine(xml.GetElementsByTagName("book")[0].SelectSingleNode(".").ChildNodes.Count);
 42             //返回3,选取所有名为 lang 的属性。
 43             XmlNodeList attrs = xml.SelectNodes("//@lang");
 44             Console.WriteLine(attrs.Count+"\tnodetype:"+attrs[0].NodeType);
 45             //返回2,选取bookstore/book/title的lang属性(不包括bookstore/book/book/title)
 46             Console.WriteLine(xml.SelectNodes("bookstore/book/title/@lang").Count);
 47             //“*”匹配任何节点,下面是选取所有节点,返回10
 48             Console.WriteLine(xml.SelectNodes("//*").Count);
 49             //选取bookstore,返回“bookstore”
 50             Console.WriteLine(xml.SelectNodes("*")[0].Name);//或者是"/*"
 51             //选取#document(最顶层节点),返回“#document”
 52             Console.WriteLine(xml.SelectNodes(".")[0].Name);
 53             //返回2,选取bookstore的两个子节点
 54             Console.WriteLine(xml.SelectNodes("./bookstore/*").Count);//或者是“bookstore/*”
 55 
 56             //返回1,选取bookstore/book/book/title的所有属性节点,“@*”匹配所有属性节点
 57             Console.WriteLine(xml.SelectNodes("bookstore/book/book/title/@*").Count);
 58             //返回4,选取bookstore/book/book所有后代节点,包括文本节点,不包括属性节点,“node()”匹配除了属性节点以外的任何类型节点
 59             XmlNodeList allNode=xml.SelectNodes("bookstore/book/book//node()");
 60             Console.WriteLine(allNode.Count);
 61             foreach (XmlNode x in allNode)
 62             {
 63                 Console.Write("nodename:{0}\t",x.Name);
 64             }
 65             Console.WriteLine();
 66         }
 67         /// <summary>
 68         /// XPath谓语
 69         /// </summary>
 70         static void Fun2()
 71         {
 72             XmlDocument xml = new XmlDocument();
 73             xml.Load(@"2.xml");
 74             //返回“1   eng”,/bookstore/book[1]是选取属于 bookstore 子元素的第一个 book 元素
 75             Console.WriteLine(xml.SelectNodes("bookstore/book[1]").Count + "\t" + xml.SelectNodes("bookstore/book[1]")[0].ChildNodes[0].Attributes["lang"].Value);
 76             //返回“1   abcdef”,/bookstore/book[last()]是选取属于  bookstore 子元素的最后一个 book 元素
 77             Console.WriteLine(xml.SelectNodes("bookstore/book[last()]").Count + "\t" + xml.SelectNodes("bookstore/book[last()]")[0].ChildNodes[0].Attributes["lang"].Value);
 78             //返回“1   abcdef”,/bookstore/book[last()-1]是选取属于   bookstore 子元素的倒数第二个 book 元素
 79             Console.WriteLine(xml.SelectNodes("bookstore/book[last()-1]").Count + "\t" + xml.SelectNodes("bookstore/book[last()-1]")[0].ChildNodes[0].Attributes["lang"].Value);
 80 
 81             //返回2,bookstore/book[position()<3]是选取最前面的两个属于 bookstore 元素的子元素的 book 元素
 82             Console.WriteLine(xml.SelectNodes("bookstore/book[position()<3]").Count);
 83             //返回2,//title[@lang]是选取选取所有拥有名为 lang 的属性的 title 元素
 84             Console.WriteLine(xml.SelectNodes("//title[@lang]").Count);
 85             //返回1,//title[@lang='abcdef']是选取所有 title 元素,且这些元素拥有值为 abcdef 的 lang 属性
 86             Console.WriteLine(xml.SelectNodes("//title[@lang='abcdef']").Count);
 87 
 88             //返回1,/bookstore/book[price>35.00]是选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00
 89             Console.WriteLine(xml.SelectNodes("/bookstore/book[price>35.00]").Count);
 90 
 91             //返回2,/bookstore/book[price>35.00]是选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00
 92             Console.WriteLine(xml.SelectNodes("/bookstore/book[price>35.00]/title").Count);
 93  
 94  
 95             //返回5,“//book/title | //book/price”选取所有 book 元素的 title 和 price 元素
 96             Console.WriteLine(xml.SelectNodes("//book/title | //book/price").Count);
 97             //返回5,“//title | //price”选取所有 title 和 price 元素
 98             Console.WriteLine(xml.SelectNodes("//title | //price").Count);
 99             //返回5,“/bookstore/book/title | //price”选取所有属于 bookstore 元素的 book 元素的 title 元素,以及文档中所有的 price 元素
100             Console.WriteLine(xml.SelectNodes("/bookstore/book/title | //price").Count);
101              //总结
102             /*
103              相对路径:相对路径不起始于正斜杠(/),参数路径表示相对于当前使用SelectNodes或者SelectSingleNode方法的元素的路径,例 如:node1.SelectNodes("aa")表示查询node1的所有aa子元素,如果是使用 XmlDocument.SelectNodes("xxx")表示的是查询#document下的所有xxx节点(其实xxx必须是根节点才查询得 到),而xml.SelectNodes(".")[0].Name为#dopcument
104              绝对路径:绝对路径起始于正斜杠( / ),参数路径表示从xml文档的#document开始的路径(而非从xml文档根元素开始),所以绝对路径必须以“/根元素”开始才能找到节点,例如 xml.SelectNodes("/bookstore")[0].Name)其实就是xml.SelectNodes("./bookstore") [0].Name)(都表示#document/bookstore)
105             在XPath中属性节点属于拥有其的元素节点的子节点,例 如:Console.WriteLine(xml.SelectNodes("//title") [0].SelectNodes("@lang").Count),表示查询xml文档中一个title节点的lang属性节点
106              */     
107         }
108     }
109 }

原文地址:https://www.cnblogs.com/mxw09/p/1909506.html