100165645.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 323 行 · 第 1/3 页
HTM
323 行
</td>
</tr>
</tbody>
</table>
</div>
<p class="MsoNormal"><span lang="EN-US" style="FONT-SIZE: 6pt"> </span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">有几个</span><span lang="EN-US">Select()</span><span style="FONT-FAMILY: 宋体">方法可以选择出要操作的节点子集。所有的</span><span lang="EN-US">Select</span><span style="FONT-FAMILY: 宋体">方法都返回一个</span><span lang="EN-US">XPathNodeIterator</span><span style="FONT-FAMILY: 宋体">对象。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">还可以使用</span><span lang="EN-US">SelectAncestors() </span><span style="FONT-FAMILY: 宋体">和</span> <span lang="EN-US">SelectChildren()</span><span style="FONT-FAMILY: 宋体">方法。它们都返回一个</span><span lang="EN-US">XpathNodeIterator</span><span style="FONT-FAMILY: 宋体">对象。</span><span lang="EN-US">Select</span><span style="FONT-FAMILY: 宋体">的参数是一个</span><span lang="EN-US">XPath</span><span style="FONT-FAMILY: 宋体">表达式,其他选择方法的参数是一个</span><span lang="EN-US">XPathNodeType</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">可以扩展</span><span lang="EN-US">XpathNavigator</span><span style="FONT-FAMILY: 宋体">,使用文件系统或注册表作为存储器,来代替</span><span lang="EN-US">XpathDocument</span><span style="FONT-FAMILY: 宋体">。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">3. XpathNodeIterator</span><span style="FONT-FAMILY: 黑体">类</span></h4>
<p class="MsoNormal"><span lang="EN-US">XPathNodeIterator</span><span style="FONT-FAMILY: 宋体">可以看作是</span><span lang="EN-US">XPath</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">NodeList </span><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US">NodeSet</span><span style="FONT-FAMILY: 宋体">,这个对象有</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个属性和两个方法:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">Clone</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt">——</span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">创建它本身的一个新副本。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">Count</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt">——</span><span style="LETTER-SPACING: -1pt"> </span><span lang="EN-US">XPathNodeIterator</span><span style="FONT-FAMILY: 宋体">对象中的节点数。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">Current</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt">——</span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">返回指向当前节点的</span><span lang="EN-US">XPathNavigator</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span lang="EN-US"> </span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">CurrentPosition()</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt">——</span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">返回表示当前位置的一个整数。</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span lang="EN-US">MoveNext()</span><span style="FONT-FAMILY: 宋体; LETTER-SPACING: -1pt">——</span><span style="LETTER-SPACING: -1pt"> </span><span style="FONT-FAMILY: 宋体">移动到匹配</span><span lang="EN-US">XPath</span><span style="FONT-FAMILY: 宋体">表达式的下一个节点上,创建</span><span lang="EN-US">XPathNodeIterator</span><span style="FONT-FAMILY: 宋体">。</span></p>
<h4 style="FTEL: 21.45pt"><span lang="EN-US">4. </span><span style="FONT-FAMILY: 黑体">使用</span><span lang="EN-US">XPath</span><span style="FONT-FAMILY: 黑体">命名空间中的类</span></h4>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">要理解这些类的用法,最好是查看一下迭代</span><span lang="EN-US">books.xml</span><span style="FONT-FAMILY: 宋体">文档的代码,确定导航是如何工作的。为了使用这些示例,首先需要添加对</span><span lang="EN-US">System.Xml.Xsl </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> System.Xml.XPath</span><span style="FONT-FAMILY: 宋体">命名空间的引用,如下所示:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">using System.Xml.XPath;</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">using System.Xml.Xsl;</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这个示例使用了文件</span><span lang="EN-US">booksxpath.xml</span><span style="FONT-FAMILY: 宋体">,它类似于前面使用的</span><span lang="EN-US">books.xml</span><span style="FONT-FAMILY: 宋体">,但</span><span lang="EN-US">booksxpath.xml</span><span style="FONT-FAMILY: 宋体">添加了两本书。下面是窗体代码,这段代码在</span><span lang="EN-US">XPathXSLSample1</span><span style="FONT-FAMILY: 宋体">文件夹中:</span></p>
<p class="2" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">private void button1</span><span lang="EN-US" style="FONT-FAMILY: 'Baskerville BE Regular'">_</span><span lang="EN-US">Click(object sender, System.EventArgs e)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //modify to match your path structure</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XPathDocument doc=new XPathDocument("..\\..\\..\\booksxpath.xml");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //create the XPath navigator</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XPathNavigator nav=doc.CreateNavigator();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //create the XPathNodeIterator of book nodes</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> // that have genre attribute value of novel</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XPathNodeIterator iter=nav.Select("/bookstore/book[@genre='novel']");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> while(iter.MoveNext()) </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> LoadBook(iter.Current);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">private void LoadBook(XPathNavigator lstNav)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //We are passed an XPathNavigator of a particular book node</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //we will select all of the descendents and</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //load the list box with the names and values</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XPathNodeIterator iterBook=lstNav.SelectDescendants</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> (XPathNodeType.Element, false);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> while(iterBook.MoveNext())</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> listBox1.Items.Add(iterBook.Current.Name + ": " </span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> + iterBook.Current.Value);</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN-US">button1_Click()</span><span style="FONT-FAMILY: 宋体">方法中,首先创建</span><span lang="EN-US">XPathDocument(</span><span style="FONT-FAMILY: 宋体">叫做</span><span lang="EN-US">doc)</span><span style="FONT-FAMILY: 宋体">,其参数是要打开的文档的文件和路径字符串。下面一行代码创建</span><span lang="EN-US">XPathNavigator</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">XPathNavigator nav = doc.CreateNavigator();</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">本例用</span><span lang="EN-US">Select</span><span style="FONT-FAMILY: 宋体">方法获取</span><span lang="EN-US">genre</span><span style="FONT-FAMILY: 宋体">属性值为</span><span lang="EN-US">novel</span><span style="FONT-FAMILY: 宋体">的所有节点,然后使用</span><span lang="EN-US">MoveNext()</span><span style="FONT-FAMILY: 宋体">方法迭代书籍列表中的所有小说。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">要把数据加载到列表框中,使用</span><span lang="EN-US">XPathNodeIterator.Current</span><span style="FONT-FAMILY: 宋体">属性,根据</span><span lang="EN-US">XPathNodeIterator</span><span style="FONT-FAMILY: 宋体">指向的节点,创建一个新的</span><span lang="EN-US">XPathNavigator</span><span style="FONT-FAMILY: 宋体">对象。在本例中,为文档中的一个</span><span lang="EN-US">book</span><span style="FONT-FAMILY: 宋体">节点创建一个</span><span lang="EN-US">XPathNavigator</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p class="MsoNormal"><span lang="EN-US">LoadBook()</span><span style="FONT-FAMILY: 宋体">方法提取这个</span><span lang="EN-US">XPathNavigator</span><span style="FONT-FAMILY: 宋体">,调用</span><span lang="EN-US">Select</span><span style="FONT-FAMILY: 宋体">方法的另一个重载方法</span><span lang="EN-US">SelectDescendants</span><span style="FONT-FAMILY: 宋体">创建另一个</span><span lang="EN-US">XPathNavigator</span><span style="FONT-FAMILY: 宋体">,这样,</span><span lang="EN-US">XPathNodeIterator</span><span style="FONT-FAMILY: 宋体">就包含了给</span><span lang="EN-US">LoadBook</span><span style="FONT-FAMILY: 宋体">方法发送的</span><span lang="EN-US">book</span><span style="FONT-FAMILY: 宋体">节点的所有子节点。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">然后,在这个</span><span lang="EN-US">XPathNodeIterator</span><span style="FONT-FAMILY: 宋体">上执行另一个</span><span lang="EN-US">MoveNext()</span><span style="FONT-FAMILY: 宋体">循环,给列表框加载元素名称和元素值。在执行代码后,显示</span><span lang="EN-US">23-7</span><span style="FONT-FAMILY: 宋体">所示的屏幕图,注意只列出了小说。</span></p>
<p align="center"><em><span lang="EN-US"><img height="196" src="23/image007.jpg" width="181" border="0" alt="" /></span></em></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span> <span lang="EN-US"> 23-7</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果要把这些书的成本相加,该怎么办?</span><span lang="EN-US">XPathNavigator</span><span style="FONT-FAMILY: 宋体">为此包含了</span><span lang="EN-US">Evaluate</span><span style="FONT-FAMILY: 宋体">方法。</span><span lang="EN-US">Evaluate</span><span style="FONT-FAMILY: 宋体">有</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个重载方法,第一个包含一个字符串,该字符串就是</span><span lang="EN-US">XPath</span><span style="FONT-FAMILY: 宋体">函数调用。第二个</span><span lang="EN-US">Evaluate</span><span style="FONT-FAMILY: 宋体">重载方法的参数是</span><span lang="EN-US">XPathExpression</span><span style="FONT-FAMILY: 宋体">对象,第三个</span><span lang="EN-US">Evaluate</span><span style="FONT-FAMILY: 宋体">重载方法的参数是</span><span lang="EN-US">XPathExpression </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US"> XPathNodeIterator</span><span style="FONT-FAMILY: 宋体">。如果对示例进行下述修改</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">这个版本的代码在</span><span lang="EN-US">XPathXSLSample2</span><span style="FONT-FAMILY: 宋体">中</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">private void button1</span><span lang="EN-US" style="FONT-FAMILY: 'Baskerville BE Regular'">_</span><span lang="EN-US">Click(object sender, System.EventArgs e) </span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">{</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //modify to match your path structure</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XPathDocument doc = new XPathDocument("..\\..\\..\\booksxpath.XML");</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //create the XPath navigator</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XPathNavigator nav = doc.CreateNavigator();</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //create the XPathNodeIterator of book nodes</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> // that have genre attribute value of novel</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XPathNodeIterator iter = nav.Select("/bookstore/book[@genre='novel']");</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> while(iter.MoveNext()) </span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> {</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> LoadBook(iter.Current.Clone());</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> }</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //add a break line and calculate the sum</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> listBox1.Items.Add("========================");</span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> listBox1.Items.Add("Total Cost = " </span></p>
<p class="a6" style="BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> + nav.Evaluate("sum(/bookstore/book[@genre='novel']/price)"));</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; BACKGROUND: #f2f2f2; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">这次,可以看到列表框中书籍的总成本,如图</span><span lang="EN-US">23-8</span><span style="FONT-FAMILY: 宋体">所示。</span></p>
<p align="center"><span lang="EN-US"><img height="190" src="23/image008.jpg" width="175" border="0" alt="" /></span></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span> <span lang="EN-US">23-8</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165644.htm">上一页</a> <a href="index.html">首页</a> <a href="100165646.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165645.htm'><font color='red'>23.7.1 System.Xml.XPath命名空间</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165642.htm'>23.5.3 使用XmlTextWriter类</a></div><div style='float:right;width:49%'>·<a href='100165643.htm'>23.6 在.NET中使用DOM</a></div><div style='float:left;width:49%'>·<a href='100165644.htm'>23.7 在NET中使用XPath和XSLT</a></div><div style='float:right;width:49%'>·<a href='100165646.htm'>23.7.2 System.Xml.Xsl命名空间</a></div><div style='float:left;width:49%'>·<a href='100165647.htm'>23.8 XML和ADO.NET</a></div><div style='float:right;width:49%'>·<a href='100165648.htm'>23.8.1 将ADO.NET数据转换为XML文档(1)</a></div></div>
</div>
</div>
</div>
<!-- 评论 -->
<!-- 今日推荐 -->
</div>
<!-- 页脚 -->
<div id="foot">
<img src="../../book/readbook.aspx@node=5645&bookid=16&bookname=23.7.1++System.Xml.XPath_25c3_25fc_25c3_25fb_25bf_25d5_25bc_25e4" alt="" width="0" height="0" />
<style>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?