测试使用两个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>
<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>
<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 }
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 }