<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>zyjwy02</title>
    <description></description>
    <link>http://zyjwy02.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>XPath最通俗的教程(收藏)</title>
        <author>zyjwy02</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyjwy02.javaeye.com">zyjwy02</a>&nbsp;
          链接：<a href="http://zyjwy02.javaeye.com/blog/230764" style="color:red;">http://zyjwy02.javaeye.com/blog/230764</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span>基本的</span><span lang="EN-US">XPath</span><span>语法类似于在一个文件系统中定位文件</span><span lang="EN-US">,</span><span>如果路径以斜线</span><span lang="EN-US"> / </span><span>开始</span><span lang="EN-US">, </span><span>那么该路径就表示到一个元素的绝对路径</span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择根元素</span><span lang="EN-US">AAA</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p align="left"><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA/CCC</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择</span><span lang="EN-US">AAA</span><span>的所有</span><span lang="EN-US">CCC</span><span>子元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA/DDD/BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择</span><span lang="EN-US">AAA</span><span>的子元素</span><span lang="EN-US">DDD</span><span>的所有子元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 2</span></strong></p>
<p align="left"><span>如果路径以双斜线</span><span lang="EN-US"> // </span><span>开头</span><span lang="EN-US">, </span><span>则表示选择文档中所有满足双斜线</span><span lang="EN-US">//</span><span>之后规则的元素</span><span lang="EN-US">(</span><span>无论层级关系</span><span lang="EN-US">)</span></p>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//DDD/BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有父元素是</span><span lang="EN-US">DDD</span><span>的</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 3</span></strong></p>
<p align="left"><span>星号</span><span lang="EN-US"> * </span><span>表示选择所有由星号之前的路径所定位的元素</span></p>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA/CCC/DDD/*</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有路径依附于</span><span lang="EN-US">/AAA/CCC/DDD</span><span>的元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>XXX</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>EEE</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>FFF</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>XXX</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">EEE</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">FFF</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>BBB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>BBB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/*/*/*/BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有的有</span><span lang="EN-US">3</span><span>个祖先元素的</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>XXX</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>EEE</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>FFF</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>XXX</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>EEE</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>FFF</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>BBB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//*</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">XXX</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">EEE</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">FFF</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">XXX</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">EEE</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">FFF</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 4</span></strong></p>
<p align="left"><span>方块号里的表达式可以进一步的指定元素</span><span lang="EN-US">, </span><span>其中数字表示元素在选择集里的位置</span><span lang="EN-US">, </span><span>而</span><span lang="EN-US">last()</span><span>函数则表示选择集中的最后一个元素</span><span lang="EN-US">.</span></p>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA/BBB[1]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择</span><span lang="EN-US">AAA</span><span>的第一个</span><span lang="EN-US">BBB</span><span>子元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA/BBB[last()]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择</span><span lang="EN-US">AAA</span><span>的最后一个</span><span lang="EN-US">BBB</span><span>子元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 5</span></strong></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//@id</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有的</span><span lang="EN-US">id</span><span>属性</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span></span></strong><span><strong><span lang="EN-US"> id = "b1"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span></span></strong><span><strong><span lang="EN-US"> id = "b2"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB name = "bbb"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p align="left"><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//BBB[@id]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择有</span><span lang="EN-US">id</span><span>属性的</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> id = "b1"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> id = "b2"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB name = "bbb"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//BBB[@name]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择有</span><span lang="EN-US">name</span><span>属性的</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB id = "b1"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB id = "b2"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> name = "bbb"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//BBB[@*]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择有任意属性的</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> id = "b1"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> id = "b2"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> name = "bbb"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//BBB[not(@*)]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择没有属性的</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB id = "b1"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB id = "b2"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB name = "bbb"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 6</span></strong></p>
<p align="left"><span>属性的值可以被用来作为选择的准则</span><span lang="EN-US">, normalize-space</span><span>函数删除了前部和尾部的空格</span><span lang="EN-US">, </span><span>并且把连续的空格串替换为一个单一的空格</span></p>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//BBB[@id='b1']</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择含有属性</span><span lang="EN-US">id</span><span>且其值为</span><span lang="EN-US">'b1'</span><span>的</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> id = "b1"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB name = " bbb "</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB name = "bbb"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//BBB[@name='bbb']</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择含有属性</span><span lang="EN-US">name</span><span>且其值为</span><span lang="EN-US">'bbb'</span><span>的</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB id = "b1"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB name = " bbb "</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> name = "bbb"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//BBB[normalize-space(@name)='bbb']</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择含有属性</span><span lang="EN-US">name</span><span>且其值</span><span lang="EN-US">(</span><span>在用</span><span lang="EN-US">normalize-space</span><span>函数去掉前后空格后</span><span lang="EN-US">)</span><span>为</span><span lang="EN-US">'bbb'</span><span>的</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB id = "b1"</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> name = " bbb "</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><span><strong><span lang="EN-US"> name = "bbb"</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 7</span></strong></p>
<p align="left"><span lang="EN-US">count()</span><span>函数可以计数所选元素的个数</span></p>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//*[count(BBB)=2]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择含有</span><span lang="EN-US">2</span><span>个</span><span lang="EN-US">BBB</span><span>子元素的元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>EEE</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>EEE</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//*[count(*)=2]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择含有</span><span lang="EN-US">2</span><span>个子元素的元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>CCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">EEE</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">EEE</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//*[count(*)=3]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择含有</span><span lang="EN-US">3</span><span>个子元素的元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>EEE</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>EEE</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 8</span></strong></p>
<p align="left"><span lang="EN-US">name()</span><span>函数返回元素的名称</span><span lang="EN-US">, start-with()</span><span>函数在该函数的第一个参数字符串是以第二个参数字符开始的情况返回</span><span lang="EN-US">true, contains()</span><span>函数当其第一个字符串参数包含有第二个字符串参数时返回</span><span lang="EN-US">true.</span></p>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//*[name()='BBB']</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有名称为</span><span lang="EN-US">BBB</span><span>的元素</span><span lang="EN-US">(</span><span>这里等价于</span><span lang="EN-US">//BBB)</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>BCC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BEC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DBD</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>BEC</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//*[starts-with(name(),'B')]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有名称以</span><span lang="EN-US">"B"</span><span>起始的元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">BCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BEC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DBD</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">BEC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//*[contains(name(),'C')]</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有名称包含</span><span lang="EN-US">"C"</span><span>的元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">BCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDB</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BEC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DBD</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">BEC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 10</span></strong></p>
<p align="left"><span>多个路径可以用分隔符</span><span lang="EN-US"> | </span><span>合并在一起</span></p>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">//CCC | //BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有的</span><span lang="EN-US">CCC</span><span>和</span><span lang="EN-US">BBB</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>EEE</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA/EEE | //BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择所有的</span><span lang="EN-US">BBB</span><span>元素和所有是</span><span lang="EN-US">AAA</span><span>的子元素的</span><span lang="EN-US">EEE</span><span>元素</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">EEE</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA/EEE | //DDD/CCC | /AAA | //BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>可以合并的路径数目没有限制</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>DDD</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">EEE</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><span lang="EN-US">&nbsp;</span></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 11</span></strong></p>
<p align="left"><span lang="EN-US">child</span><span>轴</span><span lang="EN-US">(axis)</span><span>包含上下文节点的子元素</span><span lang="EN-US">, </span><span>作为默认的轴</span><span lang="EN-US">,</span><span>可以忽略不写</span><span lang="EN-US">. </span></p>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>等价于</span><span lang="EN-US"> /child::AAA</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/child::AAA</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>等价于</span><span lang="EN-US">/AAA</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>BBB</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/AAA/BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>等价于</span><span lang="EN-US">/child::AAA/child::BBB</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/child::AAA/child::BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>等价于</span><span lang="EN-US">/AAA/BBB</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/child::AAA/BBB</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>二者都可以被合并</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>AAA</span>&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span>CCC</span>/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/<span>AAA</span>&gt; </span></strong><strong></strong></p>
</td>
</tr>
</tbody>
</table>
<p><strong><span lang="EN-US">&nbsp;</span></strong></p>
<p><strong><span lang="EN-US">&nbsp;</span></strong></p>
<p><strong><span lang="EN-US">&nbsp;</span></strong></p>
<p><strong><span lang="EN-US">&nbsp;</span></strong></p>
<p><strong><span>实例</span></strong><strong><span lang="EN-US"> 12</span></strong></p>
<p align="left"><span lang="EN-US">descendant (</span><span>后代</span><span lang="EN-US">)</span><span>轴包含上下文节点的后代</span><span lang="EN-US">,</span><span>一个后代是指子节点或者子节点的子节点等等</span><span lang="EN-US">, </span><span>因此</span><span lang="EN-US">descendant</span><span>轴不会包含属性和命名空间节点</span><span lang="EN-US">. </span></p>
<p><span lang="EN-US">&nbsp; </span></p>
<table border="1" width="85%" cellpadding="0">
<tbody>
<tr>
<td>
<p align="center"><strong><span lang="EN-US">/descendant::*</span></strong><strong></strong></p>
</td>
</tr>
<tr>
<td>
<p><span>选择文档根元素的所有后代</span><span lang="EN-US">.</span><span>即所有的元素被选择</span></p>
</td>
</tr>
<tr>
<td>
<p><strong><span lang="EN-US"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">AAA</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">EEE</span></strong></span><strong><span lang="EN-US">/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/</span></strong><span><strong><span lang="EN-US">BBB</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">CCC</span></strong></span><strong><span lang="EN-US">&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;</span></strong><span><strong><span lang="EN-US">DDD</span></strong></span></p></td></tr></tbody></table>
          <br/>
          <span style="color:red;">
            <a href="http://zyjwy02.javaeye.com/blog/230764#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 17:04:30 +0800</pubDate>
        <link>http://zyjwy02.javaeye.com/blog/230764</link>
        <guid>http://zyjwy02.javaeye.com/blog/230764</guid>
      </item>
      <item>
        <title>编写对GC友好，又不泄漏的代码</title>
        <author>zyjwy02</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyjwy02.javaeye.com">zyjwy02</a>&nbsp;
          链接：<a href="http://zyjwy02.javaeye.com/blog/230637" style="color:red;">http://zyjwy02.javaeye.com/blog/230637</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;作者：<a href="http://blog.csdn.net/calvinxiu/"><span style="color: #669966;">江南白衣</span></a>，最新版链接：<a href="http://blog.csdn.net/calvinxiu/archive/2007/05/22/1621051.aspx"><span style="color: #669966;">http://blog.csdn.net/calvinxiu/archive/2007/05/22/1621051.aspx</span></a>，版权所有，转载请保留原文链接。 </p>
<p>&nbsp;&nbsp;&nbsp; 看到JavaOne2007上有篇《Garbage-Collection-Friendly Programming》的68页PPT，心想都2007了还谈这个基本问题，一定总结得很全面了才好意思站出来讲吧。&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>GC的基础概念见上篇：<a href="http://blog.csdn.net/calvinxiu/archive/2007/05/18/1614473.aspx" target="_blank"><span style="color: #000000;">JDK5.0垃圾收集优化之--Don't Pause</span></a>&nbsp;&nbsp;</p>
<p><strong>1.使用更多生命周期短的、小的、不改变指向(immutable)的对象，编写清晰的代码。</strong> </p>
<p>&nbsp;&nbsp;&nbsp; 出于懒惰也好，朴素的节俭意识也好，我们都习惯对一个变量重用再重用。但是.... </p>
<ul>
<li>Java的垃圾收集器喜欢短生命周期的对象，对象如果在新生代内，在垃圾收集发生前就死掉了，垃圾收集器就什么都不用做了。 </li>
<li>现代JVM构建一个新对象只需要10个本地CPU指令，并不弱于C/C++。 (但垃圾收集没有压缩算法时会稍慢，更频繁的New对象也导致更频繁的GC)。 </li>
<li>大对象的分配效率更低，而且对非压缩算法的垃圾收集器，更容易造成碎片。 </li>
<li>对象重用增加了代码的复杂度，降低了可读性。 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;所以有标题的呼吁，比如不要害怕为中间结果分配小对象。但编程习惯的改变也不是一朝一夕的事情。 </p>
<p><strong></strong></p>
<p><strong>2.将用完的对象设为NULL其实没什么作用。</strong> </p>
<p>&nbsp;&nbsp;&nbsp; 貌似很酷的把对象主动设为Null 的"好习惯"其实没什么用，JIT Compiler会自动分析local变量的生命周期。<br />&nbsp;&nbsp;&nbsp; 只有一个例外情况，就是String[1024] foo 这种赤裸裸的数组，你需要主动的foo[100]=null释放第100号元素，所以最好还是直接用ArrayList这些标准库算了。 </p>
<p>&nbsp;</p>
<p><strong>3.避免显式GC--System.gc()。</strong> </p>
<p>&nbsp;&nbsp;&nbsp; 大家都知道System.gc()不好，full-gc浪费巨大，gc的时机把握不一定对等等，甚至有-XX:+DisableExplicitGC的JVM参数来禁止它。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;哈哈，但我还不会用System.gc()呢，不怕不怕。真的不怕吗？ </p>
<ul>
<li>先用<a href="http://findbugs.sourceforge.net/"><span style="color: #669966;">FindBugs</span></a> 查一下所用到的全部第三方类库吧... </li>
<li>至少RMI 就会老实不客气的执行System.gc()来实现分布式GC算法。但我也不会用RMI啊。那EJB呢，EJB可是建在RMI上的.... </li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 如果无可避免，用-Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 (单位为微妙) 增大大GC的间隔(原默认值为1分钟)，-XX:+ExplicitGCInvokesConcurrent 让System.gc() 也CMS并发执行。 </p>
<p>&nbsp;</p>
<p><strong>4.继续千夫所指的finalize()</strong> </p>
<p><strong></strong>&nbsp;&nbsp;&nbsp; 大家也都知道finalize()不好，分配代价昂贵，释放代价更昂贵(要多走一个循环，而且他们死得慢，和他们相关联的对象也跟着死得慢了)，又不确定能否被调用(JVM开始关闭时，就不会再进行垃圾收集)，又不确定何时被调用(GC时间不定，即使system.gc()也只是提醒而不是强迫GC，又不确定以什么样的顺序调用，所以finalize不是C++的析构函数，也不像C++的析构函数。 </p>
<p>&nbsp;&nbsp; 我们都知道啊，所以我从来都没使用。都是在显式的维护那些外部资源，比如在finally{}里释放。 </p>
<p>&nbsp;</p>
<p><strong>5.WeakReference/SoftReference</strong> </p>
<p>&nbsp;&nbsp; 这是个平时不怎么会搭理，偶然知道了又觉得有用的Java特征。大家都知道Java里所有对象除int等基本类型外，都是Pass by Reference的指针，实例只要被一个对象连着，就不会被收集。<br />&nbsp;&nbsp;&nbsp; 而WeakReference就是真正意义上的C++指针，只是单纯的指向一个对象，而不会影响对象的引用计数。<br />&nbsp;&nbsp;&nbsp; 而SoftReference更特别，在内存足够时，对象会因为SoftReference的存在而不被收集，但内存不足时，对象就还是会被收集，怎么看都是做简单缓存的料子。代码如下： <br /></p>
<div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 95%; word-break: break-all; padding-top: 4px; border: windowtext 0.5pt solid;">
<div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000;">&nbsp;&nbsp;Foo&nbsp;foo&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Foo();&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;SoftReference&nbsp;sr</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SoftReference(foo);&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;Foo&nbsp;bar&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;&nbsp;sr.get();&nbsp;</span></div>
</div>
<p>&nbsp; 如果foo已被垃圾收集，sr.get()会返回Null; </p>
<p>&nbsp; 另外还有一个ReferenceQueue的机制，使得对象被回收时能获得通知，比finalize()完全不知道GC何时会执行要聪明的多。 <br /></p>
<div style="padding-right: 5.4pt; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; width: 95%; word-break: break-all; padding-top: 4px; border: windowtext 0.5pt solid;">
<div><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000;">&nbsp;&nbsp;ReferenceQueue&nbsp;rq&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ReferenceQueue();<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;ref&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;WeakReference(foo,&nbsp;rq);&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;WeakReference&nbsp;cleaned&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;rq.pool();&nbsp;<br /><img src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" alt="" /></span></div>
</div>
<p>&nbsp; cleaned就是刚刚被GC掉的WeakReference。</p>
<p><strong>6.内存泄漏</strong> </p>
<p><strong></strong>&nbsp;&nbsp; java 不是有垃圾收集器了吗？怎么还泄漏啊，唬我啊？？<br />&nbsp;&nbsp; 嗯，此泄漏非比泄漏。C/C++的泄漏，是对象已不可到达，而内存又没有回收，真正的内存黑洞。<br />&nbsp;&nbsp; 而Java的泄漏，则是因为各种原因，对象对应用已经无用，但一直被持有，一直可到达。<br />&nbsp;&nbsp; 总结原因无外乎几方面： </p>
<ol>
<li>被生命周期极长的集合类不当持有，号称是Java内存泄漏的首因。<br />这些集合类的生命周期通常极长，而且是一个辅助管理性质的对象，在一个业务事务运行完后，如果没有将某个业务对象主动的从中清除的话，这个集合就会吃越来越多内存，可以用WeakReference，如WeakHashMap，使得它持有的对象不增加对象的引用数。 </li>
<li>Scope定义不对，这个很简单了，方法的局部变量定义成类的变量，类的静态变量等。 </li>
<li>异常时没有加finally{}来释放某些资源，JDBC时代也是很普遍的事情。 </li>
<li>另外一些我了解不深的原因，如：Swing里的Listener没有显式remove；内部类持有外部对象的隐式引用；Finalizers造成关联对象没有被及时清空等。 </li>
</ol>
<p><strong>内存泄漏的检测</strong> </p>
<p>有不少工具辅助做这个事情的，如果手上一个工具也没有，可以用JDK自带的小工具： </p>
<ul>
<li>看看谁占满了Heap？<br />用JDK6的jmap可以显示运行程序中对象的类型，个数与所占的大小<br />先用jps 找到进程号，然后jmap -histo pid 显示或 jmap -dump:file=heap_file_name pid 导出heap文件 </li>
<li>为什么这些对象仍然可以到达？<br />用jhat(Java Heap Analysis Tool) 分析刚才导出的heap文件。<br />先jhat heap_file_name，然后打开浏览器<a href="http://localhost:7000/"><span style="color: #669966;">http://localhost:7000/</span></a> 浏览。 </li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://zyjwy02.javaeye.com/blog/230637#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 11:57:14 +0800</pubDate>
        <link>http://zyjwy02.javaeye.com/blog/230637</link>
        <guid>http://zyjwy02.javaeye.com/blog/230637</guid>
      </item>
      <item>
        <title>JVM调优总结(转)</title>
        <author>zyjwy02</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyjwy02.javaeye.com">zyjwy02</a>&nbsp;
          链接：<a href="http://zyjwy02.javaeye.com/blog/230404" style="color:red;">http://zyjwy02.javaeye.com/blog/230404</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong><span style="font-size: x-small;">一、相关概念</span></strong> </p>
<p><strong></strong><br /><strong><span style="color: #ff0000;">基本回收算法</span></strong> </p>
<ol>
<li><strong>引用计数（Reference Counting）<br /></strong>比较古老的回收算法。原理是此对象有一个引用，即增加一个计数，删除一个引用则减少一个计数。垃圾回收时，只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。 </li>
<li><strong>标记-清除（Mark-Sweep）<br /></strong>此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象，第二阶段遍历整个堆，把未标记的对象清除。此算法需要暂停整个应用，同时，会产生内存碎片。 </li>
<li><strong>复制（Copying）<br /></strong>此算法把内存空间划为两个相等的区域，每次只使用其中一个区域。垃圾回收时，遍历当前使用区域，把正在使用中的对象复制到另外一个区域中。次算法每次只处理正在使用中的对象，因此复制成本比较小，同时复制过去以后还能进行相应的内存整理，不过出现&ldquo;碎片&rdquo;问题。当然，此算法的缺点也是很明显的，就是需要两倍内存空间。 </li>
<li><strong>标记-整理（Mark-Compact）<br /></strong>此算法结合了&ldquo;标记-清除&rdquo;和&ldquo;复制&rdquo;两个算法的优点。也是分两阶段，第一阶段从根节点开始标记所有被引用对象，第二阶段遍历整个堆，把清除未标记对象并且把存活对象&ldquo;压缩&rdquo;到堆的其中一块，按顺序排放。此算法避免了&ldquo;标记-清除&rdquo;的碎片问题，同时也避免了&ldquo;复制&rdquo;算法的空间问题。 </li>
<li><strong>增量收集（Incremental Collecting）</strong><br />实施垃圾回收算法，即：在应用进行的同时进行垃圾回收。不知道什么原因JDK5.0中的收集器没有使用这种算法的。 </li>
<li><strong>分代（Generational Collecting）<br /></strong>基于对对象生命周期分析后得出的垃圾回收算法。把对象分为年青代、年老代、持久代，对不同生命周期的对象使用不同的算法（上述方式中的一个）进行回收。现在的垃圾回收器（从J2SE1.2开始）都是使用此算法的。 </li>
</ol>
<p><br /><strong><span style="color: #ff0000;">分代垃圾回收详述</span></strong></p>
<p><img src="http://lh3.google.com/pengjiaheng/Ron7MqXPDPI/AAAAAAAAAH0/Ulzfr9RZX9o/Java%20SE%206%20HotSpot[tm]%20Virtual%20Machine%20Garbage%20Collection%20Tuning_1183357573109.JPG" height="425" alt="" width="654" /><br />如上图所示，为Java堆中的各代分布。 </p>
<ol>
<li><strong>Young（年轻代）<br /></strong>年轻代分三个区。一个Eden区，两个Survivor区。大部分对象在Eden区中生成。当Eden区满时，还存活的对象将被复制到Survivor区（两个中的一个），当这个Survivor区满时，此区的存活对象将被复制到另外一个Survivor区，当这个Survivor去也满了的时候，从第一个Survivor区复制过来的并且此时还存活的对象，将被复制&ldquo;年老区(Tenured)&rdquo;。需要注意，Survivor的两个区是对称的，没先后关系，所以同一个区中可能同时存在从Eden复制过来 对象，和从前一个Survivor复制过来的对象，而复制到年老区的只有从第一个Survivor去过来的对象。而且，Survivor区总有一个是空的。 </li>
<li><strong>Tenured（年老代）<br /></strong>年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。 </li>
<li><strong>Perm（持久代）<br /></strong>用于存放静态文件，如今Java类、方法等。持久代对垃圾回收没有显著影响，但是有些应用可能动态生成或者调用一些class，例如Hibernate等，在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=&lt;N&gt;进行设置。</li>
</ol>
<p><br /><strong><span style="color: #ff0000;">GC类型</span><br /></strong>GC有两种类型：<strong>Scavenge GC和Full GC</strong>。 </p>
<ol>
<li>Scavenge GC<br />一般情况下，当新对象生成，并且在Eden申请空间失败时，就好触发Scavenge GC，堆Eden区域进行GC，清除非存活对象，并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。 </li>
<li>Full GC<br />对整个堆进行整理，包括Young、Tenured和Perm。Full GC比Scavenge GC要慢，因此应该尽可能减少Full GC。有如下原因可能导致Full GC： 
<ul>
<li>Tenured被写满 </li>
</ul>
<ul>
<li>Perm域被写满 </li>
</ul>
<ul>
<li>System.gc()被显示调用 </li>
</ul>
<ul>
<li>上一次GC之后Heap的各域分配策略动态变化 </li>
</ul>
</li>
</ol>
<p><br /><strong><span style="color: #ff0000;">分代垃圾回收过程演示</span></strong><br /><img src="http://lh4.google.com/pengjiaheng/RosphaXPDZI/AAAAAAAAAJY/5g7J7TqR2pI/1.JPG?imgmax=576" alt="" /><br /><img src="http://lh4.google.com/pengjiaheng/RosphaXPDaI/AAAAAAAAAJg/k1Z_u32zD0Y/2.JPG?imgmax=576" alt="" /><br /><img src="http://lh4.google.com/pengjiaheng/RosphaXPDbI/AAAAAAAAAJo/e3bRlUcld3Q/3.JPG?imgmax=576" alt="" /><br /><img src="http://lh4.google.com/pengjiaheng/RosphaXPDcI/AAAAAAAAAJw/Q-M__ID-k_0/4.JPG?imgmax=576" alt="" /> </p>
<p><br /><strong><span style="font-size: x-small;">二、垃圾回收器</span></strong> </p>
<p><strong><span style="font-size: x-small;"><br /></span></strong>目前的收集器主要有三种：<strong>串行收集器、并行收集器、并发收集器</strong>。 </p>
<ol>
<li><strong>串行收集器</strong><br /><img src="http://lh3.google.com/pengjiaheng/Ron7MqXPDTI/AAAAAAAAAIU/FKFnXwdLz-4/%E4%B8%B2%E8%A1%8C%E6%94%B6%E9%9B%86%E5%99%A8.JPG" height="390" alt="" width="713" /><br />使用单线程处理所有垃圾回收工作，因为无需多线程交互，所以效率比较高。但是，也无法使用多处理器的优势，所以此收集器适合单处理器机器。当然，此收集器也可以用在小数据量（<strong>100M</strong>左右）情况下的多处理器机器上。可以使用<strong>-XX:+UseSerialGC</strong>打开。<br /></li>
<li><strong>并行收集器<br /></strong><img src="http://lh3.google.com/pengjiaheng/Ron7MqXPDSI/AAAAAAAAAIM/YClzvXUk5A4/%E5%B9%B6%E8%A1%8C%E6%94%B6%E9%9B%86%E5%99%A8.JPG" alt="" /> <ol>
<li>对年轻代进行并行垃圾回收，因此可以减少垃圾回收时间。一般在多线程多处理器机器上使用。使用<strong>-XX:+UseParallelGC</strong>.打开。并行收集器在J2SE5.0第六6更新上引入，在Java SE6.0中进行了增强--可以堆年老代进行并行收集。<strong>如果年老代不使用并发收集的话，是使用单线程进行垃圾回收</strong>，因此会制约扩展能力。使用<strong>-XX:+UseParallelOldGC</strong>打开。 </li>
<li>使用<strong>-XX:ParallelGCThreads=&lt;N&gt;</strong>设置并行垃圾回收的线程数。<strong>此值可以设置与机器处理器数量相等</strong>。 </li>
<li>此收集器可以进行如下配置： 
<ul>
<li><strong>最大垃圾回收暂停:</strong>指定垃圾回收时的最长暂停时间，通过<strong>-XX:MaxGCPauseMillis=&lt;N&gt;</strong>指定。&lt;N&gt;为毫秒.如果指定了此值的话，<strong>堆大小和垃圾回收相关参数会进行调整以达到指定值</strong>。设定此值可能会减少应用的吞吐量。 </li>
<li><strong>吞吐量:</strong>吞吐量为<strong>垃圾回收时间与非垃圾回收时间的比值</strong>，通过<strong>-XX:GCTimeRatio=&lt;N&gt;</strong>来设定，公式为<strong>1/（1+N）</strong>。例如，-XX:GCTimeRatio=19时，表示5%的时间用于垃圾回收。默认情况为99，即1%的时间用于垃圾回收。</li>
</ul>
</li>
</ol></li>
<li><strong>并发收集器<br /></strong>可以保证大部分工作都并发进行（应用不停止），垃圾回收只暂停很少的时间，此收集器适合对响应时间要求比较高的中、大规模应用。使用<strong>-XX:+UseConcMarkSweepGC</strong>打开。<br /><img src="http://lh3.google.com/pengjiaheng/Ron7MqXPDRI/AAAAAAAAAIE/HnA7UnjlqQ4/%E5%B9%B6%E5%8F%91%E6%94%B6%E9%9B%86%E5%99%A8.JPG" height="413" alt="" width="834" /> <ol>
<li>并发收集器主要减少年老代的暂停时间，他在应用不停止的情况下使用独立的垃圾回收线程，跟踪可达对象。在每个年老代垃圾回收周期中，在收集初期并发收集器会对整个应用进行简短的暂停，在收集中还会再暂停一次。第二次暂停会比第一次稍长，在此过程中多个线程同时进行垃圾回收工作。 </li>
<li>并发收集器使用<strong>处理器换来短暂的停顿时间</strong>。在一个N个处理器的系统上，并发收集部分使用<strong>K/N</strong>个可用处理器进行回收，一般情况下<strong>1&lt;=K&lt;=N/4</strong>。 </li>
<li>在只有<strong>一个处理器的主机上使用并发收集器</strong>，设置为<strong>incremental mode</strong>模式也可获得较短的停顿时间。 </li>
<li><strong>浮动垃圾</strong>：由于在应用运行的同时进行垃圾回收，所以有些垃圾可能在垃圾回收进行完成时产生，这样就造成了&ldquo;Floating Garbage&rdquo;，这些垃圾需要在下次垃圾回收周期时才能回收掉。所以，并发收集器一般需要<strong>20%</strong>的预留空间用于这些浮动垃圾。 </li>
<li><strong>Concurrent Mode Failure</strong>：并发收集器在应用运行时进行收集，所以需要保证堆在垃圾回收的这段时间有足够的空间供程序使用，否则，垃圾回收还未完成，堆空间先满了。这种情况下将会发生&ldquo;并发模式失败&rdquo;，此时整个应用将会暂停，进行垃圾回收。 </li>
<li><strong>启动并发收集器</strong>：因为并发收集在应用运行时进行收集，所以必须保证收集完成之前有足够的内存空间供程序使用，否则会出现&ldquo;Concurrent Mode Failure&rdquo;。通过设置<strong>-XX:CMSInitiatingOccupancyFraction=&lt;N&gt;</strong>指定还有多少剩余堆时开始执行并发收集</li>
</ol></li>
<li><strong>小结</strong> 
<ul>
<li><strong>串行处理器：</strong><br />&nbsp;--适用情况：数据量比较小（100M左右）；单处理器下并且对响应时间无要求的应用。<br />&nbsp;--缺点：只能用于小型应用 </li>
<li><strong>并行处理器：</strong><br />&nbsp;--适用情况：&ldquo;对吞吐量有高要求&rdquo;，多CPU、对应用响应时间无要求的中、大型应用。举例：后台处理、科学计算。<br />&nbsp;--缺点：应用响应时间可能较长 </li>
<li><strong>并发处理器：<br /></strong>&nbsp;--适用情况：&ldquo;对响应时间有高要求&rdquo;，多CPU、对应用响应时间有较高要求的中、大型应用。举例：Web服务器/应用服务器、电信交换、集成开发环境。</li>
</ul>
</li>
</ol>
<p><br /><strong><span style="font-size: x-small;">三、常见配置举例</span></strong></p>
<ol>
<li><strong>堆大小设置<br /></strong>JVM 中最大堆大小有三方面限制：相关操作系统的数据模型（32-bt还是64-bit）限制；系统的可用虚拟内存限制；系统的可用物理内存限制。32位系统下，一般限制在1.5G~2G；64为操作系统对内存无限制。我在Windows Server 2003 系统，3.5G物理内存，JDK5.0下测试，最大可设置为1478m。<br /><code><strong>典型设置：</strong></code> 
<ul>
<li><code>java <strong>-Xmx3550m -Xms3550m -Xmn2g</strong> </code><code><strong>-Xss128k</strong><br /></code><code><strong>-</strong></code><code><strong>Xmx3550m</strong>：设置JVM最大可用内存为3550M。<br /></code><code><strong>-Xms3550m</strong></code><code>：设置JVM促使内存为3550m。此值可以设置与-Xmx相同，以避免每次垃圾回收完成后JVM重新分配内存。<br /></code><code><strong><span style="color: #ff0000;">-Xmn2g</span></strong></code><code>：设置年轻代大小为2G。<strong><span style="color: #0000ff;">整个堆大小=年轻代大小 + 年老代大小 + 持久代大小</span></strong>。持久代一般固定大小为64m，所以增大年轻代后，将会减小年老代大小。此值对系统性能影响较大，Sun官方推荐配置为整个堆的3/8。<br /></code><code><strong>-Xss128k</strong></code><code>：设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M，以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下，减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的，不能无限生成，经验值在3000~5000左右。<br /></code></li>
<li><code>java -Xmx3550m -Xms3550m </code><code>-Xss128k <strong>-XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0</strong></code><br /><code><strong>-XX:NewRatio=4</strong></code><code>:设置年轻代（包括Eden和两个Survivor区）与年老代的比值（除去持久代）。设置为4，则年轻代与年老代所占比值为1：4，年轻代占整个堆栈的1/5<br /></code><code><strong>-XX:SurvivorRatio=4</strong></code>：设置年轻代中Eden区与Survivor区的大小比值。设置为4，则两个Survivor区与一个Eden区的比值为2:4，一个Survivor区占整个年轻代的1/6<br /><code><strong>-XX:MaxPermSize=16m</strong></code>:设置持久代大小为16m。<br /><code><strong>-XX:MaxTenuringThreshold=0</strong></code><code>：设置垃圾最大年龄。<strong><span style="color: #0000ff;">如果设置为0的话，则年轻代对象不经过Survivor区，直接进入年老代</span></strong>。对于年老代比较多的应用，可以提高效率。<strong><span style="color: #0000ff;">如果将此值设置为一个较大值，则年轻代对象会在Survivor区进行多次复制，这样可以增加对象再年轻代的存活时间</span></strong>，增加在年轻代即被回收的概论。</code></li>
</ul>
</li>
<li><strong>回收器选择<br /></strong>JVM给了三种选择：<strong>串行收集器、并行收集器、并发收集器</strong>，但是串行收集器只适用于小数据量的情况，所以这里的选择主要针对并行收集器和并发收集器。默认情况下，JDK5.0以前都是使用串行收集器，如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后，JVM会根据当前<a href="http://java.sun.com/j2se/1.5.0/docs/guide/vm/server-class.html"><span style="color: #8c7d18;">系统配置</span></a>进行判断。 <ol>
<li><strong>吞吐量优先</strong>的并行收集器<br />如上文所述，并行收集器主要以到达一定的吞吐量为目标，适用于科学技术和后台处理等。<br /><strong>典型配置</strong>： 
<ul>
<li><code>java -Xmx3800m -Xms3800m -Xmn2g -Xss128k <strong>-XX:+UseParallelGC -XX:ParallelGCThreads=20</strong><br /></code><code><strong>-XX:+UseParallelGC</strong></code><code>：选择垃圾收集器为并行收集器。<strong><span style="color: #0000ff;">此配置仅对年轻代有效。即上述配置下，年轻代使用并发收集，而年老代仍旧使用串行收集。<br /></span></strong></code><code><strong>-XX:ParallelGCThreads=20</strong></code><code>：配置并行收集器的线程数，即：同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。<br /></code></li>
<li><code>java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 <strong>-XX:+UseParallelOldGC<br /></strong></code><code><strong>-XX:+UseParallelOldGC</strong></code><code>：配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。<br /></code></li>
<li><code>java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC&nbsp; <strong>-XX:MaxGCPauseMillis=100<br /></strong></code><code><strong>-XX:MaxGCPauseMillis=100</strong></code><code><strong>:</strong>设置每次年轻代垃圾回收的最长时间，如果无法满足此时间，JVM会自动调整年轻代大小，以满足此值。<br /></code></li>
<li><code>java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC&nbsp; -XX:MaxGCPauseMillis=100 </code><strong>-XX:+UseAdaptiveSizePolicy<br />-XX:+UseAdaptiveSizePolicy</strong>：设置此选项后，并行收集器会自动选择年轻代区大小和相应的Survivor区比例，以达到目标系统规定的最低相应时间或者收集频率等，此值建议使用并行收集器时，一直打开。<br /></li>
</ul>
</li>
<li><strong>响应时间优先</strong>的并发收集器<br />如上文所述，并发收集器主要是保证系统的响应时间，减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。<br /><strong>典型配置</strong>： 
<ul>
<li><code>java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 <strong>-XX:+UseConcMarkSweepGC -XX:+UseParNewGC<br /></strong></code><code><strong>-XX:+UseConcMarkSweepGC</strong></code><code>：设置年老代为并发收集。测试中配置这个以后，</code><code>-XX:NewRatio=4的配置失效了，原因不明。所以，此时年轻代大小最好用-Xmn设置。</code><br /><code><strong>-XX:+UseParNewGC</strong></code><code>:</code><code>设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上，JVM会根据系统配置自行设置，所以无需再设置此值。</code> </li>
<li><code>java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC </code><strong><code>-XX:CMSFullGCsBeforeCompaction=5 </code>-XX:+UseCMSCompactAtFullCollection</strong><br /><code><strong>-XX:CMSFullGCsBeforeCompaction</strong>：由于并发收集器不对内存空间进行压缩、整理，所以运行一段时间以后会产生&ldquo;碎片&rdquo;，使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。<br /></code><strong>-XX:+UseCMSCompactAtFullCollection</strong>：打开对年老代的压缩。可能会影响性能，但是可以消除碎片<br /></li>
</ul>
</li>
</ol></li>
<li><strong>辅助信息<br /></strong>JVM提供了大量命令行参数，打印信息，供调试使用。主要有以下一些： 
<ul>
<li><strong>-XX:+PrintGC<br /></strong>输出形式<strong>：[GC 118250K-&gt;113543K(130112K), 0.0094143 secs] </strong>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Full GC 121376K-&gt;10414K(130112K), 0.0650971 secs]</strong> </p>
</li>
<li><strong>-XX:+PrintGCDetails<br /></strong>输出形式<strong>：[GC [DefNew: 8614K-&gt;781K(9088K), 0.0123035 secs] 118250K-&gt;113543K(130112K), 0.0124633 secs] </strong>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [GC [DefNew: 8614K-&gt;8614K(9088K), 0.0000665 secs][Tenured: 112761K-&gt;10414K(121024K), 0.0433488 secs] 121376K-&gt;10414K(130112K), 0.0436268 secs]</strong> </p>
</li>
<li><strong>-XX:+PrintGCTimeStamps</strong> -XX:+PrintGC：PrintGCTimeStamps可与上面两个混合使用<br />输出形式：<strong>11.851: [GC 98328K-&gt;93620K(130112K), 0.0082960 secs]<br /></strong></li>
<li><strong>-XX:+PrintGCApplicationConcurrentTime:</strong>打印每次垃圾回收前，程序未中断的执行时间。可与上面混合使用<br />输出形式：<strong>Application time: 0.5291524 seconds<br /></strong></li>
<li><strong>-XX:+PrintGCApplicationStoppedTime</strong>：打印垃圾回收期间程序暂停的时间。可与上面混合使用<br />输出形式：<strong>Total time for which application threads were stopped: 0.0468229 seconds<br /></strong></li>
<li><strong>-XX:PrintHeapAtGC</strong>:打印GC前后的详细堆栈信息<br />输出形式：<br />34.702: [GC {Heap before gc invocations=7:<br />&nbsp;def new generation&nbsp;&nbsp; total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)<br /><strong>eden space 49152K,&nbsp; 99% used</strong> [0x1ebd0000, 0x21bce430, 0x21bd0000)<br /><strong>from space 6144K,&nbsp; 55% used</strong> [0x221d0000, 0x22527e10, 0x227d0000)<br />&nbsp; to&nbsp;&nbsp; space 6144K,&nbsp;&nbsp; 0% used [0x21bd0000, 0x21bd0000, 0x221d0000)<br />&nbsp;tenured generation&nbsp;&nbsp; total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000)<br /><strong>the space 69632K,&nbsp;&nbsp; 3% used</strong> [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000)<br />&nbsp;compacting perm gen&nbsp; total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)<br />&nbsp;&nbsp; the space 8192K,&nbsp; 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)<br />&nbsp;&nbsp;&nbsp; ro space 8192K,&nbsp; 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)<br />&nbsp;&nbsp;&nbsp; rw space 12288K,&nbsp; 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)<br />34.735: [DefNew: 52568K-&gt;3433K(55296K), 0.0072126 secs] 55264K-&gt;6615K(124928K)<strong>Heap after gc invocations=8:<br /></strong>&nbsp;def new generation&nbsp;&nbsp; total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000)<br /><strong>eden space 49152K,&nbsp;&nbsp; 0% used</strong> [0x1ebd0000, 0x1ebd0000, 0x21bd0000)<br />&nbsp; from space 6144K,&nbsp; 55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000)<br />&nbsp; to&nbsp;&nbsp; space 6144K,&nbsp;&nbsp; 0% used [0x221d0000, 0x221d0000, 0x227d0000)<br />&nbsp;tenured generation&nbsp;&nbsp; total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000)<br /><strong>the space 69632K,&nbsp;&nbsp; 4% used </strong>[0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000)<br />&nbsp;compacting perm gen&nbsp; total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)<br />&nbsp;&nbsp; the space 8192K,&nbsp; 35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)<br />&nbsp;&nbsp;&nbsp; ro space 8192K,&nbsp; 66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)<br />&nbsp;&nbsp;&nbsp; rw space 12288K,&nbsp; 46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)<br />}<br />, 0.0757599 secs]<br /></li>
<li><strong>-Xloggc:filename</strong>:与上面几个配合使用，把相关日志信息记录到文件以便分析。</li>
</ul>
</li>
<li><strong>常见配置汇总</strong> <ol>
<li>堆设置 
<ul>
<li><strong>-Xms</strong>:初始堆大小 </li>
<li><strong>-Xmx</strong>:最大堆大小 </li>
<li><strong>-XX:NewSize=n</strong>:设置年轻代大小 </li>
<li><strong>-XX:NewRatio=n:</strong>设置年轻代和年老代的比值。如:为3，表示年轻代与年老代比值为1：3，年轻代占整个年轻代年老代和的1/4 </li>
<li><strong>-XX:SurvivorRatio=n</strong>:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如：3，表示Eden：Survivor=3：2，一个Survivor区占整个年轻代的1/5 </li>
<li><strong>-XX:MaxPermSize=n</strong>:设置持久代大小</li>
</ul>
</li>
<li>收集器设置 
<ul>
<li><strong>-XX:+UseSerialGC</strong>:设置串行收集器 </li>
<li><strong>-XX:+UseParallelGC</strong>:设置并行收集器 </li>
<li><strong>-XX:+UseParalledlOldGC</strong>:设置并行年老代收集器 </li>
<li><strong>-XX:+UseConcMarkSweepGC</strong>:设置并发收集器</li>
</ul>
</li>
<li>垃圾回收统计信息 
<ul>
<li><strong>-XX:+PrintGC</strong> </li>
<li><strong>-XX:+PrintGCDetails</strong> </li>
<li><strong>-XX:+PrintGCTimeStamps</strong> </li>
<li><strong>-Xloggc:filename</strong></li>
</ul>
</li>
<li>并行收集器设置 
<ul>
<li><strong>-XX:ParallelGCThreads=n</strong>:设置并行收集器收集时使用的CPU数。并行收集线程数。 </li>
<li><strong>-XX:MaxGCPauseMillis=n</strong>:设置并行收集最大暂停时间 </li>
<li><strong>-XX:GCTimeRatio=n</strong>:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)</li>
</ul>
</li>
<li>并发收集器设置 
<ul>
<li><strong>-XX:+CMSIncrementalMode</strong>:设置为增量模式。适用于单CPU情况。 </li>
<li><strong>-XX:ParallelGCThreads=n</strong>:设置并发收集器年轻代收集方式为并行收集时，使用的CPU数。并行收集线程数。</li>
</ul>
</li>
</ol></li>
</ol>
<p><br /><strong><span style="font-size: x-small;">四、调优总结</span></strong></p>
<ol>
<li><strong>年轻代大小选择</strong> 
<ul>
<li><strong>响应时间优先的应用</strong>：<strong><span style="color: #0000ff;">尽可能设大，直到接近系统的最低响应时间限制</span></strong>（根据实际情况选择）。在此种情况下，年轻代收集发生的频率也是最小的。同时，减少到达年老代的对象。 </li>
<li><strong>吞吐量优先的应用</strong>：尽可能的设置大，可能到达Gbit的程度。因为对响应时间没有要求，垃圾收集可以并行进行，一般适合8CPU以上的应用。</li>
</ul>
</li>
<li><strong>年老代大小选择</strong> 
<ul>
<li><strong>响应时间优先的应用</strong>：年老代使用并发收集器，所以其大小需要小心设置，一般要考虑<strong>并发会话率</strong>和<strong>会话持续时间</strong>等一些参数。如果堆设置小了，可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式；如果堆大了，则需要较长的收集时间。最优化的方案，一般需要参考以下数据获得： 
<ul>
<li>并发垃圾收集信息 </li>
<li>持久代并发收集次数 </li>
<li>传统GC信息 </li>
<li>花在年轻代和年老代回收上的时间比例</li>
</ul>
减少年轻代和年老代花费的时间，一般会提高应用的效率<br /></li>
<li><strong>吞吐量优先的应用</strong>：一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是，这样可以尽可能回收掉大部分短期对象，减少中期的对象，而年老代尽存放长期存活对象。</li>
</ul>
</li>
<li><strong>较小堆引起的碎片问题<br /></strong>因为年老代的并发收集器使用标记、清除算法，所以不会对堆进行压缩。当收集器回收时，他会把相邻的空间进行合并，这样可以分配给较大的对象。但是，当堆空间较小时，运行一段时间以后，就会出现&ldquo;碎片&rdquo;，如果并发收集器找不到足够的空间，那么并发收集器将会停止，然后使用传统的标记、清除方式进行回收。如果出现&ldquo;碎片&rdquo;，可能需要进行如下配置： 
<ul>
<li><strong>-XX:+UseCMSCompactAtFullCollection</strong>：使用并发收集器时，开启对年老代的压缩。 </li>
<li><strong>-XX:CMSFullGCsBeforeCompaction=0</strong>：上面配置开启的情况下，这里设置多少次Full GC后，对年老代进行压缩</li>
</ul>
</li>
</ol>
<p><br /><strong><span style="font-size: x-small;">五、参考文献</span></strong></p>
<ul>
<li><a href="http://www.ibm.com/developerworks/cn/java/j-jtp10283/"><span style="color: #8c7d18;">Java 理论与实践: 垃圾收集简史</span></a> </li>
<li><a href="http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#resources"><span style="color: #8c7d18;">Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning</span></a> </li>
<li><a href="http://developers.sun.com/mobility/midp/articles/garbagecollection2/#16.2.6"><span style="color: #8c7d18;">Improving Java Application Performance and Scalability by Reducing Garbage Collection Times and Sizing Memory Using JDK 1.4.1</span></a> </li>
<li><a href="https://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf"><span style="color: #8c7d18;">Hotspot memory management whitepaper</span></a> </li>
<li><a href="http://java.sun.com/performance/reference/whitepapers/tuning.html"><span style="color: #8c7d18;">Java Tuning White Paper</span></a> </li>
<li><a href="http://java.sun.com/docs/hotspot/gc1.4.2/example.html"><span style="color: #8c7d18;">Diagnosing a Garbage Collection problem</span></a> </li>
<li><a href="http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp"><span style="color: #8c7d18;">Java HotSpot VM Options</span></a> </li>
<li><a href="http://blogs.sun.com/watt/resource/jvm-options-list.html"><span style="color: #8c7d18;">A Collection of JVM Options</span></a> </li>
<li><a href="http://java.sun.com/docs/hotspot/gc1.4.2/faq.html"><span style="color: #8c7d18;">Frequently Asked Questions about Garbage Collection in the HotspotTM JavaTM Virtual Machine</span></a></li>
</ul>
          <br/>
          <span style="color:red;">
            <a href="http://zyjwy02.javaeye.com/blog/230404#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 10:36:58 +0800</pubDate>
        <link>http://zyjwy02.javaeye.com/blog/230404</link>
        <guid>http://zyjwy02.javaeye.com/blog/230404</guid>
      </item>
      <item>
        <title>Aptana Ajax库插件---EXT2.0</title>
        <author>zyjwy02</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyjwy02.javaeye.com">zyjwy02</a>&nbsp;
          链接：<a href="http://zyjwy02.javaeye.com/blog/144944" style="color:red;">http://zyjwy02.javaeye.com/blog/144944</a>&nbsp;
          发表时间: 2007年11月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近一直在研究EXT2.0, 觉得EXT2.0真的是太酷了，抑制不住自己激动的心情。 想在网上找了很多资料，还是找不到一个对EXT2.0有很好兼容性的IDE. 以前用过Aptana，确实是个不错的前端开发工具，但现在1.0版本只支持EXT1.1。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 终于在Aptana官方论坛上找到一个帖子，是关于如何制作自己的Ajax Library插件及project wizard，于是按他的思路一直做了下去，最终发现竟然成功了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现把该EXT2.0库插件共享给大家，使用方法：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; (1). 把附件中的<font face="Arial">org.library.ext.2.0.jar文件拷贝到Aptana安装目录下的.......\<font face="Arial">Aptana\Aptana Studio\plugins目录下</font></font></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; (2). 然后重新启动Aptana就可以了，就这么简单！</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 重启后你点击&nbsp;菜单 File--&gt;New--&gt;Project--&gt;Ajax Library Project--&gt;(type project name)--&gt;Select&nbsp; AJax Library下面多了一个</p>
<p>&nbsp;&nbsp;&nbsp; EXT2.0项目。这就说明大功告成了！哈哈，EXT2.0就可以在Aptana 里放心的用了，会有很酷的库函数提示效果哦！</p>
<p>&nbsp;&nbsp; </p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://zyjwy02.javaeye.com/blog/144944#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 29 Nov 2007 22:25:37 +0800</pubDate>
        <link>http://zyjwy02.javaeye.com/blog/144944</link>
        <guid>http://zyjwy02.javaeye.com/blog/144944</guid>
      </item>
      <item>
        <title>ExtJS DWR Spring 强强联姻(转)</title>
        <author>zyjwy02</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyjwy02.javaeye.com">zyjwy02</a>&nbsp;
          链接：<a href="http://zyjwy02.javaeye.com/blog/143731" style="color:red;">http://zyjwy02.javaeye.com/blog/143731</a>&nbsp;
          发表时间: 2007年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>&nbsp;</h2>
<div class="t_msgfont" id="postmessage_2951"><strong><span href="tag.php?name=exjs" class="t_tag" onclick="tagshow(event)">exjs</span> <span href="tag.php?name=dwr" class="t_tag" onclick="tagshow(event)">dwr</span> <span href="tag.php?name=spring" w="38" clickfunc="null" x="268" initialized="true" overfunc="null" unselectable="true" class="t_tag" y="326" id="tag_0.7262640260987312" h="16" outfunc="null">spring</span> 强强联姻</strong><br />
ExtJs 在Web UI已经获得很大的殊荣，但单凭借它 Client UI 还无法霸占BS 那么丰富的应用。。他还要选择 一个Web层与后台一起来交互完成一个完美的系统。<br />
<br />
Extjs的天生丽质的, 完美了融合JQuery,Prototype,<span href="tag.php?name=YUI" class="t_tag" onclick="tagshow(event)">YUI</span>， 和她结合当然也需要出类拔萃，生出名门。 如果采用Java为开发主语言，那么 ExtJS + DWR + SPRING 算是门当户对。<br />
<br />
可惜Extjs 的DataStore 的 prxy 并没有DWR一席，因为DWR返回的是Java对象与<span href="tag.php?name=JSON" class="t_tag" onclick="tagshow(event)">JSON</span>非常像, 然而DWR 的在于它与Web远程Java方法的直接会话，因此有着非常灵活的一面。所以，有时候使用DWR对于J2EE来说，要更好于<span href="tag.php?name=JSON" class="t_tag" onclick="tagshow(event)">JSON</span>，他做了<span href="tag.php?name=JSON" class="t_tag" onclick="tagshow(event)">JSON</span>做不到事.<br />
<br />
<span href="tag.php?name=ext" class="t_tag" onclick="tagshow(event)">ext</span>js官方论坛里已经有人编写了这样的扩展，后经人丰富，现在基本能满足要求了。<br />
DWR扩展代码如下，创建 Ext.data.DWRProxy类。同样也继承Ext.data.<span href="tag.php?name=DataProxy" class="t_tag" onclick="tagshow(event)">DataProxy</span> ，拿来show着解读一下。<br />
<br />
dwr.js<br />
<br />
Ext.data.DWRProxy = function(dwrCall, <span href="tag.php?name=paging" class="t_tag" onclick="tagshow(event)">paging</span>AndSort){<br />
Ext.data.DWRProxy.superclass.constructor.call(this);<br />
this.dwrCall = dwrCall;<br />
//this.args = args;<br />
this.pagingAndSort = (pagingAndSort!=undefined ? pagingAndSort : true);<br />
};<br />
<br />
Ext.extend(Ext.data.DWRProxy, Ext.data.DataProxy, {<br />
load : function(params, reader, callback, scope, arg) {<br />
if(this.fireEvent(&quot;beforeload&quot;, this, params) !== false) {<br />
var sort;<br />
if(params.sort &amp;&amp; params.dir) sort = params.sort + ' ' + params.dir;<br />
else sort = '';<br />
var delegate = this.loadResponse.createDelegate(this, [reader, callback, scope, arg], 1);<br />
var callParams = new Array();<br />
if(arg.arg) {<br />
callParams = arg.arg.slice();<br />
}<br />
<br />
if(this.pagingAndSort) {<br />
callParams.push(params.start);<br />
callParams.push(params.limit);<br />
callParams.push(sort);<br />
}<br />
<br />
callParams.push(delegate);<br />
this.dwrCall.apply(this, callParams);<br />
} else {<br />
callback.call(scope || this, null, arg, false);<br />
}<br />
},<br />
<br />
loadResponse : function(listRange, reader, callback, scope, arg) {<br />
var result;<br />
try {<br />
result = reader.read(listRange);<br />
} catch(e) {<br />
this.fireEvent(&quot;loadexception&quot;, this, null, response, e);<br />
callback.call(scope, null, arg, false);<br />
return;<br />
}<br />
callback.call(scope, result, arg, true);<br />
},<br />
<br />
update : function(dataSet){},<br />
<br />
updateResponse : function(dataSet)<br />
{}<br />
});<br />
<br />
Ext.data.ListRangeReader = function(meta, recordType){<br />
Ext.data.ListRangeReader.superclass.constructor.call(this, meta, recordType);<br />
this.recordType = recordType;<br />
};<br />
Ext.extend(Ext.data.ListRangeReader, Ext.data.DataReader, {<br />
getJsonAccessor: function(){<br />
var re = /[\[\.]/;<br />
return function(expr) {<br />
try {<br />
return(re.test(expr))<br />
? new Function(&quot;obj&quot;, &quot;return obj.&quot; + expr)<br />
: function(obj){<br />
return obj[expr];<br />
};<br />
} catch(e){}<br />
return Ext.emptyFn;<br />
};<br />
}(),<br />
<br />
read : function(o){<br />
var recordType = this.recordType, fields = recordType.prototype.fields;<br />
<br />
//Generate extraction functions for the totalProperty, the root, the id, and for each field<br />
if (!this.ef) {<br />
if(this.meta.totalProperty) {<br />
this.getTotal = this.getJsonAccessor(this.meta.totalProperty);<br />
}<br />
<br />
if(this.meta.successProperty) {<br />
this.getSuccess = this.getJsonAccessor(this.meta.successProperty);<br />
}<br />
<br />
if (this.meta.id) {<br />
var g = this.getJsonAccessor(this.meta.id);<br />
this.getId = function(rec) {<br />
var r = g(rec);<br />
return (r === undefined || r === &quot;&quot;) ? null : r;<br />
};<br />
} else {<br />
this.getId = function(){return null;};<br />
}<br />
this.ef = [];<br />
for(var i = 0; i &lt; fields.length; i++){<br />
f = fields.items<em>;<br />
</em>var map = (f.mapping !== undefined &amp;&amp; f.mapping !== null) ? f.mapping : f.name;<br />
this.ef = this.getJsonAccessor(map);<br />
}<br />
}<br />
<br />
var records = [];<br />
var root = o.data, c = root.length, totalRecords = c, success = true;<br />
<br />
if(this.meta.totalProperty){<br />
var v = parseInt(this.getTotal(o), 10);<br />
if(!isNaN(v)){<br />
totalRecords = v;<br />
}<br />
}<br />
<br />
if(this.meta.successProperty){<br />
var v = this.getSuccess(o);<br />
if(v === false || v === 'false'){<br />
success = false;<br />
}<br />
}<br />
<br />
for(var i = 0; i &lt; c; i++){<br />
var n = root;<br />
var values = {};<br />
var id = this.getId(n);<br />
for(var j = 0; j &lt; fields.length; j++){<br />
f = fields.items[j];<br />
var v = this.ef[j](n);<br />
values[f.name] = f.convert((v !== undefined) ? v : f.defaultValue);<br />
}<br />
var record = new recordType(values, id);<br />
records = record;<br />
}<br />
<br />
return {<br />
success : success,<br />
records : records,<br />
totalRecords : totalRecords<br />
};<br />
}<br />
});<br />
<br />
<br />
<br />
经过改造之后，那么DWR可以像JSON一样，返回的数据作为DataStore<br />
代码片断<br />
<br />
ds = new Ext.data.Store({<br />
proxy: new Ext.data.DWRProxy(TodoService.getItems, true), //TotoService.getItems dwr开放出来的Java获取数据方法<br />
reader: new Ext.data.ListRangeReader(<br />
{id:'id', totalProperty:'totalSize'}, recordType),<br />
remoteSort: true<br />
});<br />
<br />
<br />
<br />
<br />
Spring 实现了强大的管理了后台的JavaBean，干干净净的注入创建了每个对象， DWR天生又是支持Spring，无缝的讲Ｓｐｒｉｎｇ的后台Bean　发布到Web层作为<span href="tag.php?name=JavaScript" class="t_tag" onclick="tagshow(event)">JavaScript</span>对象，和<span href="tag.php?name=JavaScript" class="t_tag" onclick="tagshow(event)">JavaScript</span>方法。中途不需要人工干预写Servlet.<br />
<br />
<br />
<br />
不多说了，　跑了下代码，通过，可以直接下载。<a href="http://blog.totodo.com/download/java-ext.rar" target="_blank">DownLoad to ext-dwr-spring.rar</a></div>
<p class="posttags">搜索更多相关主题的帖子: <a href="http://jstang.5d6d.com/tag-exjs.html" target="_blank">exjs</a> <a href="http://jstang.5d6d.com/tag-dwr.html" target="_blank">dwr</a> <a href="http://jstang.5d6d.com/tag-spring.html" target="_blank">spring</a> <a href="http://jstang.5d6d.com/tag-JSON.html" target="_blank">JSON</a> <a href="http://jstang.5d6d.com/tag-DataProxy.html" target="_blank">DataProxy</a> </p>
          <br/>
          <span style="color:red;">
            <a href="http://zyjwy02.javaeye.com/blog/143731#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 26 Nov 2007 16:22:47 +0800</pubDate>
        <link>http://zyjwy02.javaeye.com/blog/143731</link>
        <guid>http://zyjwy02.javaeye.com/blog/143731</guid>
      </item>
      <item>
        <title>EXT2.0的新特性</title>
        <author>zyjwy02</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zyjwy02.javaeye.com">zyjwy02</a>&nbsp;
          链接：<a href="http://zyjwy02.javaeye.com/blog/143715" style="color:red;">http://zyjwy02.javaeye.com/blog/143715</a>&nbsp;
          发表时间: 2007年11月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <li><a href="http://extjs.com/learn/Ext_1_to_2_Migration_Guide" title="Ext 1 to 2 Migration Guide">Ext 1.x to 2.0升级指南</a> </li>
<li><a href="http://extjs.com/deploy/dev/docs/" title="http://extjs.com/deploy/dev/docs/" class="external text" rel="nofollow">Ext 2.0 API参考</a> </li>
<li><a href="http://extjs.com/deploy/dev/examples/" title="http://extjs.com/deploy/dev/examples/" class="external text" rel="nofollow">Ext 2.0范例</a> </li>
<li>Ext 2.0 Change Log (Coming soon) </li>
<li><a href="http://www.extjs.com/forum" title="http://www.extjs.com/forum" class="external text" rel="nofollow">Ext社区论坛</a> <br />
<p class="learn-intro"><span class="mw-headline"><span class="mw-headline"><strong><font size="3">有关重大改变的几个要点</font></strong></span></span></p>
<p>文章内容是对2.0新变化的综合简述。请留意Ext框架在从1.x跨越到2.0的过程中，经历了无数的细微改进、臭虫修正和其他的改动。 要逐一列出尚难为之，所以本文着重提及架构上有转换的主要地方，和一些全新加入的功能。本文下列的各部分将完整解释这每一项的细节。 </p>
<ul>
    <li><strong>组件模型 Component Model</strong><br />
    在1.x中就有Component和BoxComponent两个类了，但却没有深入整合到框架中去。到2.0，这两个类得到极大的改进并是一切主要组件的基础。 尽管这些类对于开发者而言一般是尽量隐藏细节的，不过打好组件生存周期的基础知识有利于下一步的Ext学习。<a href="http://extjs.com/learn/Ext_2_Overview_%28Chinese%29#Component_Model" title="">参阅详细</a>。 </li>
    <li><strong>容器模型 Container Model</strong><br />
    有几个核心类可用于器件（widgets）的构建和包含其它组件的布局。 <strong>容器Container</strong>为可容纳对象和组件的布局提供一个基础性的构成方式，对于整个Ext框架可视化必不可少。 <strong>面板Panel</strong> 扩展自容器类，为用户程序提供特定功能的UI基类，而且可以说是容器结构层次中最常用的类。 <strong>窗口Window</strong>是面板的一种特殊类型，使得web应用程序如桌面式（desktop-style）那样。<strong>视见区Viewport</strong>是专为全屏幕web程序应用而设计的实用容器 。<a href="http://extjs.com/learn/Ext_2_Overview_%28Chinese%29#Container_Model" title="">参阅详细</a> </li>
    <li><strong>布局Layouts</strong><br />
    1.x中的布局方式围绕在BorderLayout和其相关的几个类。2.0，布局的整体架构建立在新容器类和崭新的布局类上。 BorderLayout现加入到九种风格布局之中。布局类已经是全部重写设计并考虑最大的可扩展性。 布局的管理亦受益于2.0的框架，去掉一些开发者之前需要面对的复杂实现。<a href="http://extjs.com/learn/Ext_2_Overview_%28Chinese%29#Layouts" title="">参阅详细</a> </li>
    <li><strong>Grid</strong><br />
    Grid组件往往都被认为是Ext的核心组件之一，在2.0的版本同时继续演进。新版的用户界面更友好，性能更佳，功能上新加了行摘要、行归组、和一些依靠插件实现的功能如expandable rows和row numbering 等等更多。<a href="http://extjs.com/learn/Ext_2_Overview_%28Chinese%29#Grid" title="">参阅详细</a> </li>
    <li><strong>模板 XTemplate</strong><br />
    1.x的模版类处理一些简单的模版时令人放心，但对于高级的输出任务就缺乏关键的支持。 在2.0中，全新的XTemplate可支持子模版，数组处理，直接代码执行，逻辑判断和更多有用的功能。<a href="http://extjs.com/learn/Ext_2_Overview_%28Chinese%29#XTemplate" title="">参阅详细</a> </li>
    <li><strong>数据视图 DataView</strong><br />
    1.x的模版将数据绑定到模版以生成制定的UI视图。JsonView是快速绑定JSON数据辅助类。2.0的DataView把以上两种方式作统一的处理，不同的是它继承自BoxComponent，可更好地支持各种布局方式，新的XTemplate类为模版处理提供强大的支持。<a href="http://extjs.com/learn/Ext_2_Overview_%28Chinese%29#DataView" title="">参阅详细</a> </li>
    <li><strong>其它新组件</strong><br />
    这些新组件包括动作Action、CycleButton、 Hidden (field)、 ProgressBar和TimeField。<a href="http://extjs.com/learn/Ext_2_Overview_%28Chinese%29#Other_New_Components" title="">参阅详细</a> </li>
</ul>
<a name=".E8.A1.A5.E5.85.85.E8.AF.B4.E6.98.8E"></a>
<h4><span class="editsection"><a href="http://extjs.com/learn/w/index.php?title=Ext_2_Overview_%28Chinese%29&amp;action=edit&amp;section=3" title="Edit section: 补充说明"><img src="http://extjs.com/learn/w/skins/extjs/page_edit.png" alt="" /></a></span> <span class="mw-headline">补充说明</span></h4>
<ul>
    <li><strong>主题</strong><br />
    2.0支持开箱即用的主题，使用为更简化。Ext 1.x支持四套主题，但2.0减少到两套。 如打算自定义Ext的主题，那么Gray主题就是一份不错的蓝本，另外一些<a href="http://extjs.com/learn/Ext_Extensions#Ext_2.0_Themes" title="Ext Extensions">2.0 社区主题</a>也可以提供一些思路或直接使用。 这不是API改动的一部分，但是有需要在这里提及一下。 </li>
    <li><strong>突破性进展</strong><br />
    令人，2.0的一些改动无法做到向后兼容。因为相关的组件和渲染模型已经是从根本上进行修改，许多现有的组件必须舍弃旧1.x的方式重写编写，与1.x的差别较大。 我们提供的<a href="http://extjs.com/learn/Ext_1_to_2_Migration_Guide" title="Ext 1 to 2 Migration Guide">1.x到2.0升级指南</a>希望能解决升级现有Ext 1.x程序的困难。 </li>
</ul>
<a name=".E7.BB.84.E4.BB.B6.E6.A8.A1.E5.9E.8B_Component_Model"></a>
<h3><span class="editsection"><a href="http://extjs.com/learn/w/index.php?title=Ext_2_Overview_%28Chinese%29&amp;action=edit&amp;section=4" title="Edit section: 组件模型 Component Model"><img src="http://extjs.com/learn/w/skins/extjs/page_edit.png" alt="" /></a></span> <span class="mw-headline">组件模型 Component Model</span></h3>
<a name=".E7.BB.84.E4.BB.B6.E6.A6.82.E8.BF.B0"></a>
<h4><span class="editsection"><a href="http://extjs.com/learn/w/index.php?title=Ext_2_Overview_%28Chinese%29&amp;action=edit&amp;section=5" title="Edit section: 组件概述"><img src="http://extjs.com/learn/w/skins/extjs/page_edit.png" alt="" /></a></span> <span class="mw-headline">组件概述</span></h4>
<p>2.0的一个目标就是希望能以简单的代码块构建程序，甚至比以前更简单。 <a href="http://extjs.com/deploy/dev/docs/?class=Ext.Component" title="http://extjs.com/deploy/dev/docs/?class=Ext.Component" class="external text" rel="nofollow">组件Component</a>类最初在1.x引入，却没有全面整合到框架中去。在2.0中，组件所赋予的能力有长足的改进和提升，使得其成为整个架构里最为基础的一个类。组件对象为组件的创建、渲染、事件处理、状态管理和销毁提供了统一的模型，Ext下面的每一个组件具备了这些由组件对象扩展出来的特性。这是2.0组件对象的关键特性： </p>
<ul>
    <li><strong>显式声明构建器链和重写 Explicit constructor chaining and overriding</strong><br />
    组件会将一个基础构造器连同配置传入到子类中。函数<tt>initComponent</tt>用于提供制定的构造器逻辑，只要在继承链上的某一个子类实现便可，所有的组件都遵从此方式。此时的子类就可在<tt>initComponent</tt>中对其设置相关的属性，实现具体的功能。 </li>
    <li><strong>可调控的渲染 Managed rendering</strong><br />
    2.0中，每个组件都支持延时渲染（lazy rendering），又称按需渲染（on-demand rendering）。渲染的调控是自动为你完好的。即使如此，你亦可以通过的<a href="http://extjs.com/deploy/dev/docs/?class=Ext.Component&amp;member=beforerender" title="http://extjs.com/deploy/dev/docs/?class=Ext.Component&amp;member=beforerender" class="external text" rel="nofollow">beforerender</a>和<a href="http://extjs.com/deploy/dev/docs/?class=Ext.Component&amp;member=render" title="http://extjs.com/deploy/dev/docs/?class=Ext.Component&amp;member=render" class="external text" rel="nofollow">render</a>事件控制渲染发生、结束，达到最为灵活的自定义调控。 </li>
    <li><strong>可调控的销毁 Managed destruction</strong><br />
    每一个组件具有<a href="http://extjs.com/deploy/dev/docs/?class=Ext.Component&amp;member=destroy" title="http://extjs.com/deploy/dev/docs/?class=Ext.Component&amp;member=destroy" class="external text" rel="nofollow">destroy</a>的函数，当组件不再需要时，Ext就负责组件的结束调控，如自动垃圾回收和摧毁组件元素。当然，销毁亦提供相应的事件，如<a href="http://extjs.com/deploy/dev/docs/?class=Ext.Component&amp;member=beforedestroy" title="http://extjs.com/deploy/dev/docs/?class=Ext.Component&amp;member=beforedestroy" class="external text" rel="nofollow">beforedestroy</a>和<a href="http://extjs.com/deploy/dev/docs/?class=Ext.