<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>关于WEB开发的思考之JAVA技术O.Lions</title>
    <description></description>
    <link>http://o-lions.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>Lucene+Heritrix开发自己的搜索引擎</title>
        <author>O.Lions</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://o-lions.javaeye.com">O.Lions</a>&nbsp;
          链接：<a href="http://o-lions.javaeye.com/blog/104369" style="color:red;">http://o-lions.javaeye.com/blog/104369</a>&nbsp;
          发表时间: 2007年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">Lucene</span> 				<span style="font-size: 12pt; font-family: 宋体;">是<span lang="EN-US">apache</span>软件基金会<sup><span lang="EN-US"></span></sup><span lang="EN-US">jakarta</span>项目组的一个子项目，是一个开放源代码的全文检索引擎工具包，即它不是一个完整的全文检索引擎，而是一个全文检索引擎的架构，提供了完整的查询引擎和索引引擎，部分文本分析引擎（英文与德文两种西方语言）。<span lang="EN-US">Lucene</span>的目的是为软件开发人员提供一个简单易用的工具包，以方便的在目标系统中实现全文检索的功能，或者是以此为基础建立起完整的全文检索引擎。<span lang="EN-US"><o:p></o:p></span></span>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;"> 				<span style="font-size: 12pt; font-family: 宋体;">作为一个开放源代码项目，<span lang="EN-US">Lucene</span>从问世之后，引发了开放源代码社群的巨大反响，程序员们不仅使用它构建具体的全文检索应用，而且将之集成到各种系统软件中去，以及构建<span lang="EN-US">Web</span>应用，甚至某些商业软件也采用了<span lang="EN-US">Lucene</span>作为其内部全文检索子系统的核心。<span lang="EN-US">apache</span>软件基金会的网站使用了<span lang="EN-US">Lucene</span>作为全文检索的引擎，<span lang="EN-US">IBM</span>的开源软件<span lang="EN-US">eclipse</span>的<span lang="EN-US">2.1</span>版本中也采用了<span lang="EN-US">Lucene</span>作为帮助子系统的全文索引引擎，相应的<span lang="EN-US">IBM</span>的商业软件<span lang="EN-US">Web Sphere</span>中也采用了<span lang="EN-US">Lucene</span>。<span lang="EN-US">Lucene</span>以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。<span lang="EN-US"><o:p></o:p></span></span> 		</p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;"> 				<span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">Lucene</span> 				<span style="font-size: 12pt; font-family: 宋体;">作为一个全文检索引擎，其具有如下突出的优点：<span lang="EN-US"><o:p></o:p></span></span> 		</p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 44.95pt; text-indent: -23.95pt; text-align: left;"> 				<span style="font-size: 12pt; font-family: 宋体;">（<span lang="EN-US">1</span>）索引文件格式独立于应用平台。<span lang="EN-US">Lucene</span>定义了一套以<span lang="EN-US">8</span>位字节为基础的索引文件格式，使得兼容系统或者不同平台的应用能够共享建立的索引文件。<span lang="EN-US"><o:p></o:p></span></span> 		</p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 44.95pt; text-indent: -23.95pt; text-align: left;"> 				<span style="font-size: 12pt; font-family: 宋体;">（<span lang="EN-US">2</span>）在传统全文检索引擎的倒排索引的基础上，实现了分块索引，能够针对新的文件建立小文件索引，提升索引速度。然后通过与原有索引的合并，达到优化的目的。<span lang="EN-US"><o:p></o:p></span></span> 		</p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-indent: 21pt; text-align: left;"> 				<span style="font-size: 12pt; font-family: 宋体;">（<span lang="EN-US">3</span>）优秀的面向对象的系统架构，使得对于<span lang="EN-US">Lucene</span>扩展的学习难度降低，方便扩充新功能。<span lang="EN-US"><o:p></o:p></span></span> 		</p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 44.95pt; text-indent: -23.95pt; text-align: left;"> 				<span style="font-size: 12pt; font-family: 宋体;">（<span lang="EN-US">4</span>）设计了独立于语言和文件格式的文本分析接口，索引器通过接受<span lang="EN-US">Token</span>流完成索引文件的创立，用户扩展新的语言和文件格式，只需要实现文本分析的接口。<span lang="EN-US"><o:p></o:p></span></span> 		</p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 44.95pt; text-indent: -23.95pt; text-align: left;"> 				<span style="font-size: 12pt; font-family: 宋体;">（<span lang="EN-US">5</span>）已经默认实现了一套强大的查询引擎，用户无需自己编写代码即使系统可获得强大的查询能力，<span lang="EN-US">Lucene</span>的查询实现中默认实现了布尔操作、模糊查询（<span lang="EN-US">Fuzzy Search</span>）、分组查询等等。<span lang="EN-US"><o:p></o:p></span></span> 		</p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-indent: 24pt; text-align: left;"> 				<span style="font-size: 12pt; font-family: 宋体;">面对已经存在的商业全文检索引擎，<span lang="EN-US">Lucene</span>也具有相当的优势。首先，它的开发源代码发行方式（遵守<span lang="EN-US">Apache Software License</span>），在此基础上程序员不仅仅可以充分的利用<span lang="EN-US">Lucene</span>所提供的强大功能，而且可以深入细致的学习到全文检索引擎制作技术和面相对象编程的实践，进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上，商业软件的灵活性远远不及<span lang="EN-US">Lucene</span>。其次，<span lang="EN-US">Lucene</span>秉承了开放源代码一贯的架构优良的优势，设计了一个合理而极具扩充能力的面向对象架构，程序员可以在<span lang="EN-US">Lucene</span>的基础上扩充各种功能，比如扩充中文处理能力，从文本扩充到<span lang="EN-US">HTML</span>、<span lang="EN-US">PDF</span>等等文本格式的处理，编写这些扩展的功能不仅仅不复杂，而且由于<span lang="EN-US">Lucene</span>恰当合理的对系统设备做了程序上的抽象，扩展的功能也能轻易的达到跨平台的能力。最后，转移到<span lang="EN-US">apache</span>软件基金会后，借助于<span lang="EN-US">apache</span>软件基金会的网络平台，程序员可以方便的和开发者、其它程序员交流，促成资源的共享，甚至直接获得已经编写完备的扩充功能。最后，虽然<span lang="EN-US">Lucene</span>使用<span lang="EN-US">Java</span>语言写成，但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现（例如<span lang="EN-US">.net framework</span>），在遵守<span lang="EN-US">Lucene</span>索引文件格式的基础上，使得<span lang="EN-US">Lucene</span>能够运行在各种各样的平台上，系统管理员可以根据当前的平台适合的语言来合理的选择。<span lang="EN-US"><br />
<br />
<br />
<br />
&nbsp;<span style="">&nbsp; </span>Heritrix</span>是<span lang="EN-US">IA</span>的开放源代码，可扩展的，基于整个<span lang="EN-US">Web</span>的，归档网络爬虫工程<span lang="EN-US"><br />
&nbsp;&nbsp; Heritrix</span>工程始于<span lang="EN-US">2003</span>年初，<span lang="EN-US">IA</span>的目的是开发一个特殊的爬虫，对网上的<span lang="EN-US"><br />
&nbsp;&nbsp; </span>资源进行归档，建立网络数字图书馆，在过去的<span lang="EN-US">6</span>年里，<span lang="EN-US">IA</span>已经建立了<span lang="EN-US">400TB</span>的数据。<span lang="EN-US"><br />
&nbsp;&nbsp; IA</span>期望他们的<span lang="EN-US">crawler</span>包含以下几种：<span lang="EN-US"><br />
&nbsp;&nbsp; </span>宽带爬虫：能够以更高的带宽去站点爬。<span lang="EN-US"><br />
&nbsp;&nbsp; </span>主题爬虫：集中于被选择的问题。<span lang="EN-US"><br />
&nbsp;&nbsp; </span>持续爬虫：不仅仅爬更当前的网页还负责爬日后更新的网页。<span lang="EN-US"><br />
&nbsp;&nbsp; </span>实验爬虫：对爬虫技术进行实验，以决定该爬什么，以及对不同协议的爬虫爬行结果进行分析的。<span lang="EN-US"><br />
Heritrix</span>的主页是<span lang="EN-US">http://crawler.archive.org<br />
&nbsp;&nbsp; Heritrix</span>是一个爬虫框架，可加如入一些可互换的组件。<span lang="EN-US"><br />
&nbsp;&nbsp; </span>它的执行是递归进行的，主要有以下几步：<span lang="EN-US"><br />
&nbsp;&nbsp; 1</span>。在预定的<span lang="EN-US">URI</span>中选择一个。<span lang="EN-US"><br />
&nbsp;&nbsp; 2</span>。获取<span lang="EN-US">URI<br />
&nbsp;&nbsp; 3</span>。分析，归档结果<span lang="EN-US"><br />
&nbsp;&nbsp; 4</span>。选择已经发现的感兴趣的<span lang="EN-US">URI</span>。加入预定队列。<span lang="EN-US"><br />
&nbsp;&nbsp; 5</span>。标记已经处理过的<span lang="EN-US">URI<br />
&nbsp;&nbsp; Heritrix</span>主要有三大部件：范围部件，边界部件，处理器链<span lang="EN-US"><br />
&nbsp;&nbsp; </span>范围部件：主要按照规则决定将哪个<span lang="EN-US">URI</span>入队。<span lang="EN-US"><br />
&nbsp;&nbsp; </span>边界部件：跟踪哪个预定的<span lang="EN-US">URI</span>将被收集，和已经被收集的<span lang="EN-US">URI</span>，选择下一个<span lang="EN-US">URI</span>，剔除已经处理过的<span lang="EN-US">URI</span>。<span lang="EN-US"><br />
&nbsp;&nbsp; </span>处理器链：包含若干处理器获取<span lang="EN-US">URI</span>，分析结果，将它们传回给边界部件<span lang="EN-US"><br />
&nbsp;&nbsp; Heritrix</span>的其余部件有：<span lang="EN-US"><br />
&nbsp;&nbsp; WEB</span>管理控制台：大多数都是单机的<span lang="EN-US">WEB</span>应用，内嵌<span lang="EN-US">JAVA HTTP </span>服务器。<span lang="EN-US"><br />
<span style="">&nbsp;</span></span>操作者可以通过选择<span lang="EN-US">Crawler</span>命令来操作控制台。<span lang="EN-US"><br />
&nbsp;&nbsp; Crawler</span>命令处理部件：包含足够的信息创建要爬的<span lang="EN-US">URI</span>。<span lang="EN-US"><br />
&nbsp;&nbsp; Servercache</span>（处理器缓存）：存放服务器的持久信息，能够被爬行部件随时<span lang="EN-US"><br />
</span>查到，包括<span lang="EN-US">IP</span>地址，历史记录，机器人策略。<span lang="EN-US"><br />
&nbsp;&nbsp; </span>处理器链：<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;<span style="">&nbsp;&nbsp;&nbsp; </span></span>预取链：主要是做一些准备工作，例如，对处理进行延迟和重新处理，否决随后的操作。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>提取链：主要是获得资源，进行<span lang="EN-US">DNS</span>转换，填写请求和响应表单<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>抽取链：当提取完成时，抽取感兴趣的<span lang="EN-US">HTML</span>，<span lang="EN-US">JavaScript</span>，通常那里有新的也适合的<span lang="EN-US">URI</span>，此时<span lang="EN-US">URI</span>仅仅被发现，不会被评估<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>写链：存储爬行结果，返回内容和抽取特性，过滤完存储。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>提交链：做最后的维护，例如，测试那些不在范围内的，提交给边界部件<span lang="EN-US"><br />
&nbsp;&nbsp; Heritrix <st1:chsdate isrocdate="False" month="12" islunardate="False" day="30" w:st="on" year="1899">1.0.0</st1:chsdate></span>包含以下关键特性：<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.</span>用单个爬虫在多个独立的站点一直不断的进行递归的爬。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</span>。从一个提供的种子进行爬，收集站点内的精确<span lang="EN-US">URI</span>，和精确主机。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3</span>。主要是用广度优先算法进行处理。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4</span>。主要部件都是高效的可扩展的<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5</span>。良好的配置，包括：<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a</span>。可设置输出日志，归档文件和临时文件的位置<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b</span>。可设置下载的最大字节，最大数量的下载文档，和最大的下载时间。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c</span>。可设置工作线程数量。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d</span>。可设置所利用的带宽的上界。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e</span>。可在设置之后一定时间重新选择。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f</span>。包含一些可设置的过滤机制，表达方式，<span lang="EN-US">URI</span>路径深度选择等等。<span lang="EN-US"><br />
&nbsp;&nbsp;Heritrix</span>的局限：<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1</span>。单实例的爬虫，之间不能进行合作。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2</span>。在有限的机器资源的情况下，却要复杂的操作。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3</span>。只有官方支持，仅仅在<span lang="EN-US">Linux</span>上进行了测试。<span lang="EN-US"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4</span>。每个爬虫是单独进行工作的，没有对更新进行修订。<span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<o:p></o:p></span></span> 		</p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt 84pt; text-indent: 6pt; text-align: left;"> 				<span lang="EN-US" style="font-size: 12pt; font-family: 宋体;">5</span> 				<span style="font-size: 12pt; font-family: 宋体;">。在硬件和系统失败时，恢复能力很差。<span lang="EN-US"><br />
&nbsp;6</span>。很少的时间用来优化性能。<span lang="EN-US"> <br />
</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://o-lions.javaeye.com/blog/104369#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, 23 Jul 2007 10:45:29 +0800</pubDate>
        <link>http://o-lions.javaeye.com/blog/104369</link>
        <guid>http://o-lions.javaeye.com/blog/104369</guid>
      </item>
      <item>
        <title>Appfuse的不惑</title>
        <author>O.Lions</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://o-lions.javaeye.com">O.Lions</a>&nbsp;
          链接：<a href="http://o-lions.javaeye.com/blog/84724" style="color:red;">http://o-lions.javaeye.com/blog/84724</a>&nbsp;
          发表时间: 2007年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          开始接触Appfuse了，眼前的项目就要开工了，忍不住自己写这些东西，有感于最近两周来看过所有关于Appfuse的先驱们！公司这边要求用Appfuse的时候，在JAVAEYE看到了robbin关于Appfuse--&ldquo;玩具论&rdquo;的文字，从起初的感叹到现在开始务实的进入Appfuse体系，采集下各位先驱的名言，每个人都有自己不同的看法，在面对Appfuse是好是坏的时候，我还是感谢Appfuse给自己带来了一个新的思想境界，而不是仅仅看它开发速度有多快，多灵活，集成的框架有多少。在J道里有人提出将组建思想发扬广大，做为一个出入行业一年的我来说，有太多的东西要用大脑认真思考，总觉得还有太多的东西需要学习，公司的技术总监虽然不断的给我灌输着好多先进的理念，忽然感觉脑子不够用了，忽然觉得现在对很多开源组件那种激动感觉没有了，而是发现自己开始有了一种对思想欲罢不能的感触，在看了&ldquo;江南白衣&rdquo;的&ldquo;SpringSide&rdquo;的时候，忽然让自己有了种耳目一新的感觉，感谢这些先驱者了，Appfuse，我也希望很快可以像Robbin说的那样，接受他的&ldquo;玩具论&rdquo;。
          <br/>
          <span style="color:red;">
            <a href="http://o-lions.javaeye.com/blog/84724#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, 30 May 2007 12:05:20 +0800</pubDate>
        <link>http://o-lions.javaeye.com/blog/84724</link>
        <guid>http://o-lions.javaeye.com/blog/84724</guid>
      </item>
      <item>
        <title>SEO</title>
        <author>O.Lions</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://o-lions.javaeye.com">O.Lions</a>&nbsp;
          链接：<a href="http://o-lions.javaeye.com/blog/80408" style="color:red;">http://o-lions.javaeye.com/blog/80408</a>&nbsp;
          发表时间: 2007年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="left" style="BACKGROUND: white; MARGIN: 0cm 0cm 12pt; LINE-HEIGHT: 160%; TEXT-ALIGN: left; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SEO </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">是英文</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">search engine optimization</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">的缩写，其中文意思是搜索引擎优化。而从事这方面工作的就是</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">search engine optimizer</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">，搜索引擎优化师。他们利用工具或者其他的各种手法使自己的和搜索引擎的搜索规则从而获得较好的排名（也就是常说的网站优化）。无止境地追求较前排名是</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SEO</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">们一世的目标。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <br />
<br />
</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">　　在网络营销中，搜索引擎优化排名是一种非常重要的手段，</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SEO</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">主要就是通过对网站的结构，标签，排版等各方面的优化，使</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Google</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">等搜索引擎更容易搜索网站的内容，并且让网站的各个网页在</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">GOOGLE</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">等搜索引擎中获得较高的评分，从而获得较好的排名。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <br />
<br />
</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">　　中国</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SEO</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">现状</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <br />
<br />
</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">　　每个事物的发展都会经过以下几个阶段，萌芽、初步发展、高速发展、成熟、衰落。中国</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">2003</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">年才起步，正处于初步发展阶段。具体特征：</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">1</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">、从事这方面的人不多，也不专业。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">2</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">、未形成规模。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">3</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">、多是作坊式经营，即主要是对本公司的网站进行一定的修改，就说成所谓为网站优化。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">4</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">、有专业的公司，但规模不大、技术也一般。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <br />
<br />
</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">　　</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SEO</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">在国外</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <br />
<br />
</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">　　国外这方面发展得比较早，早在</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">97</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">年左右就有人从事相关方面的工作。如果按上述的几个阶段来说，应该是处于高速发展的阶段了。他们有专业的人员、专业的公司（而且是规模很大）从事搜索引擎研究、优化等工作。无论从哪方面来说都处于绝大的优势。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <br />
<br />
</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">　　在国外，搜索引擎优化已经成为一个行业，在中国的</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SEO</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">行业从</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">2003</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">年才正是起步。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <br />
<br />
<br />
</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">　　不知在什么时候，在互联网上人们开始习惯使用搜索引擎找所需的东西。可能是</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">yahoo</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">出现时，或者更早些。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SEO</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">也因此得了飞速的发展。今时今日，人们不但没有改变这种习惯，反而变本加厉。从国内外的现状来看，竞争都很激烈。在竞争中产生优胜劣汰，这些生存者实力雄厚。国内处于起步的的</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">SEO</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">们在不断的探索，希望能找到一条正确的道路。在进军国际市场前必然会进行一场优胜劣汰的洗礼。前进的过程的坎坷的，但前景是光明的。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; TEXT-ALIGN: left; mso-pagination: widow-orphan"><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">真正的</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> SEO </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">是通过采用易于搜索引擎索的合理手段，使网站对用户和搜索引擎更友好</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">（</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Search Engine Friendly</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">），从而更容易被搜索引擎收录及优先排序。搜索引擎优化是</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">一种搜索引擎营销指导思想，而不仅仅是对</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> google </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">的排名。搜索引擎优化工作贯穿网</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">站策划、建设、维护全过程的每个细节，值得网站设计、开发和推广的每个参与人员了解其</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">职责对于</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> SEO </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">效果的意义。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; TEXT-ALIGN: left; mso-pagination: widow-orphan"><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">优化好的网站，从搜索引擎来的流量将会有很大的提高，不过这仅仅是能带来用户，而真正能够留住用户的是网站的内容。所以搜索引擎优化仅仅辅助手段，在网站建设的过程中仍然要将大部分精力放着网站内容的完善上。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <o:p></o:p></span></p>
<p class="MsoNormal" align="left" style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 160%; TEXT-ALIGN: left; mso-pagination: widow-orphan"><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">由于优化目的是在搜索引擎上获的好的排名，而搜索引擎不属于我们的，排名的影响因素有很多，所以对优化的效果就不可能有</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">100%</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">的把握，我们能做的是就是在已知的因素上下功夫，做到齐头并进，这样不论搜索引擎算法如何改变，</span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> </span><span style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ascii-font-family: Georgia; mso-hansi-font-family: Georgia">都不会使排名有特别大的波动。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: #4b4b4b; LINE-HEIGHT: 160%; FONT-FAMILY: Georgia; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"> <o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><o:p><font size="3" face="Times New Roman">&nbsp;</font></o:p></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://o-lions.javaeye.com/blog/80408#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, 16 May 2007 20:08:28 +0800</pubDate>
        <link>http://o-lions.javaeye.com/blog/80408</link>
        <guid>http://o-lions.javaeye.com/blog/80408</guid>
      </item>
      <item>
        <title>Gregorian（上帝之音）</title>
        <author>O.Lions</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://o-lions.javaeye.com">O.Lions</a>&nbsp;
          链接：<a href="http://o-lions.javaeye.com/blog/79910" style="color:red;">http://o-lions.javaeye.com/blog/79910</a>&nbsp;
          发表时间: 2007年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当听过一首好的音乐的时候我总是不听的听着，直到下一首好的出现为止。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 来自英伦岛屿的Gregorian(教皇合唱团)，又称之为&ldquo;上帝之音乐&rdquo;。他们浸淫于教堂音乐与合生音乐，虽然翻唱了很多流行歌曲，但是他们的风格确实最能刺透人内心的那种。Gregorian和莎拉布莱曼的搭配，个人认为那是把神秘和高雅音乐发挥到极致的。天籁般的优美把传承600年的古典美声演绎成流行音乐，那种滋味只有用心去品了的人才明白。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 曾经找到一首名字为&ldquo;中世纪&rdquo;的音乐，前奏是大提琴演绎的在教堂前面的沧桑，后面的象征宗教的十字架&hellip;&hellip;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src="http://fanusia.webpark.pl/gregorian_-_masters_of_chant_chaper_3-front.jpg" height="293" align="absMiddle" alt="" width="300" /></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我努力的让自己回想所有的东西，可以用心的在品味Gregorian的天籁的时候找到一个触摸灵魂的感觉</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 在寻找的过程中，当睁开双眼的时候，会发现所谓的Gregorian，所以的&ldquo;上帝之音&rdquo;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
          <br/>
          <span style="color:red;">
            <a href="http://o-lions.javaeye.com/blog/79910#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>Mon, 14 May 2007 22:52:46 +0800</pubDate>
        <link>http://o-lions.javaeye.com/blog/79910</link>
        <guid>http://o-lions.javaeye.com/blog/79910</guid>
      </item>
      <item>
        <title>设计模式</title>
        <author>O.Lions</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://o-lions.javaeye.com">O.Lions</a>&nbsp;
          链接：<a href="http://o-lions.javaeye.com/blog/79903" style="color:red;">http://o-lions.javaeye.com/blog/79903</a>&nbsp;
          发表时间: 2007年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Verdana">设计模式（Design pattern）是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。</font> </p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 毫无疑问，设计模式于己于他人于系统都是多赢的，设计模式使代码编制真正工程化，设计模式是软件工程的基石，如同大厦的一块块砖石一样。</font> </p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GoF的&ldquo;设计模式&rdquo;是第一次将设计模式提升到理论高度，并将之规范化，自此，在可复用面向对象软件的发展过程中，新的大量的设计模式不断出现。<br />
<br />
</font></p>
<p><font face="Verdana"><strong>一、设计模式和框架</strong> </font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在，可复用面向对象软件系统现在一般划分为三大类：应用程序工具箱和框架(Framework),我们平时开发的具体软件都是应用程序；Java的API属于工具箱;而框架是构成一类特定软件可复用设计的一组相互协作的类。EJB（EnterpriseJavaBeans）是Java应用于企业计算的框架.</font> </p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 框架通常定义了应用体系的整体结构类和对象的关系等等设计参数，以便于具体应用实现者能集中精力于应用本身的特定细节。框架主要记录软件应用中共同的设计决策，框架强调设计复用，因此框架设计中必然要使用设计模式.</font> </p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，设计模式有助于对框架结构的理解，成熟的框架通常使用了多种设计模式,如果你熟悉这些设计模式，毫无疑问，你将迅速掌握框架的结构，我们一般开发者如果突然接触EJBJ2EE等框架，会觉得特别难学，难掌握，那么转而先掌握设计模式，无疑是给了你剖析EJB或J2EE系统的一把利器。<br />
<br />
<strong>二、设计模式的原则<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、&quot;开－闭&quot;原则<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</strong>此原则是由&quot;Bertrand Meyer&quot;提出的。原文是：&quot;Software entities should be open for extension,but closed for modification&quot;。就是说模块应对扩展开放，而对修改关闭。模块应尽量在不修改原(是&quot;原&quot;，指原来的代码)代码的情况下进行扩展。<br />
<br />
<strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、里氏代换原则</strong></font> </p>
<p><font face="Verdana">里氏代换原则是由&quot;Barbara Liskov&quot;提出的。如果调用的是父类的话，那么换成子类也完全可以运行。<br />
<br />
</font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、合成复用原则</strong> </font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp; 就是说要少用继承，多用合成关系来实现。我曾经这样写过程序：有几个类要与数据库打交道，就写了一个数据库操作的类，然后别的跟数据库打交道的类都继承这个。结果后来，我修改了数据库操作类的一个方法，各个类都需要改动。&quot;牵一发而动全身&quot;!面向对象是要把波动限制在尽量小的范围。<br />
</font><font face="Verdana"><br />
&nbsp;&nbsp;&nbsp; 在Java中，应尽量针对Interface编程，而非实现类。这样，更换子类不会影响调用它方法的代码。要让各个类尽可能少的跟别人联系，&quot;不要与陌生人说话&quot;。这样，城门失火，才不至于殃及池鱼。扩展性和维护性才能提高。<br />
<br />
&nbsp;&nbsp;&nbsp; 理解了这些原则，再看设计模式，只是在具体问题上怎么实现这些原则而已。<br />
</font></p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 依赖倒转原则</strong> </font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 抽象不应该依赖与细节，细节应当依赖与抽象。</font> </p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 要针对接口编程，而不是针对实现编程。</font> </p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 传递参数，或者在组合聚合关系中，尽量引用层次高的类。</font> </p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 主要是在构造对象时可以动态的创建各种具体对象，当然如果一些具体类比较稳定，就不必在弄一个抽象类做它的父类，这样有画舌添足的感觉</font> <br />
<br />
</p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 接口隔离原则</strong> </font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 定制服务的例子，每一个接口应该是一种角色，不多不少，不干不该干的事，该干的事都要干</font> </p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 抽象类</strong> </font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 抽象类不会有实例，一般作为父类为子类继承，一般包含这个系的共同属性和方法。</font> </p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 注意：好的继承关系中，只有叶节点是具体类，其他节点应该都是抽象类，也就是说具体类</font> </p>
<p><font face="Verdana">是不被继承的。将尽可能多的共同代码放到抽象类中。</font> </p>
<p><font face="Verdana"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 迪米特法则</strong> </font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp; 最少知识原则。不要和陌生人说话。<br />
<br />
</font></p>
<p><strong>三、一个模式的四个基本要素</strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设计模式使人们可以更加简单方便地复用成功的设计和体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。 </p>
<p><br />
<strong>1. 模式名称（pattern name）</strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个助记名，它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上进行设计。基于一个模式词汇表，我们自己以及同事之间就可以讨论模式并在编写文档时使用它们。模式名可以帮助我们思考，便于我们与其他人交流设计思想及设计结果。找到恰当的模式名也是我们设计模式编目工作的难点之一。 </p>
<p><strong>2. 问题(problem)</strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果，它可能描述了特定的设计问题，如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候，问题部分会包括使用模式必须满足的一系列先决条件。 </p>
<p><strong>3. 解决方案(solution)</strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述了设计的组成成分，它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板，可应用于多种不同场合，所以解决方案并不描述一个特定而具体的设计或实现，而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合（类或对象组合）来解决这个问题。 </p>
<p><strong>4. 效果(consequences)</strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时，并不总提到模式效果，但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时间和空间的衡量，它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一，所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响，显式地列出这些效果对理解和评价这些模式很有帮助。 <br />
<br />
</p>
<p><strong>四、一些基本的设计模式</strong> </p>
<p>Abstract Factory：提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。 </p>
<p>Adapter：将一个类的接口转换成客户希望的另外一个接口。A d a p t e r模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 </p>
<p>Bridge：将抽象部分与它的实现部分分离，使它们都可以独立地变化。 </p>
<p>Builder：将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。 </p>
<p>Chain of Responsibility：为解除请求的发送者和接收者之间耦合，而使多个对象都有机会处理这个请求。将这些对象连成一条链，并沿着这条链传递该请求，直到有一个对象处理它。 </p>
<p>Command：将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可取消的操作。 </p>
<p>Composite：将对象组合成树形结构以表示&ldquo;部分-整体&rdquo;的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。 </p>
<p>Decorator：动态地给一个对象添加一些额外的职责。就扩展功能而言， 它比生成子类方式更为灵活。 </p>
<p>Facade：为子系统中的一组接口提供一个一致的界面， F a c a d e模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。 </p>
<p>Factory Method：定义一个用于创建对象的接口，让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。 </p>
<p>Flyweight：运用共享技术有效地支持大量细粒度的对象。 </p>
<p>Interpreter：给定一个语言, 定义它的文法的一种表示，并定义一个解释器, 该解释器使用该表示来解释语言中的句子。 </p>
<p>Iterator：提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。 </p>
<p>Mediator：用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用，从而使其耦合松散，而且可以独立地改变它们之间的交互。 </p>
<p>Memento：在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。 </p>
<p>Observer：定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。 </p>
<p>Prototype：用原型实例指定创建对象的种类，并且通过拷贝这个原型来创建新的对象。 </p>
<p>Proxy：为其他对象提供一个代理以控制对这个对象的访问。 </p>
<p>Singleton：保证一个类仅有一个实例，并提供一个访问它的全局访问点。 </p>
<p>State：允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。 </p>
<p>Strategy：定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。 </p>
<p>Template Method：定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 </p>
<p>Visitor：表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 </p>
<p><br />
&nbsp;&nbsp;&nbsp; 创建型 结构型 行为型 <br />
类 Factory Method&nbsp; Adapter_Class&nbsp; Interpreter<br />
Template Method&nbsp; <br />
对象 Abstract Factory<br />
Builder<br />
Prototype<br />
Singleton&nbsp; Adapter_Object<br />
Bridge<br />
Composite<br />
Decorator<br />
Facade<br />
Flyweight<br />
Proxy&nbsp; Chain of Responsibility<br />
Command<br />
Iterator<br />
Mediator<br />
Memento<br />
Observer<br />
State<br />
Strategy<br />
Visitor&nbsp; <br />
概览&nbsp;&nbsp; </p>
<p><br />
名称 Factory Method <br />
结构&nbsp; <br />
意图 定义一个用于创建对象的接口，让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 <br />
适用性 当一个类不知道它所必须创建的对象的类的时候。 <br />
当一个类希望由它的子类来指定它所创建的对象的时候。 <br />
当类将创建对象的职责委托给多个帮助子类中的某一个，并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。 </p>
<p>名称 Abstract Factory <br />
结构&nbsp; <br />
意图 提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。 <br />
适用性 一个系统要独立于它的产品的创建、组合和表示时。 <br />
一个系统要由多个产品系列中的一个来配置时。 <br />
当你要强调一系列相关的产品对象的设计以便进行联合使用时。 <br />
当你提供一个产品类库，而只想显示它们的接口而不是实现时。 </p>
<p>名称 Builder <br />
结构&nbsp; <br />
意图 将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。 <br />
适用性 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 <br />
当构造过程必须允许被构造的对象有不同的表示时。 </p>
<p>名称 Prototype <br />
结构&nbsp; <br />
意图 用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。 <br />
适用性 当要实例化的类是在运行时刻指定时，例如，通过动态装载；或者 <br />
为了避免创建一个与产品类层次平行的工厂类层次时；或者 <br />
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。 </p>
<p>名称 Singleton <br />
结构&nbsp; <br />
意图 保证一个类仅有一个实例，并提供一个访问它的全局访问点。 <br />
适用性 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。 <br />
当这个唯一实例应该是通过子类化可扩展的，并且客户应该无需更改代码就能使用一个扩展的实例时。 </p>
<p>名称 Adapter <br />
结构 <br />
&nbsp; <br />
意图 将一个类的接口转换成客户希望的另外一个接口。A d a p t e r 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 <br />
适用性 你想使用一个已经存在的类，而它的接口不符合你的需求。 <br />
你想创建一个可以复用的类，该类可以与其他不相关的类或不可预见的类（即那些接口可能不一定兼容的类）协同工作。 <br />
（仅适用于对象A d a p t e r ）你想使用一些已经存在的子类，但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。 <br />
&nbsp;<br />
名称 Bridge <br />
结构&nbsp; <br />
意图 将抽象部分与它的实现部分分离，使它们都可以独立地变化。 <br />
适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为，在程序运行时刻实现部分应可以被选择或者切换。 <br />
类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时B r i d g e 模式使你可以对不同的抽象接口和实现部分进行组合，并分别对它们进行扩充。 <br />
对一个抽象的实现部分的修改应对客户不产生影响，即客户的代码不必重新编译。&nbsp;&nbsp;<br />
&nbsp;<br />
名称 Composite <br />
结构&nbsp; <br />
意图 将对象组合成树形结构以表示&ldquo;部分-整体&rdquo;的层次结构。C o m p o s i t e 使得用户对单个对象和组合对象的使用具有一致性。 <br />
适用性 你想表示对象的部分-整体层次结构。 <br />
你希望用户忽略组合对象与单个对象的不同，用户将统一地使用组合结构中的所有对象。 <br />
&nbsp;<br />
名称 Decorator <br />
结构&nbsp; <br />
意图 动态地给一个对象添加一些额外的职责。就增加功能来说，D e c o r a t o r 模式相比生成子类更为灵活。 <br />
适用性 在不影响其他对象的情况下，以动态、透明的方式给单个对象添加职责。 <br />
处理那些可以撤消的职责。 <br />
当不能采用生成子类的方法进行扩充时。一种情况是，可能有大量独立的扩展，为支持每一种组合将产生大量的子类，使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏，或类定义不能用于生成子类。 <br />
&nbsp;<br />
名称 Facade <br />
结构&nbsp; <br />
意图 为子系统中的一组接口提供一个一致的界面，F a c a d e 模式定义了一个高层接口，这个接口使得这一子系统更加容易使用。 <br />
适用性 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性，也更容易对子系统进行定制，但这也给那些不需要定制子系统的用户带来一些使用上的困难。F a c a d e 可以提供一个简单的缺省视图，这一视图对大多数用户来说已经足够，而那些需要更多的可定制性的用户可以越过f a c a d e 层。 <br />
客户程序与抽象类的实现部分之间存在着很大的依赖性。引入f a c a d e 将这个子系统与客户以及其他的子系统分离，可以提高子系统的独立性和可移植性。 <br />
当你需要构建一个层次结构的子系统时，使用f a c a d e 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的，你可以让它们仅通过f a c a d e 进行通讯，从而简化了它们之间的依赖关系。 <br />
&nbsp;<br />
名称 Flyweight <br />
结构&nbsp; <br />
意图 运用共享技术有效地支持大量细粒度的对象。 <br />
适用性 一个应用程序使用了大量的对象。 <br />
完全由于使用大量的对象，造成很大的存储开销。 <br />
对象的大多数状态都可变为外部状态。 <br />
如果删除对象的外部状态，那么可以用相对较少的共享对象取代很多组对象。 <br />
应用程序不依赖于对象标识。由于F l y w e i g h t 对象可以被共享，对于概念上明显有别的对象，标识测试将返回真值。 <br />
&nbsp;<br />
名称 Proxy <br />
结构&nbsp; <br />
意图 为其他对象提供一种代理以控制对这个对象的访问。 <br />
适用性 在需要用比较通用和复杂的对象指针代替简单的指针的时候，使用P r o x y 模式。下面是一 些可以使用P r o x y 模式常见情况：<br />
1) 远程代理（Remote Proxy ）为一个对象在不同的地址空间提供局部代表。 NEXTSTEP[Add94] 使用N X P r o x y 类实现了这一目的。Coplien[Cop92] 称这种代理为&ldquo;大使&rdquo; （A m b a s s a d o r ）。<br />
2 )虚代理（Virtual Proxy ）根据需要创建开销很大的对象。在动机一节描述的I m a g e P r o x y 就是这样一种代理的例子。<br />
3) 保护代理（Protection Proxy ）控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。例如，在C h o i c e s 操作系统[ C I R M 9 3 ]中K e m e l P r o x i e s 为操作系统对象提供 了访问保护。<br />
4 )智能指引（Smart Reference ）取代了简单的指针，它在访问对象时执行一些附加操作。 它的典型用途包括：</p>
<p>对指向实际对象的引用计数，这样当该对象没有引用时，可以自动释放它(也称为S m a r tP o i n t e r s[ E d e 9 2 ] )。 <br />
当第一次引用一个持久对象时，将它装入内存。 <br />
在访问一个实际对象前，检查是否已经锁定了它，以确保其他对象不能改变它。 </p>
<p>名称 Chain of Responsibility <br />
结构&nbsp; <br />
意图 使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链，并沿着这条链传递该请求，直到有一个对象处理它为止。 <br />
适用性 有多个的对象可以处理一个请求，哪个对象处理该请求运行时刻自动确定。 <br />
你想在不明确指定接收者的情况下，向多个对象中的一个提交一个请求。 <br />
可处理一个请求的对象集合应被动态指定。 <br />
&nbsp;<br />
名称 Command <br />
结构&nbsp; <br />
意图 将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化；对请求排队或记录请求日志，以及支持可撤消的操作。 <br />
适用性 像上面讨论的M e n u I t e m 对象那样，抽象出待执行的动作以参数化某对象。你可用过程语言中的回调（c a l l b a c k ）函数表达这种参数化机制。所谓回调函数是指函数先在某处注册，而它将在稍后某个需要的时候被调用。C o m m a n d 模式是回调机制的一个面向对象的替代品。 <br />
在不同的时刻指定、排列和执行请求。一个C o m m a n d 对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达，那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。 <br />
支持取消操作。C o m m a n d 的E x c u t e 操作可在实施操作前将状态存储起来，在取消操作时这个状态用来消除该操作的影响。C o m m a n d 接口必须添加一个U n e x e c u t e 操作，该操作取消上一次E x e c u t e 调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用U n e x e c u t e 和E x e c u t e 来实现重数不限的&ldquo;取消&rdquo;和&ldquo;重做&rdquo;。 <br />
支持修改日志，这样当系统崩溃时，这些修改可以被重做一遍。在C o m m a n d 接口中添加装载操作和存储操作，可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用E x e c u t e 操作重新执行它们。 <br />
用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务( t r a n s a c t i o n )的信息系统中很常见。一个事务封装了对数据的一组变动。C o m m a n d 模式提供了对事务进行建模的方法。C o m m a n d 有一个公共的接口，使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。 <br />
&nbsp;<br />
名称 Interpreter <br />
结构&nbsp; <br />
意图 给定一个语言，定义它的文法的一种表示，并定义一个解释器，这个解释器使用该表示来解释语言中的句子。 <br />
适用性 当有一个语言需要解释执行, 并且你可将该语言中的句子表示为一个抽象语法树时，可使用解释器模式。而当存在以下情况时该模式效果最好： <br />
该文法简单对于复杂的文法, 文法的类层次变得庞大而无法管理。此时语法分析程序生成器这样的工具是更好的选择。它们无需构建抽象语法树即可解释表达式, 这样可以节省空间而且还可能节省时间。 <br />
效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的, 而是首先将它们转换成另一种形式。例如，正则表达式通常被转换成状态机。但即使在这种情况下, 转换器仍可用解释器模式实现, 该模式仍是有用的。 </p>
<p>名称 Iterator <br />
结构&nbsp; <br />
意图 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。 <br />
适用性 访问一个聚合对象的内容而无需暴露它的内部表示。 <br />
支持对聚合对象的多种遍历。 <br />
为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。 <br />
&nbsp;<br />
名称 Mediator <br />
结构&nbsp; <br />
意图 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用，从而使其耦合松散，而且可以独立地改变它们之间的交互。 <br />
适用性 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。 <br />
一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。 <br />
想定制一个分布在多个类中的行为，而又不想生成太多的子类。 <br />
&nbsp;<br />
名称 Memento <br />
结构&nbsp; <br />
意图 在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 <br />
适用性 必须保存一个对象在某一个时刻的(部分)状态, 这样以后需要时它才能恢复到先前的状态。 <br />
如果一个用接口来让其它对象直接得到这些状态，将会暴露对象的实现细节并破坏对象的封装性。 <br />
&nbsp;<br />
名称 Observer <br />
结构&nbsp; <br />
意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。 <br />
适用性 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。 <br />
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。 <br />
当一个对象必须通知其它对象，而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。 <br />
&nbsp;<br />
名称 State <br />
结构&nbsp; <br />
意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 <br />
适用性 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。 <br />
一个操作中含有庞大的多分支的条件语句，且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。S t a t e模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象，这一对象可以不依赖于其他对象而独立变化。 <br />
&nbsp;<br />
名称 Strategy <br />
结构&nbsp; <br />
意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 <br />
适用性 许多相关的类仅仅是行为有异。&ldquo;策略&rdquo;提供了一种用多个行为中的一个行为来配置一个类的方法。 <br />
需要使用一个算法的不同变体。例如，你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ] ,可以使用策略模式。 <br />
算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。 <br />
一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的S t r a t e g y 类中以代替这些条件语句。 <br />
&nbsp;<br />
名称 Template Method <br />
结构&nbsp; <br />
意图 定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。Te m p l a t e M e t h o d 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 <br />
适用性 一次性实现一个算法的不变的部分，并将可变的行为留给子类来实现。 <br />
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是O p d y k e 和J o h n s o n 所描述过的&ldquo;重分解以一般化&rdquo;的一个很好的例子[ O J 9 3 ]。首先识别现有代码中的不同之处，并且将不同之处分离为新的操作。最后，用一个调用这些新的操作的模板方法来替换这些不同的代码。 <br />
控制子类扩展。模板方法只在特定点调用&ldquo;h o o k &rdquo;操作（参见效果一节），这样就只允许在这些点进行扩展。 <br />
&nbsp;<br />
名称 Visitor <br />
结构&nbsp; <br />
意图 表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 <br />
适用性 一个对象结构包含很多类对象，它们有不同的接口，而你想对这些对象实施一些依赖于其具体类的操作。 <br />
需要对一个对象结构中的对象进行很多不同的并且不相关的操作，而你想避免让这些操作&ldquo;污染&rdquo;这些对象的类。Vi s i t o r 使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时，用Vi s i t o r 模式让每个应用仅包含需要用到的操作。 <br />
定义对象结构的类很少改变，但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口，这可能需要很大的代价。如果对象结构类经常改变，那么可能还是在这些类中定义这些操作较好。</p>
          <br/>
          <span style="color:red;">
            <a href="http://o-lions.javaeye.com/blog/79903#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, 14 May 2007 22:10:47 +0800</pubDate>
        <link>http://o-lions.javaeye.com/blog/79903</link>
        <guid>http://o-lions.javaeye.com/blog/79903</guid>
      </item>
      <item>
        <title>DOM4j使用教程 </title>
        <author>O.Lions</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://o-lions.javaeye.com">O.Lions</a>&nbsp;
          链接：<a href="http://o-lions.javaeye.com/blog/79718" style="color:red;">http://o-lions.javaeye.com/blog/79718</a>&nbsp;
          发表时间: 2007年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>DOM4j是一个易用的，开源的JAVA操作XML的API，写过一篇4种XML操作API的比较，DOM4j是性能和易用行最佳的。因此做一个小教程，供初学者学习。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 学习DOM4j首先就先来了解下它主要的包</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM4j所有的接口都在org.dom4j这个包里定义着</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.dom4j.Attribute&nbsp;: Attribute接口定义了XML文件的属性</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.dom4j.Branch&nbsp; : Branch为能够包含子节点的节点如XML元素和文档定义了一个公共行为</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.CDATA&nbsp; : CDATA定义了XML CDATA区域</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.CharacterData: CharacterData是一个标识接口，标识基于字符的节点。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.dom4j.Comment&nbsp; : Comment定义了XML注释的行为</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.Document : Docement接口定义了XML文档</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.dom4j.Element&nbsp;&nbsp; : Element定义了XML元素</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.dom4j.ElementHandler: ElementHandler定义了Element对象的处理器</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.dom4j.ElementPath : 被ElementHandler使用，用于取得当前正在处理的路径层次信息</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.Entity&nbsp;&nbsp;&nbsp;&nbsp; : Entity定义XML entity</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.Node :&nbsp;&nbsp; Node为所有的dom4j中XML节点定义了多态行为</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.dom4j.NodeFilter&nbsp;:&nbsp; NodeFilter定义了在dom4j节点中产生的一个滤镜或谓词的行为</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.ProcessingInstruction : ProcessingInstruction定义XML处理指令</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.dom4j.Text&nbsp;&nbsp; : Test定义了XML文本节点</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.dom4j.Visitor : Visitor用于实现Visitor模式</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.dom4j.XPath : XPath在分析一个字符串后会提供一个XPath表达式</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面说下主要的实用方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1:&nbsp; 读取并解析XML文档：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;读写XML文档主要依赖于org.dom4j.io包，提供了DOMReader和SAXReader两类不同方式，调用方式一样。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 从文件读取XML，输入文件名，返回XML文档</p>
<div align="left">&nbsp;&nbsp;&nbsp; <strong>public</strong> Document read(String fileName) <strong>throws</strong> MalformedURLException, DocumentException {</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXReader reader = <strong>new</strong> SAXReader();</div>
<div align="left">&nbsp;</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document document = reader.read(<strong>new</strong> File(fileName));</div>
<div align="left">&nbsp;</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong> document;</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; }</div>
<div align="left">&nbsp;&nbsp; 2：取得ROOT节点</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果要读取一个XML文件，最重要的就是要读取ROOT节点了，一切分析XML都是从ROOT节点开始。</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
<div align="left">&nbsp;&nbsp; &nbsp;<strong>public</strong> Element getRootElement(Document doc){</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong> doc.getRootElement();</div>
<div align="left">&nbsp;&nbsp;&nbsp; &nbsp;}</div>
<div align="left">&nbsp;</div>
<div align="left">&nbsp;&nbsp; 3：遍历XML树,这里有二种方法</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （1）： 枚举</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 枚举所有子节点
<div align="left"><strong>&nbsp;&nbsp;&nbsp; for</strong> ( Iterator i = root.elementIterator(); i.hasNext(); ) {</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element element = (Element) i.next();</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do something</div>
<div align="left">&nbsp;&nbsp;&nbsp; }</div>
<div align="left">&nbsp;&nbsp;&nbsp; // 枚举名称为foo的节点</div>
<div align="left"><strong>&nbsp;&nbsp;&nbsp; for</strong> ( Iterator i = root.elementIterator(foo); i.hasNext();) {</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element foo = (Element) i.next();</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do something</div>
<div align="left">&nbsp;&nbsp;&nbsp; }</div>
<div align="left">&nbsp;&nbsp;&nbsp; // 枚举属性</div>
<div align="left"><strong>&nbsp;&nbsp;&nbsp; for</strong> ( Iterator i = root.attributeIterator(); i.hasNext(); ) {</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Attribute attribute = (Attribute) i.next();</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // do something</div>
<div align="left">&nbsp;&nbsp;&nbsp; }</div>
<div align="left">&nbsp;</div>
<div align="left">&nbsp; (2) :&nbsp; 递归</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp; <strong>public</strong> <strong>void</strong> treeWalk() {
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; treeWalk(getRootElement());</div>
<div align="left">&nbsp;&nbsp;&nbsp; }</div>
<div align="left">&nbsp;&nbsp;&nbsp; <strong>public</strong> <strong>void</strong> treeWalk(Element element) {</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>for</strong> (<strong>int</strong> i = 0, size = element.nodeCount(); i &lt; size; i++) &nbsp;&nbsp;&nbsp; {</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node node = element.node(i);</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>if</strong> (node <strong>instanceof</strong> Element) {</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; treeWalk((Element) node);</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <strong>else</strong> { // do something....</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
<div align="left">}</div>
<div align="left">&nbsp;</div>
<div align="left">&nbsp; 4:字符串与XML的转换</div>
<div align="left">&nbsp;&nbsp; // XML转字符串
<div align="left">　 Document document = ...;</div>
<div align="left">&nbsp;&nbsp;&nbsp; String text = document.asXML();</div>
<div align="left">&nbsp; // 字符串转XML</div>
<div align="left">&nbsp;&nbsp;&nbsp; String text =
<person></person>
<name></name>James ;</div>
<div align="left">&nbsp;&nbsp;&nbsp; Document document = DocumentHelper.parseText(text);</div>
<div align="left">&nbsp;</div>
<div align="left">&nbsp; 5. 创建XML</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp; 这里创建一个XML，没有写</div>
<div align="left">&nbsp;&nbsp;&nbsp; <strong>public</strong> Document createDocument() {
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document document = DocumentHelper.createDocument();</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element root = document.addElement(root);</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element author1 =</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addElement(author)</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addAttribute(name, James)</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addAttribute(location, UK)</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addText(James Strachan);</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Element author2 =</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addElement(author)</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addAttribute(name, Bob)</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addAttribute(location, US)</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .addText(Bob McWhirter);</div>
<div align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>return</strong> document;</div>
<div align="left">&nbsp;&nbsp;&nbsp; }</div>
<div align="left">&nbsp;&nbsp; 6:&nbsp;XML 文件输出</div>
<div align="left">&nbsp;&nbsp; FileWriter out = <strong>new</strong> FileWriter( foo.xml );
<div align="left">&nbsp;&nbsp;&nbsp; document.write(out);</div>
<div align="left">&nbsp;&nbsp; </div>
<div align="left">&nbsp;</div>
<div align="left">&nbsp;&nbsp;&nbsp; DOM4j 的简单常用的方法上面总结了下，大家可以有一个印象，想要学的仔细了就要自己好好研究了，下面有一个以前写的小程序，实现了创建和编辑XML文件的功能。</div>
<div align="left">&nbsp;</div>
<div align="left">&nbsp;&nbsp;&nbsp; package com.dom4j.test;</div>
<div align="left">import java.io.File;<br />
import java.io.FileWriter;<br />
import java.io.IOException;<br />
import java.util.Iterator;<br />
import java.util.List;</div>
<div align="left">import org.dom4j.Attribute;<br />
import org.dom4j.Document;<br />
import org.dom4j.DocumentException;<br />
import org.dom4j.DocumentHelper;<br />
import org.dom4j.Element;<br />
import org.dom4j.io.OutputFormat;<br />
import org.dom4j.io.SAXReader;<br />
import org.dom4j.io.XMLWriter;</div>
<div align="left">public class NewXML {</div>
<div align="left">&nbsp;/**<br />
&nbsp; * <br />
&nbsp; * 用DOM4J创建一个XML文件<br />
&nbsp; * @param args<br />
&nbsp; */<br />
&nbsp;<br />
&nbsp;public boolean newXMl(String fileName){<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;boolean returnValue=false;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//定义一个XML文档<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Document docement=DocumentHelper.createDocument();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//设置XML文档的元素<br />
&nbsp;&nbsp;Element rootElement=docement.addElement(&quot;DOM4J创建XML文档&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;rootElement.addComment(&quot;镜花水月2007-4-24晚上创建&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Element nameElement=rootElement.addElement(&quot;镜花水月&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;nameElement.addAttribute(&quot;名字&quot;,&quot;不告诉你&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Element schoolElement=nameElement.addElement(&quot;学校&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;schoolElement.setText(&quot;西安翻译学院&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Element cityElement=rootElement.addElement(&quot;城市&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;cityElement.setText(&quot;上海&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Element homeElement=cityElement.addElement(&quot;住址&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;homeElement.setText(&quot;徐家汇&quot;);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//创建XML文档 <br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** 格式化输出,类型IE浏览一样 */<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;OutputFormat format = OutputFormat.createPrettyPrint();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;/** 指定XML编码 */<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;format.setEncoding(&quot;GBK&quot;);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;XMLWriter writer=new XMLWriter(new FileWriter(new File(fileName)),format);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;writer.write(docement);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;writer.close();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;return returnValue=true;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;return returnValue;<br />
&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;/**<br />
&nbsp; * <br />
&nbsp; * 用DOM4J修改一个XML文件<br />
&nbsp; * @param args<br />
&nbsp; * <br />
&nbsp; */<br />
&nbsp;<br />
&nbsp;public boolean update(String fileName,String newFileName){<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;boolean returnValaue=false;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;SAXReader reader=new SAXReader();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;Document docement=reader.read(new File(fileName));<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;List list=null;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;list=docement.selectNodes(&quot;/DOM4J创建XML文档/镜花水月/@名字&quot;);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;Iterator it=list.iterator();<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;while(it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;Attribute attribute=(Attribute) it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(attribute.getValue().equals(&quot;不告诉你&quot;)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;attribute.setValue(&quot;还是不告诉你&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;//将就该写入新的文件 <br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;//转码<br />
&nbsp;&nbsp;&nbsp;&nbsp;OutputFormat format=OutputFormat.createPrettyPrint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;format.setEncoding(&quot;GBK&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XMLWriter writer=new XMLWriter(new FileWriter(new File(newFileName)),format);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;writer.write(docement);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;writer.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return returnValaue=true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;} catch (DocumentException e) {<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;return returnValaue;<br />
&nbsp;}<br />
&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;NewXML newXml=new NewXML();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String name=&quot;newXML.xml&quot;;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;String newName=&quot;UpdateXML.xml&quot;;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;if(!newXml.newXMl(name)){<br />
&nbsp;&nbsp;&nbsp;System.out.println(&quot;创建出现错误！&quot;);<br />
&nbsp;&nbsp;&nbsp;return ;<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;System.out.println(&quot;创建XML成功！&quot;);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;if(!newXml.update(name,newName)){<br />
&nbsp;&nbsp;&nbsp;System.out.println(&quot;修改出现错误！&quot;);<br />
&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;System.out.println(&quot;修改XML成功&quot;);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;</div>
<div align="left">&nbsp;}</div>
<div align="left">}<br />
</div>
</div>
</div>
</div>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://o-lions.javaeye.com/blog/79718#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, 14 May 2007 04:44:09 +0800</pubDate>
        <link>http://o-lions.javaeye.com/blog/79718</link>
        <guid>http://o-lions.javaeye.com/blog/79718</guid>
      </item>
      <item>
        <title>abstract（抽象类）和Interface(接口)总结 </title>
        <author>O.Lions</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://o-lions.javaeye.com">O.Lions</a>&nbsp;
          链接：<a href="http://o-lions.javaeye.com/blog/79501" style="color:red;">http://o-lions.javaeye.com/blog/79501</a>&nbsp;
          发表时间: 2007年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>一： abstract 修饰符&nbsp;&nbsp; 抽象类</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abstract修饰符用来修饰类和成员方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1： 用abstract修饰的类表示抽象类，抽象类位于继承树的抽象层，抽象类不能被实例化。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2：用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能，但&nbsp;&nbsp; 不提供具体的实现。&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abstract 规则：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1： 抽象类可以没有抽象方法，但是有抽象方法的类必须定义为抽象类，如果一个子类继承一个抽象类，子类没有实现父类的所有抽象方法，那么子类也要定义为抽象类，否则的话编译会出错的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2：抽象类没有构造方法，也没有抽象静态方法。但是可以有非抽象的构造方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3：抽象类不能被实例化，但是可以创建一个引用变量，类型是一个抽象类，并让它引用非抽象类的子类的一个实例</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4： 不能用final 修饰符修饰</p>
<p>二：&nbsp;&nbsp;&nbsp; Interface 接口</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Interface关键字定义接口，也称为接口类型，用于明确的描述系统对外提供哦的所有服务，清晰的把系统的实现细节与分离，实现传说中的解耦合。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Interface规则：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1： 接口的成员变量都是public static&nbsp; final类型的，必须显示初始化</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2： 接口的成员方法都是public abstract 类型的</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3： 接口只能包含public static final类型的成员变量和public abstract类型的成员方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4：接口中没有构造方法，不能实例化，同abstract一样，可以定义一个引用变量，让实现了Interface的具体类来构造。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5：实现了一个接口，必须实现接口所有的抽象方法，除非该类定义为抽象类</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6：可以实现多个接口，用JAVA语言实现多继承。</p>
<p>&nbsp; 三：&nbsp;&nbsp; abstract 和Interface 的区别</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1： 都代表系统的抽象层</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2： 都不能被实例化，但都可以继承或者实现抽象类或者接口的具体类，通过定义引用变量来构造。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3：都包含抽象方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4:&nbsp; 抽象类中可以为部分方法提供默认的实现，可以避免子类中重复实现它们，提高代码的可重用性，接口中只能包含抽象方法。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5：一个类只能继承一个直接的父类，比如抽象类，但是可以实现多个接口</p>
<br />
          <br/>
          <span style="color:red;">
            <a href="http://o-lions.javaeye.com/blog/79501#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>Sun, 13 May 2007 18:09:46 +0800</pubDate>
        <link>http://o-lions.javaeye.com/blog/79501</link>
        <guid>http://o-lions.javaeye.com/blog/79501</guid>
      </item>
      <item>
        <title>JAVA操作XML的四种归类 </title>
        <author>O.Lions</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://o-lions.javaeye.com">O.Lions</a>&nbsp;
          链接：<a href="http://o-lions.javaeye.com/blog/79460" style="color:red;">http://o-lions.javaeye.com/blog/79460</a>&nbsp;
          发表时间: 2007年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一：&nbsp; <span><strong><font face="宋体">DOM</font>（<font face="宋体">JAXP Crimson</font>解析器）</strong></span>
<p><span><strong>&nbsp;&nbsp;&nbsp;&nbsp; </strong><font face="宋体"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">是用与平台和语言无关的方式表示</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档的官方</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">W<st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="3" numbertype="1" negative="False" unitname="C" w:st="on">3C</st1:chmetcnv></span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">标准。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">被认为是基于树或基于对象的。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">以及广义的基于树的处理具有几个优点。首先，由于树在内存中是持久的，因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航，而不是像</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">那样是一次性的处理。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">使用起来也要简单得多。</span></font></span></p>
<p><span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial"></span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p><font face="宋体">二：<strong><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span></strong></font></o:p></span></span></p>
<p><span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p><font face="宋体"><span><strong>&nbsp;&nbsp; </strong><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">处理的优点非常类似于流媒体的优点。分析能够立即开始，而不是等待所有的数据被处理。而且，由于应用程序只是在读取数据时检查数据，因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上，应用程序甚至不必解析整个文档；它可以在某个条件得到满足时停止解析。一般来说，</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">还比它的替代者</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">快许多。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p></o:p></span></span></font></o:p></span></span></p>
<p style="VERTICAL-ALIGN: bottom; LINE-HEIGHT: 15pt"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&nbsp;&nbsp;&nbsp; </span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">选择</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">还是选择</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">？</span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"> </span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">对于需要自己编写代码来处理</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档的开发人员来说，</span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"> </span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">选择</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">还是</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">解析模型是一个非常重要的设计决策。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"> DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">采用建立树形结构的方式访问</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档，而</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">采用的事件模型。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p></o:p></span></p>
<p style="VERTICAL-ALIGN: bottom; LINE-HEIGHT: 15pt"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&nbsp;&nbsp;&nbsp; DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">解析器把</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档转化为一个包含其内容的树，并可以对树进行遍历。用</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">解析模型的优点是编程容易，开发人员只需要调用建树的指令，然后利用</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">navigation APIs</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">解析器的时候需要处理整个</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档，所以对性能和内存的要求比较高，尤其是遇到很大的</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文件的时候。由于它的遍历能力，</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">解析器常用于</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档需要频繁的改变的服务中。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p></o:p></span></p>
<p style="VERTICAL-ALIGN: bottom; LINE-HEIGHT: 15pt"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&nbsp;&nbsp;&nbsp; SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">解析器采用了基于事件的模型，它在解析</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档的时候可以触发一系列的事件，当发现给定的</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">tag</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">的时候，它可以激活一个回调方法，告诉该方法制定的标签已经找到。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">对内存的要求通常会比较低，因为它让开发人员自己来决定所要处理的</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">tag.</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">特别是当开发人员只需要处理文档中所包含的部分数据时，</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">这种扩展能力得到了更好的体现。但用</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">解析器的时候编码工作会比较困难，而且很难同时访问同一个文档中的多处不同数据。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p></o:p></span></p>
<p><o:p>三 ： <span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong>JDOM</strong></span></o:p></p>
<p><o:p><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong>&nbsp;&nbsp; </strong><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">的目的是成为</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">Java</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">特定文档模型，它简化与</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">的交互并且比使用</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">实现更快。由于是第一个</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">Java</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">特定模型，</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">一直得到大力推广和促进。正在考虑通过</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&ldquo;Java</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">规范请求</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JSR<st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="102" numbertype="1" negative="True" unitname="”" w:st="on">-102&rdquo;</st1:chmetcnv></span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">将它最终用作</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&ldquo;Java</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">标准扩展</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&rdquo;</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">。从</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">2000</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">年初就已经开始了</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">开发。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p></o:p></span></span></o:p></p>
<p style="VERTICAL-ALIGN: bottom; LINE-HEIGHT: 15pt"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&nbsp;&nbsp;&nbsp; JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">与</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">主要有两方面不同。首先，</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">仅使用具体类而不使用接口。这在某些方面简化了</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">API</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">，但是也限制了灵活性。第二，</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">API</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">大量使用了</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">Collections</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">类，简化了那些已经熟悉这些类的</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">Java</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">开发者的使用。</span></p>
<p style="VERTICAL-ALIGN: bottom; LINE-HEIGHT: 15pt"><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">&nbsp;&nbsp; <span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档声明其目的是</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&ldquo;</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">使用</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">20%</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">（或更少）的精力解决</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">80%</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">（或更多）</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">Java/XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">问题</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&rdquo;</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">（根据学习曲线假定为</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">20%</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">）。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">对于大多数</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">Java/XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">应用程序来说当然是有用的，并且大多数开发者发现</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">API</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">比</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">容易理解得多。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">还包括对程序行为的相当广泛检查以防止用户做任何在</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">中无意义的事。然而，它仍需要您充分理解</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">以便做一些超出基本的工作（或者甚至理解某些情况下的错误）。这也许是比学习</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">或</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">接口都更有意义的工作。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p></o:p></span></span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p></o:p></span></p>
<p style="VERTICAL-ALIGN: bottom; LINE-HEIGHT: 15pt"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&nbsp;&nbsp;&nbsp; JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">自身不包含解析器。它通常使用</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX2</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">解析器来解析和验证输入</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档（尽管它还可以将以前构造的</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">表示作为输入）。它包含一些转换器以将</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">表示输出成</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">SAX2</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">事件流、</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">模型或</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文本文档。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">是在</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">Apache</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">许可证变体下发布的开放源码。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p></o:p></span></p>
<p style="VERTICAL-ALIGN: bottom; LINE-HEIGHT: 15pt">四： <span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong>DOM4J </strong></span></p>
<p style="VERTICAL-ALIGN: bottom; LINE-HEIGHT: 15pt"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: Arial; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><strong>&nbsp;&nbsp;&nbsp; </strong><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">虽然</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM4J</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">代表了完全独立的开发结果，但最初，它是</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">JDOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">的一种智能分支。它合并了许多超出基本</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">文档表示的功能，包括集成的</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XPath</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">支持、</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">XML Schema</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项，它通过</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM4J API</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">和标准</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">DOM</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">接口具有并行访问功能。从</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">2000</span><span style="FONT-SIZE: 10.5pt; mso-hansi-font-family: ˎ̥; mso-ascii-font-family: ˎ̥; mso-bidi-font-family: Arial">下半年开始，它就一直处于开发之中。</span><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial"><o:p></o:p></span></span></p>
<p style="VERTICAL-ALIGN: bottom; LINE-HEIGHT: 15pt"><span lang="EN-US" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ˎ̥; mso-bidi-font-family: Arial">&nbsp;&nbsp;&nbsp; </s