﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-成长空间-随笔分类-读书笔记</title><link>http://www.blogjava.net/davidgw/category/24401.html</link><description>MiLife</description><language>zh-cn</language><lastBuildDate>Sat, 08 Sep 2007 07:11:24 GMT</lastBuildDate><pubDate>Sat, 08 Sep 2007 07:11:24 GMT</pubDate><ttl>60</ttl><item><title>SSL的证书验证</title><link>http://www.blogjava.net/davidgw/archive/2007/09/04/142714.html</link><dc:creator>Picasso</dc:creator><author>Picasso</author><pubDate>Tue, 04 Sep 2007 10:05:00 GMT</pubDate><guid>http://www.blogjava.net/davidgw/archive/2007/09/04/142714.html</guid><wfw:comment>http://www.blogjava.net/davidgw/comments/142714.html</wfw:comment><comments>http://www.blogjava.net/davidgw/archive/2007/09/04/142714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/davidgw/comments/commentRss/142714.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/davidgw/services/trackbacks/142714.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed; line-height: 1.4; word-wrap: break-word" height="100%" width="100%">
    <tbody>
        <tr valign="top" width="100%">
            <td><font styel="font-family: Tahoma, Arial; font-weight: bold; font-size: 12px"><strong>SSL协议与数字证书原理 </strong></font></td>
            <td align="right" width="86"><font color="#555555">1楼</font> <a name="64888"></a></td>
        </tr>
        <tr>
            <td colspan="2"><span class="javascript" id="text1"><br />
            SSL 协议的握手和通讯 <br />
            <br />
            　　为了便于更好的认识和理解 SSL 协议，这里着重介绍 SSL 协议的握手协议。SSL 协议既用到了公钥加密技术又用到了对称加密技术，对称加密技术虽然比公钥加密技术的速度快，可是公钥加密技术提供了更好的身份认证技术。SSL 的握手协议非常有效的让客户和服务器之间完成相互之间的身份认证，其主要过程如下：<br />
            　　① 客户端的浏览器向服务器传送客户端 SSL 协议的版本号，加密算法的种类，产生的随机数，以及其他服务器和客户端之间通讯所需要的各种信息。<br />
            　　② 服务器向客户端传送 SSL 协议的版本号，加密算法的种类，随机数以及其他相关信息，同时服务器还将向客户端传送自己的证书。<br />
            　 ③　客户利用服务器传过来的信息验证服务器的合法性，服务器的合法性包括：证书是否过期，发行服务器证书的 CA 是否可靠，发行者证书的公钥能否正确解开服务器证书的&#8220;发行者的数字签名&#8221;，服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过，通讯将断开；如果合法性验证通过，将继续进行第四步。<br />
            　　④　用户端随机产生一个用于后面通讯的&#8220;对称密码&#8221;，然后用服务器的公钥（服务器的公钥从步骤②中的服务器的证书中获得）对其加密，然后将加密后的&#8220;预主密码&#8221;传给服务器。 <br />
            　 ⑤ 如果服务器要求客户的身份认证（在握手过程中为可选），用户可以建立一个随机数然后对其进行数据签名，将这个含有签名的随机数和客户自己的证书以及加密过的&#8220;预主密码&#8221;一起传给服务器。 <br />
            　 ⑥ 如果服务器要求客户的身份认证，服务器必须检验客户证书和签名随机数的合法性，具体的合法性验证过程包括：客户的证书使用日期是否有效，为客户提供证书的 CA 是否可靠，发行 CA 的公钥能否正确解开客户证书的发行 CA 的数字签名，检查客户的证书是否在证书废止列表（CRL）中。检验如果没有通过，通讯立刻中断；如果验证通过，服务器将用自己的私钥解开加密的&#8220;预主密码&#8221;，然后执行一系列步骤来产生主通讯密码（客户端也将通过同样的方法产生相同的主通讯密码）。<br />
            　　⑦ 服务器和客户端用相同的主密码即&#8220;通话密码&#8221;，一个对称密钥用于 SSL 协议的安全数据通讯的加解密通讯。同时在 SSL 通讯过程中还要完成数据通讯的完整性，防止数据通讯中的任何变化。 <br />
            　　⑧ 客户端向服务器端发出信息，指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥，同时通知服务器客户端的握手过程结束。<br />
            　　⑨ 服务器向客户端发出信息，指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥，同时通知客户端服务器端的握手过程结束。<br />
            　　⑩ SSL 的握手部分结束，SSL 安全通道的数据通讯开始，客户和服务器开始使用相同的对称密钥进行数据通讯，同时进行通讯完整性的检验。<br />
            <br />
            <br />
            　　双向认证 SSL 协议的具体过程<br />
            　　 ① 浏览器发送一个连接请求给安全服务器。 <br />
            　　② 服务器将自己的证书，以及同证书相关的信息发送给客户浏览器。 <br />
            　　③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA 中心所签发的。如果是，就继续执行协议；如果不是，客户浏览器就给客户一个警告消息：警告客户这个证书不是可以信赖的，询问客户是否需要继续。<br />
            　　 ④ 接着客户浏览器比较证书里的消息，例如域名和公钥，与服务器刚刚发送的相关消息是否一致，如果是一致的，客户浏览器认可这个服务器的合法身份。 <br />
            　　 ⑤ 服务器要求客户发送客户自己的证书。收到后，服务器验证客户的证书，如果没有通过验证，拒绝连接；如果通过验证，服务器获得用户的公钥。 <br />
            　　 ⑥ 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。<br />
            　　 ⑦ 服务器从客户发送过来的密码方案中，选择一种加密程度最高的密码方案，用客户的公钥加过密后通知浏览器。 <br />
            　　 ⑧ 浏览器针对这个密码方案，选择一个通话密钥，接着用服务器的公钥加过密后发送给服务器。<br />
            　　 ⑨ 服务器接收到浏览器送过来的消息，用自己的私钥解密，获得通话密钥。 <br />
            　　 ⑩ 服务器、浏览器接下来的通讯都是用对称密码方案，对称密钥是加过密的。 <br />
            　　　上面所述的是双向认证 SSL 协议的具体通讯过程，这种情况要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有 CA 证书，具体的过程相对于上面的步骤，只需将服务器端验证客户证书的过程去掉，以及在协商对称密码方案，对称通话密钥时，服务器发送给客户的是没有加过密的（这并不影响 SSL 过程的安全性）密码方案。 这样，双方具体的通讯内容，就是加过密的数据，如果有第三方攻击，获得的只是加密的数据，第三方要获得有用的信息，就需要对加密的数据进行解密，这时候的安全就依赖于密码方案的安全。而幸运的是，目前所用的密码方案，只要通讯密钥长度足够的长，就足够的安全。这也是我们强调要求使用 128 位加密通讯的原因。<br />
            <br />
            <br />
            <br />
            证　书　各　部　分　的　含　义<br />
            Version 证书版本号，不同版本的证书格式不同 <br />
            Serial Number 序列号，同一身份验证机构签发的证书序列号唯一 <br />
            Algorithm Identifier 签名算法，包括必要的参数 Issuer 身份验证机构的标识信息 <br />
            Period of Validity 有效期 <br />
            Subject 证书持有人的标识信息 <br />
            Subject&#8217;s Public Key 证书持有人的公钥 <br />
            Signature 身份验证机构对证书的签名<br />
            <br />
            <br />
            　　证书的格式　 认证中心所发放的证书均遵循 X.509 V3 标准，其基本格式如下： <br />
            <br />
            证书版本号（Certificate Format Version） 含义：用来指定证书格式采用的 X.509 版本号。<br />
            证书序列号（Certificate Serial Number） 含义：用来指定证书的唯一序列号，以标识 CA 发出的所有公钥证书。<br />
            签名（Signature） 算法标识（Algorithm Identifier） 含义：用来指定 CA 签发证书所用的签名算法。 <br />
            签发此证书的 CA 名称（Issuer ） 含义：用来指定签发证书的 CA 的 X.500 唯一名称（DN， Distinguished Name）。<br />
            证书有效期（Validity Period） 起始日期（notBefore） 终止日期（notAfter） 含义：用来指定证书起始日期和终止日期。<br />
            用户名称（Subject） 含义：用来指定证书用户的 X.500 唯一名称（DN，Distinguished Name）。<br />
            用户公钥信息（Subject Public Key Information） 算法（algorithm） 算法标识（Algorithm　Identifier） 用户公钥（subject　Public　Key） 含义：用来标识公钥使用的算法，并包含公钥本身。 <br />
            证书扩充部分（扩展域）（Extensions） 含义：用来指定额外信息。　<br />
            X.509 V3 证书的扩充部分（扩展域）及实现方法如下： CA 的公钥标识（Authority　Key　Identifier） 公钥标识（SET 未使用）（Key　Identifier） 签发证书者证书的签发者的甄别名（Certificate　Issuer） 签发证书者证书的序列号（Certificate Serial Number）<br />
            <br />
            　X.509 V3 证书的扩充部分（扩展域）及实现CA 的公钥标识（Authority　Key　Identifier） 公钥标识（SET 未使用）（Key　Identifier） 签发证书者证书的签发者的甄别名（Certificat签发证书者证书的序列号（Certificate Serial N含义：CA 签名证书所用的密钥对的唯一标识用户的公钥标识（Subject　Key　Identifier）　含义：用来标识与证书中公钥相关的特定密钥进行解密。 证书中的公钥用途（Key　Usage） 含义：用来指定公钥用途。<br />
            用户的私钥有效期（Private　Key　Usage　Period） 起始日期（Note　Before） 终止日期（Note　After） 含义：用来指定用户签名私钥的起始日期和终止日期。 CA 承认的证书政策列表（Certificate Policies） 含义：用来指定用户证书所适用的政策，证书政策可由对象标识符表示。 用户的代用名（Substitutional　Name） 含义：用来指定用户的代用名。 CA 的代用名（Issuer　Alt　Name） 含义：用来指定 CA 的代用名。 基本制约（Basic　Constraints） 含义：用来表明证书用户是最终用户还是 CA。 在 SET 系统中有一些私有扩充部分（扩展域）Hashed　Root　Key 含义：只在根证书中使用，用于证书更新时进行回溯。 证书类型（Certificate　Type） 含义：用来区别不同的实体。该项是必选的。 商户数据（Merchant　Data） 含义：包含支付网关需要的所有商户信息。 持卡人证书需求（Card　Cert　Required） 含义：显示支付网关是否支持与没有证书的持卡人进行交易。 SET 扩展（SETExtensions） 含义：列出支付网关支持的支付命令的 SET 信息扩展。 CRL 数据定义版本（Version） 含义：显示 CRL 的版本号。<br />
            CRL 的签发者（Issuer） 含义：指明签发 CRL 的 CA 的甄别名。 CRL 发布时间（this　Update） 预计下一个 CRL 更新时间（Next　Update） 撤销证书信息目录（Revoked　Certificates） CRL 扩展（CRL　Extension） CA 的公钥标识（Authority　Key　Identifier） CRL 号（CRL　Number）<br />
            </span></td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/davidgw/aggbug/142714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/davidgw/" target="_blank">Picasso</a> 2007-09-04 18:05 <a href="http://www.blogjava.net/davidgw/archive/2007/09/04/142714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XML NameSpace</title><link>http://www.blogjava.net/davidgw/archive/2007/07/26/132473.html</link><dc:creator>Picasso</dc:creator><author>Picasso</author><pubDate>Thu, 26 Jul 2007 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/davidgw/archive/2007/07/26/132473.html</guid><wfw:comment>http://www.blogjava.net/davidgw/comments/132473.html</wfw:comment><comments>http://www.blogjava.net/davidgw/archive/2007/07/26/132473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/davidgw/comments/commentRss/132473.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/davidgw/services/trackbacks/132473.html</trackback:ping><description><![CDATA[<a href="http://zhangjunhd.blog.51cto.com/113473/18934">http://zhangjunhd.blog.51cto.com/113473/18934</a>
<img src ="http://www.blogjava.net/davidgw/aggbug/132473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/davidgw/" target="_blank">Picasso</a> 2007-07-26 11:14 <a href="http://www.blogjava.net/davidgw/archive/2007/07/26/132473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Single Sign on 2</title><link>http://www.blogjava.net/davidgw/archive/2007/07/25/132372.html</link><dc:creator>Picasso</dc:creator><author>Picasso</author><pubDate>Wed, 25 Jul 2007 10:50:00 GMT</pubDate><guid>http://www.blogjava.net/davidgw/archive/2007/07/25/132372.html</guid><wfw:comment>http://www.blogjava.net/davidgw/comments/132372.html</wfw:comment><comments>http://www.blogjava.net/davidgw/archive/2007/07/25/132372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/davidgw/comments/commentRss/132372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/davidgw/services/trackbacks/132372.html</trackback:ping><description><![CDATA[Java based:<a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/xiaojing/SSOprepare/SSOprepare.html"><br>http://www.ibm.com/developerworks/cn/websphere/library/techarticles/xiaojing/SSOprepare/SSOprepare.html</a> <br><br>MS based:<br><a href="http://www.microsoft.com/china/community/MsSpecialist/1.mspx">http://www.microsoft.com/china/community/MsSpecialist/1.mspx</a>
<img src ="http://www.blogjava.net/davidgw/aggbug/132372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/davidgw/" target="_blank">Picasso</a> 2007-07-25 18:50 <a href="http://www.blogjava.net/davidgw/archive/2007/07/25/132372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单点登陆 single sign-on</title><link>http://www.blogjava.net/davidgw/archive/2007/07/25/132371.html</link><dc:creator>Picasso</dc:creator><author>Picasso</author><pubDate>Wed, 25 Jul 2007 10:44:00 GMT</pubDate><guid>http://www.blogjava.net/davidgw/archive/2007/07/25/132371.html</guid><wfw:comment>http://www.blogjava.net/davidgw/comments/132371.html</wfw:comment><comments>http://www.blogjava.net/davidgw/archive/2007/07/25/132371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/davidgw/comments/commentRss/132371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/davidgw/services/trackbacks/132371.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;只有注册用户登录后才能阅读该文。<a href='http://www.blogjava.net/davidgw/archive/2007/07/25/132371.html'>阅读全文</a><img src ="http://www.blogjava.net/davidgw/aggbug/132371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/davidgw/" target="_blank">Picasso</a> 2007-07-25 18:44 <a href="http://www.blogjava.net/davidgw/archive/2007/07/25/132371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOM简介</title><link>http://www.blogjava.net/davidgw/archive/2007/07/25/132339.html</link><dc:creator>Picasso</dc:creator><author>Picasso</author><pubDate>Wed, 25 Jul 2007 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/davidgw/archive/2007/07/25/132339.html</guid><wfw:comment>http://www.blogjava.net/davidgw/comments/132339.html</wfw:comment><comments>http://www.blogjava.net/davidgw/archive/2007/07/25/132339.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/davidgw/comments/commentRss/132339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/davidgw/services/trackbacks/132339.html</trackback:ping><description><![CDATA[<p><a href="http://book.csdn.net/bookfiles/110/1001107072.shtml">http://book.csdn.net/bookfiles/110/1001107072.shtml</a><br><br>DOM教程（什么是DOM）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作为结构的&nbsp;DOM<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中导航仪寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构，然后才能做任何工作。由于它是基于信息层次的，因而&nbsp;DOM&nbsp;被认为是基于树或基于对象的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于特别大的文档，解析和加载整个文档可能很慢且很耗资源，因此使用其他手段来处理这样的数据会更好。这些基于事件的模型，比如&nbsp;Simple&nbsp;API&nbsp;for&nbsp;XML（SAX），适用于处理数据流，即随着数据的流动而依次处理数据。基于事件的&nbsp;API&nbsp;消除了在内存中构造树的需要，但是却不允许开发人员实际更改原始文档中的数据。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;另一方面，DOM&nbsp;还提供了一个&nbsp;API，允许开发人员添加、编辑、移动或删除树中任意位置的节点，从而创建一个引用程序。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解析器是一个软件应用程序，设计用于分析文档（这里是指&nbsp;XML&nbsp;文件），以及做一些特定于该信息的事情。在诸如&nbsp;SAX&nbsp;这样基于事件的&nbsp;API&nbsp;中，解析器将向某种监听器发送事件。在诸如&nbsp;DOM&nbsp;这样基于树的&nbsp;API&nbsp;中，解析器将在内存中构造一颗数据树。<br>作为&nbsp;API&nbsp;的&nbsp;DOM<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从&nbsp;DOM&nbsp;Level&nbsp;1&nbsp;开始，DOM&nbsp;API&nbsp;包含了一些接口，用于表示可从&nbsp;XML&nbsp;文档中找到的所有不同类型的信息。它还包含使用这些对象所必需的方法和属性。<br>Level&nbsp;1&nbsp;包括对&nbsp;XML&nbsp;1.0&nbsp;和&nbsp;HTML&nbsp;的支持，每个&nbsp;HTML&nbsp;元素被表示为一个接口。它包括用于添加、编辑、移动和读取节点中包含的信息的方法，等等。然而，它没有包括对&nbsp;XML&nbsp;名称空间（XML&nbsp;Namespace）的支持，XML&nbsp;名称空间提供分割文档中的信息的能力。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DOM&nbsp;Level&nbsp;2&nbsp;添加了名称空间支持。Level&nbsp;2&nbsp;扩展了&nbsp;Level&nbsp;1，允许开发人员检测和使用可能适用于某个节点的名称空间信息。Level&nbsp;2&nbsp;还增加了几个新的模块，以支持级联样式表、事件和增强的树操作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当前正处于定稿阶段的&nbsp;DOM&nbsp;Level&nbsp;3&nbsp;包括对创建&nbsp;Document&nbsp;对象（以前的版本将这个任务留给实现，使得创建通用应用程序很困难）的更好支持、增强的名称空间支持，以及用来处理文档加载和保存、验证以及&nbsp;XPath&nbsp;的新模块；XPath&nbsp;是在&nbsp;XSL&nbsp;转换（XSL&nbsp;Transformation）以及其他&nbsp;XML&nbsp;技术中用来选择节点的手段。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DOM&nbsp;的模块化意味着作为开发人员，您必须知道自己希望使用的特性是否受正在使用的&nbsp;DOM&nbsp;实现所支持。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;确定特性可用性<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DOM&nbsp;推荐标准的模块性质允许实现者挑选将要包括到产品中的部分，因而在使用某个特定的特性之前，首先确定该特性是否可用可能是必要的。本教程仅使用&nbsp;DOM&nbsp;Level&nbsp;2&nbsp;Core&nbsp;API，不过在着手您自己的项目时，了解如何能够检测特性是有所帮助的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DOM&nbsp;中定义的接口之一就是&nbsp;DOMImplementation。通过使用&nbsp;hasFeature()&nbsp;方法，您可以确定某个特定的特性是否受支持。DOM&nbsp;Level&nbsp;2&nbsp;中不存在创建DOMImplementation&nbsp;的标准方法，不过下面的代码将展示如何使用&nbsp;hasFeature()&nbsp;来确定&nbsp;DOM&nbsp;Level&nbsp;2&nbsp;样式表模块在某个&nbsp;Java&nbsp;应用程序中是否受支持。<br>import&nbsp;javax.xml.parsers.DocumentBuilderFactory;<br>import&nbsp;javax.xml.parsers.DocumentBuilder;<br>import&nbsp;org.w3c.dom.DOMImplementation;<br>public&nbsp;class&nbsp;ShowDomImpl&nbsp;{<br>&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main&nbsp;(String&nbsp;args[])&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DocumentBuilderFactory&nbsp;dbf&nbsp;=&nbsp;DocumentBuilderFactory.newInstance();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DocumentBuilder&nbsp;docb&nbsp;=&nbsp;dbf.newDocumentBuilder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DOMImplementation&nbsp;domImpl&nbsp;=&nbsp;docb.getDOMImplementation();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(domImpl.hasFeature("StyleSheets",&nbsp;"2.0"))&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Style&nbsp;Sheets&nbsp;are&nbsp;supported.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Style&nbsp;Sheets&nbsp;are&nbsp;not&nbsp;supported.");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;}<br>}<br>（DOM&nbsp;Level&nbsp;3&nbsp;将包括用于创建&nbsp;DOMImplementation&nbsp;的标准方法。）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本教程将使用单个文档来展示&nbsp;DOM&nbsp;Level&nbsp;2&nbsp;Core&nbsp;API&nbsp;的对象和方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基本的&nbsp;XML&nbsp;文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本教程中的所有例子都是用了一个包含如下节点的&nbsp;XML&nbsp;文件，它表示输入某个商业系统的订单。回顾一下，XML&nbsp;文件的基本组成部分包括：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>XML&nbsp;声明：</strong>基本的声明&nbsp;&lt;?xml&nbsp;version"1.0"?&gt;&nbsp;将这个文件定义为&nbsp;XML&nbsp;文档。在声明中指定一种字符编码的情况并不鲜见，如下所示。通过这种方式，不管该&nbsp;XML&nbsp;文件使用的语言或字符编码是什么，只要解析器理解特定的编码，它就能够正确地读取该&nbsp;XML&nbsp;文件。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>DOCTYPE&nbsp;声明：</strong>XML&nbsp;是人机之间交换信息的便利手段，但是要使它能够顺利地工作，必须要有一个公共的词汇表。可选的&nbsp;DOCTYPE&nbsp;声明可用于指定一个应该用来与此文件做比较的文档（在本例中为&nbsp;orders.dtd），以确保不会产生任何混淆或丢失信息（例如，丢失一个&nbsp;userid&nbsp;或错误拼写某个元素名称）。以这种方式处理过的文档称为有效的文档。成功的有效性检查并不是&nbsp;XML&nbsp;所必需的，后面的例子实际上从文档中省略了&nbsp;DOCTYPE&nbsp;声明。&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>数据本身：</strong>XML&nbsp;文档中的数据必须包含在单个根元素内，比如下面的&nbsp;orders&nbsp;元素。要使&nbsp;XML&nbsp;文档得到处理，它必须是格式良好的（well-formed）。&nbsp;<br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;!DOCTYPE&nbsp;ORDERS&nbsp;SYSTEM&nbsp;"orders.dtd"&gt;<br>&lt;orders&gt;<br>&nbsp;&nbsp;&nbsp;&lt;order&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;customerid&nbsp;limit="1000"&gt;12341&lt;/customerid&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;status&gt;pending&lt;/status&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&nbsp;instock="Y"&nbsp;itemid="SA15"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;Silver&nbsp;Show&nbsp;Saddle,&nbsp;16&nbsp;inch&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;price&gt;825.00&lt;/price&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;qty&gt;1&lt;/qty&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&nbsp;instock="N"&nbsp;itemid="C49"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;Premium&nbsp;Cinch&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;price&gt;49.00&lt;/price&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;qty&gt;1&lt;/qty&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/order&gt;<br>&nbsp;&nbsp;&nbsp;&lt;order&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;customerid&nbsp;limit="150"&gt;251222&lt;/customerid&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;status&gt;pending&lt;/status&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;item&nbsp;instock="Y"&nbsp;itemid="WB78"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;Winter&nbsp;Blanket&nbsp;(78&nbsp;inch)&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;price&gt;20&lt;/price&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;qty&gt;10&lt;/qty&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/item&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/order&gt;<br>&lt;/orders&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;在&nbsp;DOM&nbsp;中，使用&nbsp;XML&nbsp;信息意味着首先将它划分为节点。</p>
<img src ="http://www.blogjava.net/davidgw/aggbug/132339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/davidgw/" target="_blank">Picasso</a> 2007-07-25 16:34 <a href="http://www.blogjava.net/davidgw/archive/2007/07/25/132339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>