XPathNavigator类包含移动和选择XML所需元素的所有方法。
1.创建:
a.如果是从XPathDocument中创建,则是只读的,只能浏览数据;
b.如果是从XmlDocument中创建,则可以编辑文档;
2.查询:使用Select()方法通过XPath语句查询;
3.迭代:使用XPathNodeIterator类,MoveNext()方法移动下一个节点;Current属性表示当前节点;
4.求值:使用Evaluate()方法计算表达式的值;
5.插入节点:先检查CanEdit属性是否为true,再使用InsertAfter()方法插入新节点。
实例:查询和编辑books.xml
01.
using
System;
02.
using
System.Collections.Generic;
03.
using
System.Text;
04.
using
System.Xml.XPath;
05.
using
System.Xml;
06.
07.
namespace
Magci.Test.XML.TestXPath
08.
{
09.
class
Program
10.
{
11.
private
static
XPathDocument doc;
12.
private
static
XPathNavigator nav;
13.
14.
static
void
Main(
string
[] args)
15.
{
16.
doc =
new
XPathDocument(@
"../../books.xml"
);
17.
nav = ((IXPathNavigable)doc).CreateNavigator();
18.
SearchByGenre(
"nove"
);
19.
TotalPrice();
20.
Insert();
21.
Console.ReadLine();
22.
}
23.
24.
public
static
void
SearchByGenre(
string
search)
25.
{
26.
//查询bookstore的子元素book中genre属性值为novel的所有节点
27.
XPathNodeIterator iter = nav.Select(
"/bookstore/book[@genre='"
+ search +
"l']"
);
28.
29.
Console.WriteLine(
"/nSearchByGenre:/n"
);
30.
while
(iter.MoveNext())
31.
{
32.
//迭代所有子代节点
33.
XPathNodeIterator newIter = iter.Current.SelectDescendants(XPathNodeType.Element,
false
);
34.
while
(newIter.MoveNext())
35.
{
36.
Console.WriteLine(newIter.Current.Name +
" : "
+ newIter.Current.Value);
37.
}
38.
}
39.
}
40.
41.
public
static
void
TotalPrice()
42.
{
43.
XPathNodeIterator iter = nav.Select(
"/bookstore/book"
);
44.
Console.WriteLine(
"/nTotalPrice:/n"
);
45.
while
(iter.MoveNext())
46.
{
47.
XPathNodeIterator newIter = iter.Current.SelectDescendants(XPathNodeType.Element,
false
);
48.
while
(newIter.MoveNext())
49.
{
50.
if
(newIter.Current.Name ==
"price"
)
51.
{
52.
Console.WriteLine(newIter.Current.Name +
" : "
+ newIter.Current.Value);
53.
}
54.
}
55.
}
56.
//统计图书总价
57.
Console.WriteLine(
"Total price = {0}"
, nav.Evaluate(
"sum(bookstore/book/price)"
));
58.
}
59.
60.
//插入节点
61.
public
static
void
Insert()
62.
{
63.
XmlDocument doc =
new
XmlDocument();
64.
doc.Load(@
"../../books.xml"
);
65.
XPathNavigator nav2 = doc.CreateNavigator();
66.
//判断是否可编辑
67.
if
(nav2.CanEdit)
68.
{
69.
XPathNodeIterator iter = nav2.Select(
"bookstore/book/price"
);
70.
while
(iter.MoveNext())
71.
{
72.
//在当前节点之后插入新节点
73.
iter.Current.InsertAfter(
"<disc>5</disc>"
);
74.
}
75.
}
76.
doc.Save(@
"../../newBooks.xml"
);
77.
Console.WriteLine(
"/nnewBooks.xml saved successful./n"
);
78.
}
79.
}
80.
}
book.xml:
newBooks.xml:编辑后的文档
01.
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02.
<
bookstore
>
03.
<
book
genre
=
"autobiography"
publicationdate
=
"1991"
ISBN
=
"1-861003-11-0"
>
04.
<
title
>The Autobiography of Benjamin Franklin</
title
>
05.
<
author
>
06.
<
first-name
>Benjamin</
first-name
>
07.
<
last-name
>Franklin</
last-name
>
08.
</
author
>
09.
<
price
>8.99</
price
>
10.
</
book
>
11.
<
book
genre
=
"novel"
publicationdate
=
"1967"
ISBN
=
"0-201-63361-2"
>
12.
<
title
>The Confidence Man</
title
>
13.
<
author
>
14.
<
first-name
>Herman</
first-name
>
15.
<
last-name
>Melville</
last-name
>
16.
</
author
>
17.
<
price
>11.99</
price
>
18.
</
book
>
19.
<
book
genre
=
"philosophy"
publicationdate
=
"1991"
ISBN
=
"1-861001-57-6"
>
20.
<
title
>The Gorgias</
title
>
21.
<
author
>
22.
<
name
>Plato</
name
>
23.
</
author
>
24.
<
price
>9.99</
price
>
25.
</
book
>
26.
</
bookstore
>
newBooks.xml:编辑后的文档
01.
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
02.
<
bookstore
>
03.
<
book
genre
=
"autobiography"
publicationdate
=
"1991"
ISBN
=
"1-861003-11-0"
>
04.
<
title
>The Autobiography of Benjamin Franklin</
title
>
05.
<
author
>
06.
<
first-name
>Benjamin</
first-name
>
07.
<
last-name
>Franklin</
last-name
>
08.
</
author
>
09.
<
price
>8.99</
price
>
10.
<
disc
>5</
disc
>
11.
</
book
>
12.
<
book
genre
=
"novel"
publicationdate
=
"1967"
ISBN
=
"0-201-63361-2"
>
13.
<
title
>The Confidence Man</
title
>
14.
<
author
>
15.
<
first-name
>Herman</
first-name
>
16.
<
last-name
>Melville</
last-name
>
17.
</
author
>
18.
<
price
>11.99</
price
>
19.
<
disc
>5</
disc
>
20.
</
book
>
21.
<
book
genre
=
"philosophy"
publicationdate
=
"1991"
ISBN
=
"1-861001-57-6"
>
22.
<
title
>The Gorgias</
title
>
23.
<
author
>
24.
<
name
>Plato</
name
>
25.
</
author
>
26.
<
price
>9.99</
price
>
27.
<
disc
>5</
disc
>
28.
</
book
>
29.
</
bookstore
>