﻿<?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>博客园-luckyzmw的.net天空</title><link>http://www.cnblogs.com/luckyzmw/</link><description>语言不是重要的，重要的是编程思想</description><language>zh-cn</language><lastBuildDate>Sat, 04 Jul 2009 18:28:44 GMT</lastBuildDate><pubDate>Sat, 04 Jul 2009 18:28:44 GMT</pubDate><ttl>60</ttl><item><title>XML 编程简介</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/11/09/554774.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Wed, 08 Nov 2006 17:41:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/11/09/554774.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/554774.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/11/09/554774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/554774.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/554774.html</trackback:ping><description><![CDATA[&nbsp;
<div class=postText>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 24pt"><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">&nbsp;<br>&nbsp;&nbsp;1. XML </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">文档操作</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;1.1 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">加载一个</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">XML</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">文档</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;Dim objDoc As New XmlDocument() <br>&nbsp;&nbsp;'-- Load xml document Sample.xml <br>&nbsp;&nbsp;objDoc.Load("Sample.xml") <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;1.2 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">加载一个</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">XML</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">数据</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp; Dim objDoc As New XmlDocument() <br>&nbsp;&nbsp; Dim strXML As String <br>&nbsp;&nbsp; strXML = "&lt;Employees&gt;&lt;Employee id=&#8221;<st1:chmetcnv w:st="on" unitname="&#8221;" sourcevalue="12345" hasspace="False" negative="False" numbertype="1" tcsc="0">12345&#8221;</st1:chmetcnv>&gt;&lt;Employee_ID&gt;12345&lt;/Employee_ID&gt;&lt;Name&gt;Zhang Bin&lt;/Name&gt;&lt;/Employee&gt;&lt;/Employees&gt;" <br>&nbsp;&nbsp; <br>&nbsp;&nbsp; '-- Load xml data <br>&nbsp;&nbsp; objDoc.Load(strXML) <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;1.3 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">保存文档</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;'—Save xml document <br>&nbsp;&nbsp;objDoc.Save("Sample.xml") <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;2 XML </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">数据的查询</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">最常见的</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">XML</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">数据类型有：</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Element, Attribute</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Comment, Text. <br>&nbsp;&nbsp;Element, </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">指形如</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">&lt;Name&gt;Tom&lt;Name&gt;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的节点。它可以包括：</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Element, Text, Comment, ProcessingInstruction, CDATA, and EntityReference. <br>&nbsp;&nbsp;Attribute, </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">指在</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">&lt;Employee id=&#8221;<st1:chmetcnv w:st="on" unitname="&#8221;" sourcevalue="12345" hasspace="False" negative="False" numbertype="1" tcsc="0">12345&#8221;</st1:chmetcnv>&gt;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">中的粗体部分。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;Comment</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，指形如：</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">&lt;!-- my comment --&gt; </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的节点。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;Text</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">，指在</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">&lt;Name&gt;Tom&lt;Name&gt;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的粗体部分。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">在</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">XML</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">中，可以用</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">XmlNode</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">对象来参照各种</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">XML</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">数据类型。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;2.1 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">查询已知绝对路径的节点（集）</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNodeList = objDoc.SelectNodes(&#8220;Company/Department/Employees/Employee&#8221;) <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">或者</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNodeList = objNode.SelectNodes(&#8220;/Company/Department/Employees/Employee&#8221;) <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">以上两种方法可返回一个</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">NodeList</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">对象，如果要返回单个节点可使用</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">SelectSingleNode</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">方法，该方法如果查询到一个或多个节点，返回第一个节点；如果没有查询的任何节点返回</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> Nothing</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">。例如：</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNode = objNode.SelectSingleNode(&#8220;/Company/Department/Employees/Employee&#8221;) <br>&nbsp;&nbsp;If Not (objNode is Nothing) then <br>&nbsp;&nbsp; &#8216;- Do process <br>&nbsp;&nbsp;End If <br>&nbsp;&nbsp;2.2 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">查询已知相对路径的节点（集）</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">可使用类似于文件路径的相对路径的方式来查询</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">XML</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的数据</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNode = objDoc.SelectSingleNode(&#8220;Company/Department&#8221;) <br>&nbsp;&nbsp;objNodeList = objNode.SelectNodes(&#8220;../Department) <br>&nbsp;&nbsp;objNode = objNode.SelectNode(&#8220;Employees/Employee&#8221;) <br>&nbsp;&nbsp;2.3 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">查询已知元素名的节点（集）</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">在使用不规则的层次文档时，由于不知道中间层次的元素名，可使用</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">//</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">符号来越过中间的节点，查询其子，孙或多层次下的其他所有元素。例如：</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNodeList = objDoc.SelectNodes(&#8220;Company//Employee&#8221;) <br>&nbsp;&nbsp;2.4 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">查询属性（</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">attribute</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）节点</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">以上的各种方法都返回元素（</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">element)</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">节点（集），返回属性（</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">attribute</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">），只需要采用相应的方法，在属性名前加一个</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">@</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">符号即可，例如：</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNodeList = objDoc.SelectNodes(&#8220;Company/Department/Employees/Employee/@id&#8221;) <br>&nbsp;&nbsp;objNodeList = objDoc.SelectNodes(&#8220;Company//@id&#8221;) <br>&nbsp;&nbsp;2.5 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">查询</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Text</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">节点</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">使用</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">text()</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">来获取</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Text</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">节点。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNode = objDoc.SelectSingleNode(&#8220;Company/Department/Deparmt_Name/text()&#8221;) <br>&nbsp;&nbsp;2.6 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">查询特定条件的节点</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">使用</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">[]</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">符号来查询特定条件的节点。例如：</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;a. </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">返回</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">id</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">号为</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> 10102</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Employee</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">节点</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp; objNode = objDoc.SelectSingleNode(&#8220;Company/Department/Employees/Employee[@id=&#8217;<st1:chmetcnv w:st="on" unitname="&#8217;" sourcevalue="10102" hasspace="False" negative="False" numbertype="1" tcsc="0">10102&#8217;</st1:chmetcnv>]&#8221;) <br>&nbsp;&nbsp;b. </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">返回</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Name</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">为</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Zhang Qi</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Name </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">节点</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp; objNode = objDoc.SelectSingleNode(&#8220;Company/Department/Employees/Employee/Name[text()=&#8217;Zhang Qi&#8217;]&#8221;) <br>&nbsp;&nbsp;c. </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">返回部门含有职员</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">22345</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">的部门名称节点</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNode = objDoc.SelectSingleNode("Company/Department[Employees/Employee/@id='22345']/Department_Name") <br>&nbsp;&nbsp;2.7 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">查询多重模式的节点</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">使用</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> | </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">符号可以获得多重模式的节点。例如：</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNodeList = objDoc.SelectNodes(&#8220;Company/Department/Department_Name | Company/Department/Manager&#8221;) <br>&nbsp;&nbsp;2.8 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">查询任意子节点</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">使用</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">*</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">符号可以返回当前节点的所有子节点。</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNodeList = objDoc.SelectNodes(&#8220;Company/*/Manager) <br>&nbsp;&nbsp;</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">或者</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNodeList = objNode.ChildNodes <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;3 XML</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">数据的编辑</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;3.1 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">增加一个元素的属性（</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">attribute</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）节点</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;Dim objNodeAttr As XmlNode <br>&nbsp;&nbsp; objNodeAttr = objDoc.CreateAttribute("id", Nothing) <br>&nbsp;&nbsp; objNodeAttr.InnerXml = "101" <br>&nbsp;&nbsp;objNode.Attributes.Append(objNodeAttr) <br>&nbsp;&nbsp;3.2 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">删除一个元素的属性</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNode.Attributes.Remove(objNodeAttr) <br>&nbsp;&nbsp;3.3 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">增加一个子元素（</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma">Element</span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">）</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;Dim objNodeChild As XmlNode <br>&nbsp;&nbsp;objNodeChild = objDoc.CreateElement(Nothing, "ID", Nothing) <br>&nbsp;&nbsp;objNodeChild.InnerXml = "101" <br>&nbsp;&nbsp;objNode.AppendChild(objNodeChild) <br>&nbsp;&nbsp;3.4 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">删除一个子元素</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNode.RemoveChild(objNodeChild) <br>&nbsp;&nbsp;3.5 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">替换一个子元素</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;objNOde.ReplaceChild(newChild,oldChild) <br>&nbsp;&nbsp; <br>&nbsp;&nbsp;4 </span><span style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma">参考数据</span><span lang=EN-US style="FONT-SIZE: 9pt; COLOR: #333333; LINE-HEIGHT: 150%; FONT-FAMILY: Tahoma"> <br>&nbsp;&nbsp;&lt;?xml version="1.0" encoding="UTF-8"?&gt; <br>&nbsp;&nbsp;&lt;Company&gt; <br>&nbsp;&nbsp; &lt;Department id="101"&gt; <br>&nbsp;&nbsp; &lt;Department_Name&gt;Cai WuBu&lt;/Department_Name&gt; <br>&nbsp;&nbsp; &lt;Manager&gt;Zhang Bin&lt;/Manager&gt; <br>&nbsp;&nbsp; &lt;Employees&gt; <br>&nbsp;&nbsp; &lt;Employee id="12345"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;12345&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;Zhang Bin&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;male&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;Employee id="10101"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;10101&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;Zhang QI&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;female&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;Employee id="10102"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;10102&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;Zhang Xia&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;male&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;Employee id="10201"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;10201&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;ZhangChuang&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;male&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;Employee id="10202"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;10202&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;Zhang Jun&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;male&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;/Employees&gt; <br>&nbsp;&nbsp; &lt;/Department&gt; <br>&nbsp;&nbsp; &lt;Department id="102"&gt; <br>&nbsp;&nbsp; &lt;Department_Name&gt;KaiFa Bu&lt;/Department_Name&gt; <br>&nbsp;&nbsp; &lt;Manager&gt;Wang Bin&lt;/Manager&gt; <br>&nbsp;&nbsp; &lt;Employees&gt; <br>&nbsp;&nbsp; &lt;Employee id="22345"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;22345&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;Wang Bin&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;male&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;Employee id="20101"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;20101&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;Wang QI&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;female&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;Employee id="20102"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;20102&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;Wang Xia&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;male&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;Employee id="20201"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;20201&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;Wang Chuang&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;male&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;Employee id="20202"&gt; <br>&nbsp;&nbsp; &lt;Employee_ID&gt;20201&lt;/Employee_ID&gt; <br>&nbsp;&nbsp; &lt;Name&gt;Wang Jun&lt;/Name&gt; <br>&nbsp;&nbsp; &lt;Gender&gt;male&lt;/Gender&gt; <br>&nbsp;&nbsp; &lt;/Employee&gt; <br>&nbsp;&nbsp; &lt;/Employees&gt; <br>&nbsp;&nbsp; &lt;/Department&gt; <br>&nbsp;&nbsp;&lt;/Company&gt;</span></p>
&nbsp;</div>
<img src ="http://www.cnblogs.com/luckyzmw/aggbug/554774.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>ASP.net里大文件上传的问题讨论</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/10/30/544034.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Sun, 29 Oct 2006 17:23:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/10/30/544034.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/544034.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/10/30/544034.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/544034.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/544034.html</trackback:ping><description><![CDATA[<h2 class=post-title>ASP.net里大文件上传的问题讨论</h2>
<p class=post-title>转载自：<a href="http://www.fishpro.cn/post/8.html">http://www.fishpro.cn/post/8.html</a>&nbsp;<a href="http://www.fishpro.cn/"><font color=#0066ff>拒绝潜水的鱼-WEB2.0新势力</font></a></p>
<div class=post-body>ASP.net里大文件上传的问题讨论！<br><br>1、解决方案：<br><br>.NET大文件上传知识整理<br><br>最近做在做ePartner项目，涉及到文件上传的问题。 以前也做过文件上传，但都是些小文件，不超过2M。 这次要求上传100M以上的东西。没办法找来资料研究了一下。基于WEB的文件上传可以使用FTP和HTTP两种协议，用FTP的话虽然传输稳定，但安全性是个严重的问题，而且FTP服务器读用户库获取权限，这样对于用户使用来说还是不太方便。剩下只有HTTP。在HTTP中有3种方式，PUT、WEBDAV、RFC1867，前2种方法不适合大文件上传，目前我们使用的web上传都是基于 RFC1867标准的HTML中基于表单的文件上传。<br><br>一、先简要介绍一下RFC1867（Form-based File Upload in HTML）标准：<br>1．带有文件提交功能的HTML表单<br>现有的HTML规范为INPUT元素的TYPE属性定义了八种可能的值，分别是：CHECKBOX, HIDDEN, IMAGE, PASSWORD, RADIO, RESET, SUBMIT, TEXT. 另外，当表单采用POST方式的时候，表单默认的具有"application/x-www-form-urlencoded" 的ENCTYPE属性。<br><br>RFC1867标准对HTML做出了两处修改：<br>1）为INPUT元素的TYPE属性增加了一个FILE选项。<br>2）INPUT标记可以具有ACCEPT属性，该属性能够指定可被上传的文件类型或文件格式列表。<br><br>另外，本标准还定义了一种新的MIME类型：multipart/form-data，以及当处理一个带有ENCTYPE="multipart/form-data" 并且/或含有<input type=file>的标记的表单时所应该采取的行为。<br><br>举例来说，当HTML表单作者想让用户能够上传一个或更多的文件时，他可以这么写：<br><br>
<form action=_URL_ method=post encType=multipart/form-data>
    File to process:<br><input type=file name=userfile1><br><input type=submit value="Send File"><br>
</form>
<br>HTML DTD里所需要做出的改动是为InputType实体增加一个选项。此外，我们也建议用一系列用逗号分隔的文件类型来作为INPUT标记的ACCEPT属性。<br><br>... (其他元素) ...<br><br><!entity % InputType "(TEXT | PASSWORD | CHECKBOX |<br/>
RADIO | SUBMIT | RESET |<br/>
IMAGE | HIDDEN | FILE )"><br><!element INPUT - 0 EMPTY><br><!attlist INPUT<br/>
TYPE %InputType TEXT<br>NAME CDATA #IMPLIED -- required for all but submit and reset<br>VALUE CDATA #IMPLIED<br>SRC %URI #IMPLIED -- for image inputs --<br>CHECKED (CHECKED) #IMPLIED<br>SIZE CDATA #IMPLIED --like NUMBERS,<br>but delimited with comma, not space<br>MAXLENGTH NUMBER #IMPLIED<br>ALIGN (top|middle|bottom) #IMPLIED<br>ACCEPT CDATA #IMPLIED --list of content types<br>&gt;<br><br>... (其他元素) ...<br><br>2.文件传输延迟<br>在某些情况下，在确实准备接受数据前，服务器先对表单数据中的某些元素（比如说用户名，账号等）进行验证是推荐的做法。但是，经过一定的考虑后，我们认为如果服务器想这样做的话，最好是采用一系列的表单，并将前面所验证过的数据元素作为&#8220;隐藏&#8221;字段传回给客户端，或者是通过安排表单使那些需要验证的元素先显示出来。这样的话，那些需要做复杂的应用的服务器可以自己维持事务处理的状态，而那些简单的应用的则可以实现得简单些。<br><br>HTTP协议可能需要知道整个事务处理中的内容总长度。即使没有明确要求，HTTP客户端也应该提供上传的所有文件的内容总长度，这样一个繁忙的服务器就能够判断文件的内容是否是过大以至于将不能完整地处理，从而返回一个错误代码并关闭该连接，而不用等到接受了所有的数据才进行判断。目前一些现有的CGI应用对所有的 POST事务都需要知道内容总长度。<br><br>如果INPUT标记含有一个MAXLENGTH属性，客户端可以将这个属性值看作是服务器端所能够接受的传送文件的最大字节数。在这种情况下，服务器能够在上传开始前，提示客户端在服务器上有多少空间可以用来进行文件上传。但是应该引起注意的是，这仅仅是一个提示，在表单被创建后和文件上传前，服务器的实际需求可能会发生改变。<br><br>在任何情况下，如果接受的文件过大的话，任何一个HTTP服务器都有可能在文件传输的过程中中断传输。<br><br>3.传输二进制数据的其他解决办法<br>有些人曾经建议使用一种新的MIME类型"aggregate"，比如说aggregate/mixed 或是content-transfer-encoding "包"来描述那些不确定长度的二进制数据，而不是*分解为多个部分来表示。虽然我们并不反对这么做，但这需要增加额外的设计和标准化工作来让大家接受并理解"aggregate"。从另一方面来说，"分解为多部分"的机制工作得很好，能够非常简单的在客户发送端和服务器接受端加以实现，而且能像其他一些综合处理二进制数据的方式一样高效率地工作。<br><br>4.例子<br>假设服务器段提供的是如下的HTML：<br>
<form action=http://server.dom/cgi/handle <br>
    ENCTYPE="multipart/form-data"<br>METHOD=POST&gt;<br>What is your name? <input name=submitter><br>What files are you sending? <input type=file name=pics><br>
</form>
用户在&#8220;姓名&#8221;字段里面填写"Joe Blow"，对问题'What files are you sending?'，用户选择<br>了一个文本文件"file1.txt"。<br>客户段可能发送回如下的数据：<br>Content-type: multipart/form-data, boundary=AaB03x<br><br>--AaB03x<br>content-disposition: form-data; name="field1"<br><br>Joe Blow<br>--AaB03x<br>content-disposition: form-data; name="pics"; filename="file1.txt"<br>Content-Type: text/plain<br><br>... file1.txt 的内容...<br>--AaB03x--<br>如果用户同时还选择了另一个图片文件"file2.gif"，那么客户端可能发送的数据将是：<br>Content-type: multipart/form-data, boundary=AaB03x<br><br>--AaB03x<br>content-disposition: form-data; name="field1"<br><br>Joe Blow<br>--AaB03x<br>content-disposition: form-data; name="pics"<br>Content-type: multipart/mixed, boundary=BbC04y<br><br>--BbC04y<br>Content-disposition: attachment; filename="file1.txt"<br><br>Content-Type: text/plain<br><br>... file1.txt 的内容...<br>--BbC04y<br>Content-disposition: attachment; filename="file2.gif"<br>Content-type: image/gif<br>Content-Transfer-Encoding: binary<br><br>... file2.gif的内容...<br>--BbC04y--<br>--AaB03x--<br><br><br>二、利用RFC1867标准处理文件上传的两种方式：<br>1．一次性得到上传的数据，然后分析处理。<br>看了N多代码之后发现，目前无组件程序和一些COM组件都是使用Request.BinaryRead方法。一次性得到上传的数据，然后分析处理。这就是为什么上传大文件很慢的原因了，IIS超时不说，就算几百M文件上去了，分析处理也得一阵子。<br>2．一边接收文件，一边写硬盘。<br><br>了解了一下国外的商业组件，比较流行的有Power-Web，AspUpload,ActiveFile,ABCUpload, aspSmartUpload,SA-FileUp。其中比较优秀的是ASPUPLOAD和SA-FILE，他们号称可以处理2G的文件(SA-FILE EE版甚至没有文件大小的限制)，而且效率也是非常棒，难道编程语言的效率差这么多?查了一些资料,觉得他们都是直接操作文件流。这样就不受文件大小的制约。但老外的东西也不是绝对完美，ASPUPLOAD处理大文件后,内存占用情况惊人。1G左右都是稀松平常。至于SA-FILE虽然是好东西但是破解难寻。然后发现2款.NET上传组件，Lion.Web.UpLoadModule和AspnetUpload也是操作文件流。但是上传速度和CPU占用率都不如老外的商业组件。<br>做了个测试，LAN内传1G的文件。ASPUPLOAD上传速度平均是4.4M/s，CPU占用10-15，内存占用 700M。SA-FILE也差不多这样。而AspnetUpload最快也只有1.5M/s，平均是700K/s，CPU占用15-39，测试环境: PIII800,256M内存,100M LAN。我想AspnetUpload速度慢是可能因为一边接收文件，一边写硬盘。资源占用低的代价就是降低传输速度。但也不得不佩服老外的程序，CPU 占用如此之低.....<br><br>三、ASP.NET上传文件遇到的问题<br>我们在用ASP.NET上传大文件时都遇到过这样或那样的问题。设置很大的maxRequestLength值并不能完全解决问题，因为ASP.NET会block直到把整个文件载入内存后，再加以处理。实际上，如果文件很大的话，我们经常会见到Internet Explorer显示 "The page cannot be displayed - Cannot find server or DNS Error"，好像是怎么也catch不了这个错误。为什么？因为这是个client side错误，server side端的Application_Error是处理不到的。<br>四、ASP.NET大文件上传解决方案<br>解决的方法是利用隐含的HttpWorkerRequest，用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。Chris Hynes为我们提供了这样的一个方案(用HttpModule)，该方案除了允许你上传大文件外，还能实时显示上传进度。<br>Lion.Web.UpLoadModule和AspnetUpload 两个.NET组件都是利用的这个方案。<br><br>方案原理：<br>利用HttpHandler实现了类似于ISAPI Extention的功能，处理请求(Request)的信息和发送响应(Response)。<br><br>方案要点：<br>1． httpHandler or HttpModule<br>a.在asp.net进程处理request请求之前截获request对象<br>b.分块读取和写入数据<br>c.实时跟踪上传进度更新meta信息<br>2． 利用隐含的HttpWorkerRequest用它的GetPreloadedEntityBody 和 ReadEntityBody方法处理文件流<br>IServiceProvider provider = (IServiceProvider) HttpContext.Current;<br>HttpWorkerRequest wr = (HttpWorkerRequest) provider.GetService(typeof(HttpWorkerRequest));<br>byte[] bs = wr.GetPreloadedEntityBody();<br>....<br>if (!wr.IsEntireEntityBodyIsPreloaded())<br>{<br>int n = 1024;<br>byte[] bs2 = new byte;<br>while (wr.ReadEntityBody(bs2,n) &gt;0)<br>{<br>.....<br>}<br>}<br>3． 自定义Multipart MIME 解析器<br>自动截获MIME分割符<br>将文件分块写如临时文件<br>实时更新Appliaction 状态（ReceivingData, Error, Complete） <br><br>/例子<br>HttpApplication application1 = sender as HttpApplication;<br>HttpWorkerRequest request1 = (HttpWorkerRequest) ((IServiceProvider) HttpContext.Current).GetService(typeof(HttpWorkerRequest));<br>try<br>{<br>if (application1.Context.Request.ContentType.IndexOf("multipart/form-data") &lt;= -1)<br>{<br>return;<br>}<br>//Check The HasEntityBody<br>if (!request1.HasEntityBody())<br>{<br>return;<br>}<br>int num1 = 0;<br>TimeSpan span1 = DateTime.Now.Subtract(this.beginTime);<br><br>string text1 = application1.Context.Request.ContentType.ToLower();<br><br>byte[] buffer1 = Encoding.ASCII.GetBytes(("\r\n--" + text1.Substring(text1.IndexOf("boundary=") + 9)).ToCharArray());<br>int num2 = Convert.ToInt32(request1.GetKnownRequestHeader(11));<br>Progress progress1 = new Progress();<br><br>application1.Context.Items.Add("FileList", new Hashtable());<br><br>byte[] buffer2 = request1.GetPreloadedEntityBody();<br>num1 += buffer2.Length;<br><br>string text2 = this.AnalysePreloadedEntityBody(buffer2, "UploadGUID");<br>if (text2 != string.Empty)<br>{<br>application1.Context.Items.Add("LionSky_UpLoadModule_UploadGUID", text2);<br>}<br>bool flag1 = true;<br>if ((num2 &gt; this.UpLoadFileLength()) &amp;&amp; ((0 &gt; span1.TotalHours) || (span1.TotalHours &gt; 3)))<br>{<br>flag1 = false;<br>}<br>if ((0 &gt; span1.TotalHours) || (span1.TotalHours &gt; 3))<br>{<br>flag1 = false;<br>}<br>string text3 = this.AnalysePreloadedEntityBody(buffer2, "UploadFolder");<br>ArrayList list1 = new ArrayList();<br>RequestStream stream1 = new RequestStream(buffer2, buffer1, null, RequestStream.FileStatus.Close, RequestStream.ReadStatus.NoRead, text3, flag1, application1.Context, string.Empty);<br>list1.AddRange(stream1.ReadBody);<br>if (text2 != string.Empty)<br>{<br>progress1.FileLength = num2;<br>progress1.ReceivedLength = num1;<br>progress1.FileName = stream1.OriginalFileName;<br>progress1.FileCount = ((Hashtable) application1.Context.Items["FileList"]).Count;<br>application1.Application["_UploadGUID_" + text2] = progress1;<br>}<br><br>if (!request1.IsEntireEntityBodyIsPreloaded())<br>{<br>byte[] buffer4;<br>ArrayList list2;<br>int num3 = 204800;<br>byte[] buffer3 = new byte[num3];<br>while ((num2 - num1) &gt;= num3)<br>{<br>if (!application1.Context.Response.IsClientConnected)<br>{<br>this.ClearApplication(application1);<br>}<br>num3 = request1.ReadEntityBody(buffer3, buffer3.Length);<br>num1 += num3;<br>list2 = stream1.ContentBody;<br>if (list2.Count &gt; 0)<br>{<br>buffer4 = new byte[list2.Count + buffer3.Length];<br>list2.CopyTo(buffer4, 0);<br>buffer3.CopyTo(buffer4, list2.Count);<br>stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);<br>}<br>else<br>{<br>stream1 = new RequestStream(buffer3, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);<br>}<br>list1.AddRange(stream1.ReadBody);<br>if (text2 != string.Empty)<br>{<br>progress1.ReceivedLength = num1;<br>progress1.FileName = stream1.OriginalFileName;<br>progress1.FileCount = ((Hashtable) application1.Context.Items["FileList"]).Count;<br>application1.Application["_UploadGUID_" + text2] = progress1;<br>}<br>}<br>buffer3 = new byte[num2 - num1];<br>if (!application1.Context.Response.IsClientConnected &amp;&amp; (stream1.FStatus == RequestStream.FileStatus.Open))<br>{<br>this.ClearApplication(application1);<br>}<br>num3 = request1.ReadEntityBody(buffer3, buffer3.Length);<br>list2 = stream1.ContentBody;<br>if (list2.Count &gt; 0)<br>{<br>buffer4 = new byte[list2.Count + buffer3.Length];<br>list2.CopyTo(buffer4, 0);<br>buffer3.CopyTo(buffer4, list2.Count);<br>stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);<br>}<br>else<br>{<br>stream1 = new RequestStream(buffer3, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);<br>}<br>list1.AddRange(stream1.ReadBody);<br>if (text2 != string.Empty)<br>{<br>progress1.ReceivedLength = num1 + buffer3.Length;<br>progress1.FileName = stream1.OriginalFileName;<br>progress1.FileCount = ((Hashtable) application1.Context.Items["FileList"]).Count;<br>if (flag1)<br>{<br>progress1.UploadStatus = Progress.UploadStatusEnum.Uploaded;<br>}<br>else<br>{<br>application1.Application.Remove("_UploadGUID_" + text2);<br>}<br>}<br>}<br>byte[] buffer5 = new byte[list1.Count];<br>list1.CopyTo(buffer5);<br>this.PopulateRequestData(request1, buffer5);<br>}<br>catch (Exception exception1)<br>{<br>this.ClearApplication(application1);<br>throw exception1;<br>} </div>
<img src ="http://www.cnblogs.com/luckyzmw/aggbug/544034.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>E680最强综合技巧集合</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/10/14/529154.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Sat, 14 Oct 2006 13:25:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/10/14/529154.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/529154.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/10/14/529154.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/529154.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/529154.html</trackback:ping><description><![CDATA[<span style="font-size: 12px;">我把一些新手或初级玩家在手机上可能碰到的问题和一些经验都集中汇总了一下在这里,希望大家可以找到自己所需的东西<br>
E680最强综合技巧集合<br>
版本 V 1.0<br>
最后更新日期&nbsp;&nbsp;2005年3月6日<br>
本文虽然许多是转载，但是也不乏原创和征求过作者同意的文章。而且是我（CCMOVE注册名dm517）用心血搜刮出来的，为的是让发过这些好文章的人的
名字留下来，让大家看到他们精彩的文章。但是很多人很简单的就把我以前发表过的文章转走了，还去申请加精，尤其是还在CCMOVE里申请，里面的文章
90％都来自CCMOVE，根本不配加精，可耻，我只有这种想法。<br>
所以这次我干脆制作一个集大成于一体的教学，虽然长且大，但是都归类了，也没有那么难查找。但是这次我希望不要再有人未经得我同意，私自转载，一旦发现，立即在CCMOVE公开劣行。<br>
我的电子邮件地址：<a  href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#97;&#114;&#107;&#109;&#97;&#115;&#116;&#101;&#114;&#64;&#118;&#105;&#112;&#46;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">darkmaster@vip.163.com</a><br>
<br>
目录：<br>
<br>
第一部分&nbsp;&nbsp;实用技巧<br>
<br>
第二部分&nbsp;&nbsp;软件技巧<br>
<br>
第三部分&nbsp;&nbsp;高阶技巧<br>
<br>
第四部分&nbsp;&nbsp;DIY高级手册<br>
<br>
第五部分&nbsp;&nbsp;配件鉴别<br>
<br>
第六部分&nbsp;&nbsp;新手宝典系列文章<br>
<br>
第一部分&nbsp;&nbsp;实用技巧<br>
<br>
——菜鸟问题多，此文基本解决基础的<br>
PS：不是我说各位菜鸟，基本的都不会，也不去好好看看类似文章就到处找老手，你不烦我可烦，我一上线就恨不得一二十个信息过来，害的我不再通过验证了。<br>
1。铃声：只要是小E可以播放的音频文件都可以用作铃声，短信铃声，闹钟铃声及提示音（在主题中更改）。如果不想用整首MP3作铃声，可以用MP3Trim.exe这个工具截取MP3中你喜欢的一段。可以将你电脑里有的任何一首MP3当铃声了吧。<br>
<a  href="http://www.m-g-z.com/0days/warez/mp3trim.exe" target="_blank">http://www.m-g-z.com/0days/warez/mp3trim.exe</a><br>
2。文件管理：其实小E的文件管理最简单，完全把它当作U盘操作就行了（直接连上USB线自动识别）。小E上的任何文件，应用程序或highlight部
分用手写笔长按就会有popup menu出现，就像电脑上的右键功能。是不是发现许多新功能？可以剪切，复制，粘贴了吧。<br>
3。与PC同步：同步前先将USB模式改成modem（调制解调器）模式。否则U盘识别会妨碍同步。<br>
4。J2ME安装：网上下载的压缩文件解压后将.jar和.jad文件复制到手机或SD卡上，在小E的文件管理器中找到.jar文件，单击即可。<br>
5。电话簿：小E的电话簿比388c更强大，在编辑时选用菜单里的更多信息，每个联系人可以输入两个手机号码。在公司一栏上面有铃音，可以为每一个联系人设置不同的铃声，这里的铃声优先于分组铃声和主题铃声。<br>
6。通话过程中按机身右侧按键可以进行录音，待机状态长按机身右侧按键可以加载语音识别功能，重新开机或更改语言设置后需重新加载，加载后按机身右侧按键
可以使用语音拨号，语音菜单功能。加载后小E还会朗读你的选项以及短信和email。不过用中文显示时只会读中文短信，英文对英文。这个功能可以关掉（有
时候很好玩，有时候也很烦），嘿嘿<br>
7。用RealPlayer听MP3及音频文件时最好建立播放列表，这样就可以连续播放了，欣赏时如果想跳过某一首，可以用导向键的上下键。<br>
8。任何在短信或email中出现的电话号码，email地址都可以用触笔长按保存到通讯录中。<br>
9。如果右上角的拨号盘标志变成了线路标志，表示电话没有挂断，千万别忘了。有时候拨打自动应答电话时容易忘记（光关掉拨号盘并没有挂断电话）。<br>
10。坐飞机时换电池，开机时按住开机按钮5秒左右，可以选择开/关天线开机，为了您自身及他人的安全，请注意。<br>
在编辑短信时，点&#8220;至&#8220;或&#8220;To&#8220;就会出现电话簿联系人供选择，在要的电话前方框内点选，可以复选，就成了群发。由于680的sms和mms集成在一起，
联系人中的手机和email都会列出来，比较多。如果在编辑短信时，在sms/mms下拉框选sms，然后再点&#8220;至&#8220;或&#8221;To&#8220;就只有手机号码了。 <br>
但是我想跟office的版本无关，应该是同步程序的问题。我以前也碰到无法连接到同步服务器，是因为USB模式的设置。试一下重装，相撞modem驱动，再装同步软件。<br>
不过你要小心，因为单项同步不能从手机到outlook，如果你的outlook内没有这个联系人，可能会被擦掉。我有一次不小心手机内的联系人全给擦掉了。如果你没有其他备份就惨了<br>
<br>
——如何安装金山词霸<br>
1.首先到这下载（是A760的坛子）<br>
<a  href="http://bbs.imobile.com.cn/viewthread.php?tid=214543&amp;fpage=2" target="_blank">http://bbs.imobile.com.cn/viewthread.php?tid=214543&amp;fpage=2</a><br>
下载到电脑硬盘里。<br>
2.解压缩有两个文档xdict_simple.jad和xdict_simple.jar<br>
3.在手机中SD卡上新建文件夹JAVA（当然在手机内存上建也可以）<br>
4.将手机和电脑连接（用USB或蓝牙），将上述两个文件考入JAVA文件夹下；<br>
5.断开连接。手机文件管理器下找SD卡下的JAVA下的xdict_simple.jar用笔点住不放弹出快捷菜单上&#8220;安装&#8221;接下来你就知道一直&#8220;OK&#8221;<br>
6.在&#8220;录音机&#8221;后面多了一个&#8220;金山词霸&#8221;怎么样爽吧！！！！！<br>
<br>
——防干扰<br>
以前本人用NOKIA6610时有一个无声功能很不错，就可以解决这个问题。当来电时按下无声键，话机还是显示呼入状态，而铃声却不响了，把手机放到一边
就不用管它了，过一会对方就会发现所呼号码无人接听，是不是很爽啊。今天无意中发现E680也有这个功能。就是当来电后按下左侧的音量键，上下都可以，电
话还是呼入状态，但是铃声没有了。<br>
<br>
——如何同步<br>
1、手机：设置－USB模式－调制解调器。然后数据线连接电脑和手机。如果还没有安装驱动，驱动使用光盘里的驱动。<br>
2、电脑：在开始－程序－EzxSync里 点击EzxSync 运行同步软件，设置好选项后或者不设置，点同步，电脑屏幕显示&#8220;现在请启动电话同步。&#8221;<br>
3、手机：数据同步－USB线。<br>
<br>
——小E在'手机已锁定'状态下,长按照相键,就会出现时钟<br>
<br>
——如何用蓝牙传输文件<br>
pc-&gt;E680 :<br>
PC上的檔案滑鼠右鍵-&gt;傳送到-&gt;Bluetooth(用來傳過mp3,耗時,耗電)<br>
E680-&gt;PC:<br>
檔案管理-&gt;任何檔案-&gt;長按檔案出現選單-&gt;傳送-&gt;藍牙-&gt;選擇你的PC-&gt;傳送(Bluetooth交換資料夾)<br>
行事曆-&gt;想傳送的資料-&gt;長按出現選單-&gt;傳送-&gt;藍牙-&gt;選擇你的PC-&gt;傳送(Outlook)<br>
<br>
——如何节约空间<br>
E680自带很多不实用的游戏，原以为卸载他们之后就会从小E上消失，其实不然，通过建立usblan之后，在/home/.preload（隐藏文件
夹）文件夹下发现预加载的东西还在，比方说那个环顾四方MotoCity_E680_F_SC_VER_1_0_14.drm.jar居然占了1142k
空间。<br>
由此可见卸载小E自带游戏并不能彻底从小E上删除他们。<br>
删除方法：<br>
进入preload目录（注意这个目录是隐藏文件夹，需要在浏览器里设置显示隐藏才可见&nbsp;&nbsp;），删除掉不需要的游戏文件，包括jar和jad，然后修改javaDB文件中的内容，同样删掉相应的游戏配置信息，最后别忘了对剩余的游戏信息条目修改前面的序号。<br>
通过上述方法可以节省4M空间，我的手机使用空间从22％降到了12％，剩余的游戏正常。<br>
<br>
——如何快速拨号<br>
前题条件--电话存储在电话卡里面<br>
例子: 黄&#215;&#215; 电话卡位置：18<br>
打电话时 输入18＃<br>
按拨号就可以打电话了<br>
<br>
——如何设置网络参数<br>
我对E680的网络参数设置作个汇总，供非行货的手机及设置被修改后的恢复：<br>
一、网络连接设置：<br>
在网络里，点最下面一行右起第2个图标依次添加2个连接（其他连接可以删除）：<br>
1、移动梦网－－用于手机浏览器上网，及收发彩信<br>
配置名称：移动梦网<br>
GPRS设置：APN：cmwap；用户名，密码等均不设；其他均默认<br>
CSD设置：拨号：17266；用户名、密码、重输密码：wap；其他均默认<br>
2、连接互联网－－用于手机内置的电子邮件功能收发邮件<br>
配置名称：连接互联网<br>
GPRS设置：APN：cmnet；用户名，密码等均不设；其他均默认<br>
CSD设置：拨号：17201；用户名、密码、重输密码：172；其他均默认<br>
在以上2个连接添加完成后，点移动梦网打开，点右下角图标，选设为默认<br>
二、浏览器设置：<br>
打开浏览器，点右下角图标，选浏览器配置设置，点最下面一行中间的图标，添加：<br>
配置名称：移动梦网；主IP：10.0.0.172；端口：9201；主页：wap.monternet.com；网络连接：选移动梦网<br>
添加完成后，如果有多条，则点住移动梦网不放，在出来的菜单里选 设回默认。退出浏览器后，重新打开，可以上网<br>
注意：E680可以上wap网及部分内容小的www网。SIM卡开通GPRS，优先使用GPRS上网，在GPRS不可用时，手机会用拨号方式上网，此时右上角图标会出现CSD字样。<br>
三、彩信设置：<br>
主屏下点最上面右起第2个图标，进入信息中心，点右下角图标，选服务设置里的彩信：<br>
有效期限：无期限；最大发送大小：50K；自动下载，除漫游外，显示标志，发送报告均打钩，除多于 选50K或100K。<br>
点击默认设置下一行进入，点右下角图标添加：<br>
设置名称：移动彩信；MMSC：<a  href="http://mmsc.monternet.com/" target="_blank">http://mmsc.monternet.com</a>；网络设置：选移动梦网；WAP网关IP：10.0.0.172，连接安全：关，连接类型：有连接。完成后，点住移动彩信，在出来的菜单里选设为默认<br>
注意：使用彩信，SIM卡要开通GPRS<br>
<br>
——关于消息朗读<br>
大家都知道，在设置里将&#8220;消息朗读&#8221;设为开。按手机右侧键（语音识别功能键、也是相机键），成功加载语音识别功能后，再打开短消息就有一个女声咿咿呀呀地
为你朗读短信了。这个功能有时候挺有趣，有时候也挺烦人，有一次同办公室的MM给我发了一个短信，我一没留神给打开了，手机就开始念，女友当时就夺过去
看，害我耳朵肿了好几天。<br>
打开语音识别功能后，有很多便之处，比如语音拔号，以及使用语音命令等，比如你要给一个叫&#8220;本拉登&#8221;的朋友打电话，你只要对着电话说一声&#8220;本拉登&#8221;，手机
就会马上为你调出&#8220;本拉登&#8221;的电话号码来，识别率非常高的。比如你要打开记事本，你只要对着手机说一声&#8220;打开记事本&#8221;，记事本就会打开。这个的识别率更
高，我用我家乡的方言说，小E也从来没有听错过。挺方便的。这样的语音命令有二十多条吧。详细的情况，可以点：设置==》语音识别==》命令列表，自己
看。<br>
罗索了半天，其实我想说的是，如果你需要加载语音识别功能，但你又讨厌手机动不动给你读短信，或者读功能菜单的名字，你尽可以点：设置==》语音识别=
=》消息朗读==》关，如果你的&#8220;消息朗读&#8221;是开的，也就是说你想用这个功能，但又想随心所欲打开或关闭它，你只要在加载语音识别功能后，对着手机说一
声：切换语音合成，就可以随时打开或者关闭短信朗读功能了。即短信朗读功能处于"开"状态时，你对手机说一声：切换语音合成，手机就会回你一句：TTS已
关闭；否则，她会对你说：TTS已打开。这时手机只是关闭或者打开短信朗读功能，但语音识别功能仍然起作用。（所谓TTS，就是TEXT TO
SPEECH的缩写，即把文本合成为语音的技术，我自己挺喜欢小E的这个功能，不只是有趣，有时候也挺实用，但这一功能只能用来朗读短信，不能用来朗读记
事本里的内容，如果有哪位大虾能够让小E朗读记事本的内容，一定别忘了告诉大家一声。<br>
<br>
——如何开启导航键那一圈灯<br>
进入设置，电源管理，省电模式选择关即可。<br>
<br>
——E680绝对可用之wap的javaQQ （作者sgtomgo）<br>
用手机登录ｈｔｔｐ：／／ｗａｐ．ｊｏｙｅｓ．ｃｏｍ，进入&#8220;下载乐园&#8221;，免费下载&#8220;QQWAP&#8221;软件。此QQ经本人测试绝对可用，省了去腾讯官网下载JAVAQQ的每月5元钱服务费！<br>
上QQ之前，请确保你的手机网络设置如下：<br>
选择&#8220;移动梦网2.0&#8221;，也就是10.0.0.172:80，原来老的&#8220;移动梦网&#8221;的设置端口不是80，而是9201，确认APN是CMWAP。<br>
<br>
——【E680新手答疑】关于游戏安装和电影拷贝的问题<br>
<br>
最近有好多新买手机的朋友不知道如何将下载的游戏安装到手机里，我在这里简单说明一下<br>
游戏安装（其它与此相同，如java电子书，java应用程序）<br>
1、用手机直接下载或者pc上网下载游戏<br>
2、下载的游戏后缀一般是*.jar的文件，这样的可以直接传送到手机，还有就是压缩文件，后缀是*.rar，这样的需解压缩，找到里边后缀是*.jar的文件。<br>
3、若是pc下载的游戏，可以用数据线或者蓝牙传送到手机里的某个文件夹，（建议新建一个文件夹，专门存放下载的游戏，自己命名，比如javagame什么的）之后推出拔掉数据线。<br>
4、打开存放下载游戏的文件夹，确认文件格式为jar的之后选取，会弹出提示框，让你选择安装目录（手机或者sd、mmc卡）选择安装所属类别（手机上有
4个，一般游戏都安装到应用程序就可以）之后确定，期间会提示此游戏没被moto认证，（一般不是moto或游戏商和moto联合开发的游戏都会有警告提
示框）问你是否继续，点继续就可以了，游戏安装完毕，确定，ok了！ 游戏安装完毕后原来的jar文件会自动删除。<br>
5、打开应用程序栏，找到安装的新游戏，点击运行，你就可以happy了！<br>
注意：因为好多小E玩友总是说&#8220;找不到&#8221;jar文件或者根本没有什么的。现在说明一下，游戏安装前请确认后缀是否是*.jar文件，因为好多玩友经常在不
知情的情况下把jar文件解压缩了，所以肯定不行的，注意一下windows下如果安装了winrar这个解压缩软件，jar和rar文件在不显示后缀的
情况下一摸一样，易混淆，so
建议开启显示后缀名。（简单方法是开启文件后缀显示：我的电脑－－&gt;工具－－&gt;文件夹选项－－&gt;查看－－&gt;不显示隐藏的文件或文
件夹这个选项去掉对勾）<br>
电影拷贝<br>
这个就简单多了，电影制作请参照教程<a  href="http://club2.ccmove.com/thread.php?id=1093838&amp;fid=1189" target="_blank">http://club2.ccmove.com/thread.php?id=1093838&amp;fid=1189</a>，其它的就很easy了，通过电脑或者直接在手机里新建个文件夹，自己随便命名，例如movie，然后把压缩好的电影copy到文件夹里，推出拔出数据线，找到电影，点击就可以自动播放了。<br>
闹钟设置<br>
这个也很简单，不过看到好多新手问，所以就加上这条。闹铃的声音是在主题设置里的普通铃声。还有关机闹铃必须在闹钟里把关机闹铃打钩才可以闹，不然打死不闹。（这个问题很弱智的，自己多留心观察就能解决好多最初的疑问。）<br>
蓝牙的使用<br>
最近又看到有玩友不知道如何用蓝牙机to机发文件，说明一下<br>
点住要发送的文件，1两秒后弹出菜单选择共享，之后选择蓝牙方式发送，ok，之后自己看着办喽&nbsp;&nbsp;<br>
文件删除（给新手看的，老玩家别笑）<br>
用触笔点住想要删除的文件停滞2秒左右就会弹出菜单，剩下的自己看着办吧。&nbsp;&nbsp;<br>
<br>
第二部分&nbsp;&nbsp;软件技巧<br>
<br>
——E680截图方法（作者luckydip ）<br>
最近有个网友发了个 frame2buffer 再转图软件。。。拿来研究。。好友Yantz 帮我写了一个抓图脚本程序。。。让不会telnet的朋友能够容易使用。。。现在把他上传！解压后可看到以下文件:<br>
1) beep.au --&gt; 拷进Phone<br>
2) bmp.exe -&gt; 拷进电脑 desktop<br>
3) scr_cap.lin -&gt; 拷进Phone<br>
4) scr_cap_5x.lin -&gt; 拷进Phone<br>
这个程式用法是:最好进入"3合1"的 modem 接口，两个程式的抓图时间是 10 秒<br>
1) 点击 scr_cap.lin 的运行。。可能会启动picsel，没关系。。敢快把picsel文件关掉。。选择要捕捉的介面。。10秒
时，听到 "click"一声。。。画面捕捉完毕。。检查phone 。。scrraw1 文件被创建。。把 scrraw1拷到电脑
desktop，把 scrraw1 拖进 bmp.exe -&gt; sccraw1.bmp 会被创建！<br>
2)如果要连续抓图 5 次，间隔 10 秒。。就用 scr_cap_5x.lin。 启动后每隔 10 秒就会"click" 一声。。当然，你换介面时也要快些。。。会出现 scrraw1 至 scrraw5 -&gt;拷到电脑 desktop<br>
把 scrraw1 至 scrraw5 拖进 bmp.exe -&gt; sccraw1.bmp 至 scrraw5.bmp 会被创建！<br>
如果时间太短，可更改脚本的。。。 sleep 10s 口令<br>
还有如果你的机有类似"App" 的，可用来打开脚本。。这样就不会启动picsel 了。。。<br>
文件下载地址：<a  href="http://club.ccmove.com/thread.php?id=1242012&amp;fid=1189" target="_blank">http://club.ccmove.com/thread.php?id=1242012&amp;fid=1189</a><br>
<br>
——如何玩FC游戏<br>
VNes是一款E680能用的FC模拟器软件，做的非常好，可以横着全屏显示（刚好适合E680），下载可以去：<br>
<a  href="http://vampent.com/" target="_blank">http://vampent.com</a><br>
按常理说，FC模拟器可以支持网上通用的FC Roms，但是实验发现，在E680上不能使用大于128K的Rom，解决办法还在研究。<br>
<br>
——在小E上玩PC模拟游戏 （和上一个主题说同一件事情）<br>
进入正题，步骤如下:<br>
&nbsp; &nbsp;&nbsp;&nbsp;1、到这里 <a  href="http://vampent.com/d.php?d=vnes.jar" target="_blank">http://vampent.com/d.php?d=vnes.jar</a>&nbsp;&nbsp;下一个java的PC模拟器安装到小E上（怎么安装？靠！自己打自己PP吧！）。<br>
&nbsp; &nbsp;&nbsp;&nbsp;2、到这里 <a  href="http://free.ptidc.com/jin/down/game.rar" target="_blank">http://free.ptidc.com/jin/down/game.rar</a> 下个压缩包（这里面有9个游戏，更多的游戏以后请到<a  href="http://www.e680.net/" target="_blank">www.e680.net</a>里小E的专区里下载），解压备用。<br>
&nbsp; &nbsp;&nbsp;&nbsp;3、手机连上电脑，进入隐藏盘里的.system系统文件夹。到这个位置
.system\java\DownloadApps\MIDlet****
（****是不确定的，由于刚刚安装模拟器的，所以你进入.system\java\DownloadApps\里的最后一个文件夹就对了）。把刚才解压
得到的 *.db
统统放到.system\java\DownloadApps\MIDlet****\rms\文件夹下即可（一个*.db就是一个游戏）。<br>
&nbsp; &nbsp;&nbsp;&nbsp;安装完成，现在可以玩了！不过如果是新手，可能不会很顺利，下面说下怎么玩。<br>
&nbsp; &nbsp;&nbsp;&nbsp;1、点击vNes图标，打开模拟器程序，按任意键后选择"play"。罗列出来的这些就是游戏目录了，选一个，进入。<br>
&nbsp; &nbsp;&nbsp;&nbsp;2、Setting是设置屏幕的，Display里选Fullscreen就是全屏；Rotate Screen就是选择是否横屏（这点简直就是专为小E设计的，陶醉ing&#8230;&#8230;），其余设置自己看着办，默认就可以了。<br>
&nbsp; &nbsp;&nbsp;&nbsp;3、KeyMa是设置按键的，里面UP、DOWN之类的你一看就明白了，选UP后按下方向键"上"就是OK了（注意一下横屏玩游戏你得按横屏时的方向设置）。<br>
<br>
<br>
<br>
第三部分&nbsp;&nbsp;高阶技巧<br>
<br>
——用电脑上网<br>
1 按前人指点连接usblan, telnet 169.254.142.2成功<br>
2 交叉编译一个ARM的route命令，放到手机里，我放在/mmc/mmca1/ 也就是SD卡上<br>
3 如果你用的是XP的机器，就设置一下共享网络，让USBLAN这个网卡成为家庭网络。设置好之后，USBLAN网卡的地址会改成192。168。0。1，没关系，用XP的网络设置，给这个网卡再加一个地址，169。254。142。1<br>
4 在手机上执行/mmc/mmca1/route add default gw 169.254.142.1<br>
5 你现在可以测试比如EMAIL，QQ类软件了。我测试EMAIL系统成功，发出的邮件的邮件头里清楚的是用我家里的IP地址上网的（不是通过移动的网关走的）。上WAP没有试过，因为WAP的GATEWAY地址是移动内网的地址。<br>
附件是已经编译好的route命令，解压缩以后只有一个文件。<br>
附件下载地址：<a  href="http://www.fevercn.com/files/softrar2005/route.rar" target="_blank">http://www.fevercn.com/files/softrar2005/route.rar</a><br>
<br>
——E680文档管理误删除的恢复方法<br>
E680手机预置了许多游戏，动画，图片，MP3，音乐及视频。在使用中可能会出现误操作对文档管理删除，导致JAVA游戏不能运行，丢失预置里的内容。<br>
&nbsp;&nbsp;文档管理删除方法有下面几种。如果不是为了腾出手机空间，建议不要有这样的操作，或者先备份好手机里的原始数据：<br>
&nbsp;&nbsp;1、手机上操作：打开文档管理－手机－全部删除，或格式化。<br>
&nbsp;&nbsp;2、电脑上操作：手机设为大容量存储器后连接电脑后，删除MOTO_E680盘里所有的文件和目录，包括隐含的目录。或比较狠的做法，直接对MOTO_E680盘作格式化。<br>
&nbsp;&nbsp;先看看文档管理里的目录。手机连接电脑，在电脑上可以看到以下几个目录：<br>
.check&nbsp;&nbsp;系统隐含目录，新机为空，手机会自动生成。<br>
.system 系统隐含目录，里面有很多目录。在作修复，主复位，主清除，会自己恢复。<br>
.preload
系统隐含目录，手机预置的JAVA游戏都存在这里面。预置的游戏在光盘里都有。删除该目录后，手机上的JAVA游戏图标都变成一样，点击不能运行。注意放
在这里的JAVA游戏是手机预置的内容，手机作主清除后仍在；而自己安装的JAVA游戏是保存在.system目录里，主清除后就没有了。<br>
myCamera 对应&#8220;我的相机&#8221;，拍照、摄像的缺省保存目录。在作修复，主复位，主清除，会自己恢复。<br>
myVoice&nbsp;&nbsp;对应&#8220;我的录音&#8221;，录音的缺省保存目录。在作修复，主复位，主清除，会自己恢复。<br>
Preload&nbsp;&nbsp;对应&#8220;预置&#8221;，含动画、铃音、墙纸，MP3、音乐、视频。光盘里只有动画、铃音、墙纸。<br>
&nbsp;&nbsp;恢复方法：<br>
&nbsp;&nbsp;1、修复（文档管理－修复），或主复位：可以恢复出系统的&#8220;我的相机&#8221;，&#8220;我的录音&#8221;，及隐含目录&#8220;.system&#8221;。<br>
&nbsp;&nbsp;2、主清除方法：找到手机完整的备份目录，关键是.preload, Preload，拷贝到手机里。手机做主清除。此法需要先作好手机其他数据的备份。<br>
&nbsp;&nbsp;3、不用主清除方法：<br>
&nbsp; &nbsp;恢复JAVA：把手机上的JAVA游戏全部卸载（点住图标后选卸载）。拷贝光盘Game and Applications下Games目录里 需要的游戏到手机里，在手机上逐个安装游戏。注意，在主清除后，这些安装的游戏都会被清除。<br>
&nbsp; &nbsp;恢复预置：拷贝光盘Preload目录到手机里，直接使用。预置里的MP3，音乐及视频在光盘上没有，需要从其他手机拷贝，或网上下载拷贝到手机里。<br>
<br>
第四部分&nbsp;&nbsp;DIY高级手册<br>
<br>
——如何DVD转RM<br>
许多朋友都有许多DVD碟想倒进小E里看,可是DVD都是vob的文件想倒成rm还挺烦,我在网上找了许久,发现了一个很好用的软件豪杰视频通
2.0,它可以支持DVD转换为VCD、RM、AVI、GIF，也可以将VCD转换为RM、AVI、GIF，它同时还支持MPEG1、MPEG2、
MPEG4之间的相互转换。<br>
以下是它的下载网页:<br>
<a  href="http://www.52z.com/soft/853.html" target="_blank">http://www.52z.com/soft/853.html</a><br>
注意安装后要用注册机搞个注册号注册一下,不然用不了,注册机下载包里有!<br>
另外,不会用这东东的朋友可以去以下的网页看看,巨详细,只要你智力没问题,就一定能看懂。<br>
<br>
——如何实现真正无声拍照<br>
Telnet到E680后，在文件夹地址栏输入\\169.254.142.2\system，
打开目录ezxlocal－download－appwrite－setup，找到相机的配置文件ezx_camera.cfg，用记事本打开。找到
shutterSound =
0，该值为0－4，依次对应相机设置里的5种快门声音。把该值改为8或更大的数值，保存，相机就找不到对应的声音文件了。退出<br>
已经打开的相机，重新运行相机，拍照时快门就没有声音了，实现真正的无声拍照。<br>
不足的地方：打开相机的设置，退出时点完成，那么快门声音会被还原。<br>
<br>
——如何换耳机<br>
E680原配耳机，音质实属一般，我也难以接受。<br>
看到多人寻问此问题，把我的经验分享出来，也算是对此网站一点小小得回馈。<br>
首先至上海北京东路668号 赛格电子广场 2F，那有一家屋内店面，名子我忘了，专卖线材接头等购买2.5mm四节耳机插头及3.5mm三节耳机延长线(一般耳机用延长线)各一。<br>
将距离延长线插座约15mm处剪断，焊接至2.5mm四节耳机插头处即可。<br>
焊接处可用热缩套管束封。<br>
一般3.5mm三节耳机插头，接点由外而内分别为L(左声道)、R(右声道)、G(接地)。<br>
而E680的2.5mm四节耳机插头，接点由外而内分别为Microphone、R(右声道)、L(左声道)、G(接地)。<br>
所以若用一般市售2.5-3.5三节转接头，则耳机右声道没问题，耳机左声道接至Mic以致无声音，相对的E680左声道输出被你接地了，这可能会导致手机电路提早损坏。<br>
利用万用表的辅助，将相对应的左声道右及接地焊接即可。<br>
<br>
——如何给MP3铃声加震动<br>
Cool Edit Pro 2.0 可以做铃声的软件<br>
第一步:虽然得到了震动音频文件但是这个文件我们不能直接使用,因为我们一般用来做铃声歌曲是用的(441000hz和16bit)而这个震动软件是
(8bit).所以我们要用Cool Edit Pro 2.0
把那个震动音频文件录制下来保存为(441000hz和16bit)格式的mp3文件(最好先进行降噪处理)最后加大这个音频文件(声音大小和震动幅度成
正比)注意不要加的太大以免出现爆音.<br>
&nbsp; &nbsp;&nbsp;&nbsp;第二步:用Cool Edit Pro 2.0 裁减好自要用的铃声素材进行降低低音的处理!<br>
&nbsp; &nbsp;&nbsp;&nbsp;第三步:打开Cool Edit Pro 2.0的多轨模式把刚作好的震动音频文件拖放到音轨1,把铃声素材拖放到音轨2点编辑再点混缩所有波形到音轨3.<br>
&nbsp; &nbsp;&nbsp;&nbsp;第四步:编辑音轨3试听效果满意后传入手机就ok了!<br>
震动源文件可以去百度搜索。<br>
<br>
——如何让JAVA游戏显示中文名称<br>
出处：中国移动在线 <br>
用过小 T 一段时间，安装过大量的 JAVA 游戏、应用软件、电子书等，可玩性相当高。不过大家也知道大部分 JAVA
程序名称都是英文名，或者繁体，或者干脆显示乱码放在手机里不容易分辨，能不能把 JAVA
程序名称改为中文显示呢？经过查找资料、摸索，终于找到了方法，贴出来分享给大家。<br>
原理： java 程序的名称和图标等，都在 jar 文件包中 meta-inf 文件夹下的 menifest.mf
文件中定义，所以，可以通过修改该文件来自定义名称。其编码采用 Unicode 编码，而 Windows 一般采用 GB 码，在 JAVA
程序名称处输入对应汉字的 Unicode 编码就能正常显示汉字。<br>
软件：一个文件压缩软件 WINRAR 、一个 16 进制编辑软件 UltraEdit-32 编辑器。<br>
步骤：<br>
１． 打开 UltraEdit ，新建文件，输入你要给 JAVA 程序取的中文名称，在文件菜单里选&#8220;转换&#8221;项&#8220; ASCII 转 UTF-8 （ Unicode 编辑）&#8221;，取个文件名存盘，关闭文件；<br>
２． 用 WINRAR 将 JAVA 程序的 jar 包 解压到一个临时文件夹；<br>
３． 用 UltraEdit 打开 meta-inf 文件夹下的 menifest.mf 。与名称有关的是这两行：<br>
MIDlet-Name: *****<br>
MIDlet-1: *****, /icon.png, classmain<br>
有的没有第二行。其中， **** 就是游戏的名称，你可以把他修改成你喜欢的任意名称，要注意的就是两行中的名称要一致。<br>
４． 用 UltraEdit 打开开始存盘的文件，用显示的那串字符替换 menifest.mf 文件中的 **** 名称部分，存盘，关闭；<br>
５． 用 WINRAR 将临时文件夹的所有文件压缩，要选标准 ZIP 格式；<br>
６． 将压缩好的 *.ZIP 文件改名为 *.JAR ，上传至手机，大功告成，是不是顺眼很多呢。<br>
<br>
——如何制作小E看的视频<br>
当你拥有了680外加一张512M的卡后，随时随地看电影成为了可能。特别在680上，更是一种享受。前面的文章也说过一些在680上RM视频的做法，下面我就把我自己制作电影的一点小心得和大家分享一下。<br>
&nbsp; &nbsp; 在文章的最前面先说一下680所支持的视频的要求。分辨率是320*240，Bit Rate不能超过350kbps，Frame
Rate为15fps(对于Mpeg-4可以达到30fps)。顺带说一下，680可支持的MP3的范围很大，只要不超过48kHz,320kbps的
MP3文件皆可播放。更厉害的是它还可支持比特率为可变码率VBR的MP3文件。<br>
&nbsp; &nbsp;
首先说一下如何制作3GP格式的电影。3GP是一種3G流媒体的视频编码格式，主要是为了配合3G网络的高传输速度而开发的，也是目前手机中最为常见的一
種视频格式。网上大家一般用NOKIA专门编写的压缩工具来做，我用的叫做Nokia Multimedia Converter Pro
V2.0的版本。这个软件可以把AVI，MPEG，3GP等格式的视频文件直接转换成680上支持的3GP文件，但是却不支持网上最常见的RM格式的片
源。变通的办法是先用别的软件将RM格式的文件转换成MPEG的，再转换一遍就可以做成3GP的了。转RM的最常见的就是豪杰的V8。不过这个我没试过，
因为有RM就可以用等会要介绍的方法直接做成RM格式的，效果比3GP要好的多。当然这是后话。安装完该软件后，打开一个文件，导入AVI，MPEG等格
式的源文件，按照680支持的视频范围自己设置这些参数就行。这里需要说明一下，大概这个软件是为NOKIA量身定做的，分辨率一项不能自己任意设置，只
有NOKIA智能手机的Symbian的Series60和它的Series40界面两种分辨率可选。所以勾QCIF（176*144）这项就可以了。
Bit Rate这项的单位如没特别说明是kbps，则表示是bps，需要在你设的数字后面补3个0。Bit
Rate这项的数字越大，影片质量就越好，体积也就越大。但也不要设的过于大，不然有些片子播放的不流畅。其它项就按初始的不用改，设置完后点下面的
Convert后会弹出一个&#8220;另存为&#8221;的窗口，将转换后的文件保存在指定的路径就开始压制了。得到的文件放到你的680上自己看一下效果吧。它的优点是视
频文件的体积可以压缩得很小，得到的文件大概只有源文件的十分之一。可是当然是以很糟的质量来换取的。<br>
&nbsp; &nbsp;
下面再来看看MP4格式的制作方法。MP4文件也就是MPEG-4文件。MOTO的600和650等支持视频播放的手机也支持这种格式的文件，当然效果不
能和680同日而语了。这里需要用到MP4文件的专门的转换工具，mpegable X4
live,软件支持将AVI，MPEG-1/-2,MOV等格式的文件转换成MP4和3GP文件。我用的是未注册版本的，我没有找到有注册好的。不过用起
来没关系，只要将Registration窗口Cancel就行了。接着看到Settings窗口，分别在Input和Output栏内输入要转换和转换
后的路径和文件名，点击Browse选择就好了。在第三步中一定要选择SonyEricsson P800，前面要打上勾，然后点击Apply
Settings。每次转换前都要这样选，不然输出的文件好象就是3GP格式的了。最后点击红色按钮就可以开始了。其他的设置我也看不大懂，在Video
Encoding的Video
Bitrate中好象可以改成680支持的350kbps吧。这个软件我也没怎么用，我主要都是用下面的转RM格式的工具。因为在680上RM文件能播放
的效果最好。<br>
&nbsp; &nbsp;
最后要介绍的就是本文的主题，RM格式文件的制作。RM文件相比上面两种格式的文件，在网上更为流行和常见，而且播放的效果也更好。我用的软件宝典文章里
的不一样，我用的是Batch Real
Producer，目前最新的版本好象是1.5了。这个软件网上介绍说是直接调用了Real什么的内核，据说制作RM最好，而且速度快，还可批量自动压制
RM文件。这个软件支持的片源也非常多，有AVI，AVS，DAT，MPG，MPEG，WMV，RM，RAM，RMVB等，几乎各种格式都通吃。不过由于
它调用了Real格式的内核，所以安装前还必须先安装一个叫做Real
Alternative的软件，我用的版本是1.25。但是安装完这个软件后，原来电脑上的Real
Player就用不了了。也有时候是在安装前就有提示，要求你先要卸载Real
Player。照做就可以成功安装了。这个软件带的播放器就用来播放RM格式的文件了。以后要用Real Player就卸载掉这个再装回Real
Player就行了。从上往下看，首先采用固定码率的上限不能高过350kbps。画面质量选择Sharpest
Image效果就很好。别的我没有试过，大家有兴趣的话可以试一试。视频编码好象必须选择Real Video
8，别的都不行。音频编码方面由于680支持的是3D立体声输出，所以我设的是16或者20 Kbps&nbsp;&nbsp;Stereo
Music-RA8,这样就可以充分发挥680的双MFT扬声器的优势。别的选项大家也可以试一下，当然前提是要在680上播放流畅。EHQ
MODE不知道干什么用的，就选了Medium。画面大小变为勾上，填上320*240，在680上全屏看就可以撑满整个屏幕了。设定FPS也勾上，填上
15。音量调节当然是越大越爽，选12dB吧，只要你不要怕吵到别人。最后把输出路径该一下。全部设置完成后先保存设置，下次压制前直接读取该设置添加完
要导入的文件再点击开始压缩就OK了。传进680，试一下效果。怎么样？效果超爽吧，播放的声音和画面，效果都好过我见过的市面上任何一款手机。So
I love MOTO E680!<br>
&nbsp; &nbsp; 以上用到的四个软件大家在Google里面都可以找到免费下载的地址。<br>
由于很多朋友反应E680播放视频文件时有显示&#8220;文件过大&#8221;而不能播放的问题，所以我把一点点经验拿来和大家分享，希望对大家有所帮助。我经过试验，结论
是把电脑中的视频文件转换为rm格式，效果远远好于转换为3gp格式，所以就介绍一下rm格式的制作。关于mpg4格式，我还没有尝试。下面开始制作过
程：<br>
&nbsp; &nbsp; 使用的软件不是专门的手机软件，而是电脑软件中常用的Helix Producer Plus，它可以将各种视频转换为玩家需要的rm格式。<br>
&nbsp; &nbsp; 首先，运行软件，主界面分左右两个部分，左面部分是输入视频的来源和信息，而右面部分则是输出的信息。在左面&#8220;input file&#8221;那里选择&#8220;browse&#8221;选择一段来源视频就可以了。<br>
&nbsp; &nbsp; 第二步，在主界面右面部分，选择&#8220;audiences&#8221;。在出现的界面中，&#8220;audio
mode（音频模式）&#8221;调为&#8220;music（音乐）&#8221;，&#8220;video mode（视频模式）&#8221;可自行选择，如无剧烈运动，选择&#8220;normal
motion video（标准）&#8221;；如果是动画片，选择&#8220;sharpest image（调高）&#8221;；如果是动作片，选择&#8220;smoothest
motion（平滑）&#8221;。勾选&#8220;use high quality resamler for audio（高质量音频重采样）&#8221;。勾选&#8220;2-pass
video encoding&#8221;。勾选&#8220;resize video
to&#8221;，再将后面填写为&#8220;176x132&#8221;，如果视频不是这个象素比例，则只需填写176，后面的1xx会自动调整的。下面的&#8220;templates（模
板）&#8221;里，将&#8220;s-384k surround DSL or
Cable&#8221;选择并加入到右面，将右面原来存在的其他项删除，删除按下面的&#8220;垃圾箱&#8221;按钮。然后按&#8220;垃圾箱&#8221;旁边的&#8220;铅笔&#8221;按钮，将&#8220;target
frame rate（目标帧率）&#8221;设定为&#8220;15.00&#8221;，确定。&#8220;audiences&#8221;选项结束，关闭。<br>
&nbsp; &nbsp; 第三步，在主界面右面部分，选择&#8220;video filters&#8221;。勾选&#8220;black level correction&#8221;。勾选&#8220;video
noise reduction&#8221;，这里可以根据来源视频的质量选择&#8220;high&#8221;或者&#8220;low&#8221;。&#8220;video filters&#8221;选项结束，关闭。<br>
&nbsp; &nbsp; 第四步，在主界面右面部分，选择&#8220;clip information&#8221;，自行填加文件信息，然后关闭。<br>
&nbsp; &nbsp; 第五步，选择&#8220;file-add file destination&#8221;，如不做设定，则生成文件和原文件在同一目录。新文件建议使用英文名称。<br>
&nbsp; &nbsp; 最后，只需按下主界面右下的&#8220;encode（编码）&#8221;按钮。<br>
&nbsp; &nbsp; 一点说明：在&#8220;目标帧率&#8221;那里，可以设定为&#8220;30&#8221;，但是在E680全屏播放的时候稍显吃力。<br>
<br>
——高人对小E的研究文章<br>
1.程序配置文件放在/usr/language/preloadapp下,此目录不可更改<br>
2.从手机上做配置变更时，比如改变某应用做在的组(group)时，实际改变的是<br>
ezxlocal/download/appwrite/am下的configDB文件（本地配置），以AppUid与原应用配置的uid项对应<br>
3.JAVA程序安装后，其配置都出现在、ezxlocal/download/appwrite/am/InstalledDB文件中<br>
例如：<br>
[AppLinkRecord1027]<br>
AllPosition = 48<br>
BigIcon = Files/suiteicon.png<br>
Directory = /diska/.system/java/DownloadApps/MIDlet00026<br>
Exec = <br>
Group = 3<br>
Icon = Files/suiteicon.png<br>
InstalledDate = 2004/12/22<br>
JavaId = 26<br>
Mime = <br>
MpkgFile = <br>
Name = vNes<br>
OsVersion = <br>
Position = 12<br>
Rotation = <br>
Shared = 0<br>
Size = 87K<br>
Type = 5<br>
uid = 1027<br>
不知道非JAVA程序是否可通过改动此文件实现在E680的安装使用，待测试。<br>
此外，通过USBLAN连接手机过程中若有人打电话给你，并不震铃，可能漏接电话【不知是不是因为我昨晚执行了啥不该执行的程序:-)&nbsp;&nbsp;<br>
如网友提供英文文档所示，今晚修改了/mmc/mmcat1/.system/java/am/Removable/InstRemovableDB文件<br>
如下<br>
[AppLinkInfo]<br>
AppLinkCount = 30004<br>
<br>
<br>
[AppLinkRecord30004]<br>
AllPosition = 46<br>
BigIcon = <br>
Directory = mtc<br>
Exec = mtc<br>
Group = 3<br>
Icon = <br>
InstalledDate = 2005/1/10<br>
JavaId = -1<br>
Mime = <br>
MpkgFile = <br>
Name = Mtc<br>
OsVersion = <br>
Position = 10<br>
Rotation = <br>
Shared = 0<br>
Size = 610K<br>
Type =0<br>
uid = 30004<br>
<br>
[MimeConfigInfo]<br>
MimeConfigCount = 30000<br>
<br>
mtc是E680自带的应用程序，在/usr/SYSqtapp/mtc目录下，但却并未加入菜单。通过修改配置文件，重启后，在第3组(Group=3)出现一个名字为App的空图标(不知为何不是mtc).<br>
我觉得自行在E680上添加MontaVista Linux应用程序应该是可行的。<br>
之后我还试了一下mpkg文件，可能是配置不对的原因，未成功----我只在MpkgFile 处配了一个文件名，Exec处没写。<br>
<br>
第五部分&nbsp;&nbsp;配件鉴别<br>
<br>
——如何识别原装座充<br>
现提供原装的几个特征：1。做工非常细，和E680随机带的直充一样，全封闭，无任何螺丝,有3C认证标记<br>
2。CHPN4487A<br>
型号：SSW-0743<br>
输入：100V-240V～50-60Hz 0.1A<br>
输出：4.2V＝350mA<br>
LED指示灯状态：<br>
绿灯闪烁：正在充电 <br>
绿灯持续亮：已充满 <br>
红灯闪烁：电池已坏<br>
这是原装座充上的内容，一定要和上面一样，字的内容必须一样。。。。<br>
3。参考MOTO官方网站：<br>
<a  href="http://www.motorola.com.cn/pcs/accessories...es/index2-3.asp" target="_blank">http://www.motorola.com.cn/pcs/accessories...es/index2-3.asp</a> <br>
原装座充里有一张说明书，英、中、繁体三种文字，现将中文贴下：<br>
使用说明书<br>
1.注意事项<br>
(a)储藏温度范围：-40℃～＋85℃。<br>
(b)工作温度范围：0℃～＋40℃。<br>
( c)此充电器只能与摩托罗拉原装电池配合使用。不使用原装配件有可能会导致起火，触电，损坏电池，损<br>
坏充电器，或对人体造成伤害。<br>
(d)不要使用插头已损坏的充电器；如插头已坏，请立即更换充电器。<br>
(e)如果充电器有任何损坏，请不要继续使用，应把它交给合格的服务技术人员。<br>
为减少触电的危险，在进行保养或清洗之前，要把充电器从插座上拔出来。<br>
(g)充电时间：薄电池---约2.5小时；<br>
厚电池---约4小时。<br>
注意：仅用于3.6V充电锂电池。使用其它类型的电池可能爆炸，从而导致对人身造成伤害或财产损失。<br>
2.使用说明<br>
(a)将电池按箭头方向插入充电器中。<br>
(b)放置电池时，应先确认位置正确。<br>
( c)当工作温度超出范围时，电池不充电；等温度恢复正常后会自动恢复充电。<br>
3.指示灯状态说明<br>
(a)绿灯闪烁：正在充电。<br>
(b)绿灯持续亮：已充满。<br>
( c)红灯闪烁：电池已坏或放置不当。 <br>
<br>
——何为IMEI码<br>
IMEI为TAC + FAC + SNR + SP。IMEI(International Mobile Equipment
Identity)是国际移动设备身份码的缩写，国际移动装备辨识码，是由15位数字组成的"电子串号"，它与每台手机一一对应，而且该码是全世界唯一
的。每一只手机在组装完成后都将被赋予一个全球唯一的一组号码，这个号码从生产到交付使用都将被制造生产的厂商所记录。<br>
其组成为:<br>
1、前6位数(TAC)是"型号核准号码"，一般代表机型。<br>
2、接着的2位数(FAC)是"最后装配号"，一般代表产<br>
地。<br>
3、之后的6位数(SNR)是"串号"，一般代表生产顺序<br>
号。<br>
4、最后1位数(SP)通常是"0"，为检验码，目前暂备<br>
用。<br>
IMEI码贴在手机背面的标志上，并且读写于手机内存中。它也是该手机在厂家的"档案"和"身份证号"。　<br>
如何获得手机的IMEI码？<br>
如果您的移动设备为手机，您可以在手机上按&#8220;*#06#&#8221;获得手机的IMEI码。<br>
<br>
——如何查看版本号<br>
看版本号方法是输入：WWW008W。（W是点击拨号盘界面右下角菜单图标，然后点击插入-等待插入）。<br>
我的 版本 是：R51-G-OF.38.A4R，有的人是R51-G-OF.42.A1P,后面的 版本 可能是新的<br>
<br>
——关于&#8220;手机串号&#8221;和&#8220;进网许可标志&#8221;上网查询解读 （转）<br>
前面各位仁兄已经提供过对&#8220;手机串号&#8221;(IMEI)和&#8220;进网许可标志&#8221;上网查询的地址和方法：<br>
&#8220;手机串号&#8221;(IMEI)：　　　　　　　<a  href="http://www.chinamobile.gov.cn/" target="_blank">www.chinamobile.gov.cn</a><br>
&#8220;进网许可证&#8221;：(进网许可标志)　　<a  href="http://www.tenaa.com.cn/" target="_blank">www.tenaa.com.cn</a><br>
但就相应网站的结果提示信息仍有不少兄弟不甚明白，恰巧偶碰到问题并初步解决，有所感悟，特与大家分享。<br>
（一）对于<a  href="http://www.chinamobile.gov.cn/" target="_blank">www.chinamobile.gov.cn</a>站点，可以提供对&#8220;手机串号&#8221;(IMEI)真伪的查询。<br>
查询结果(提示)有两种：<br>
1.结果："您的手机是正品，可按三包规定享受服务!"　　表示手机是真的<br>
2.结果："您提供的手机机身号未在本中心登记，消费者可采用以下方法解决：重新核实输入信息是否完成正确；拨打手机厂商的售后服务电话，查询该机身号的手机是否是正品；请消费者留下联系方式，由信息中心与生产厂家联系，进一步核实手机机身号。<br>
服务热线：　 010-95121315
88558516"　　　表示手机是假的--（sgtomgo提示：关于这条，sgtomgo有不同意见，有时候是手机公司并未及时上报
chinamobile.gov.cn，以致查询不到，并不代表就是假货，或许你应该再打电话回手机厂家服务部问问。）<br>
（二）对于<a  href="http://www.tenaa.com.cn/" target="_blank">www.tenaa.com.cn</a>站点，可以对&#8220;手机串号&#8221;(IMEI)和&#8220;进网许可标志&#8221;的真伪的查询。<br>
一、&#8220;手机串号&#8221;(IMEI)：　　　链接"网上服务"-"手机IMEI号验证"下<br>
查询结果(提示)有两种：<br>
1."该部手机已在本中心注册，建议您输入扰码信息进一步验证。"　表示此手机是真的<br>
2."该部手机未在本中心注册！"　表示此手机是假货--（sgtomgo提示：关于这条，sgtomgo有不同意见，有时候是手机公司并未及时上报，以致查询不到，并不代表就是假货，建议你应该再打电话回手机厂家服务部问问。）<br>
<br>
注意：在"设备型号："一框中必须相应的填写正确，否则都会出现如2的"假货"信息；此&#8220;手机串号&#8221;(IMEI)的查询理论上与在上述的<a  href="http://www.chinamobile.gov.cn/" target="_blank">www.chinamobile.gov.cn</a>站点查询得到的真伪结果应该相同。<br>
二、&#8220;进网许可证&#8221;(进网许可标志)：　　　　链接"网上服务"-"标志验证"下<br>
查询结果(提示)：<br>
1."你提供的标志信息与手机串号均是真的！"表示你的手机是真的(IMEI)，且进网许可证也是真的<br>
2."您提供的标志信息是真的，且该部手机已在本中心注册，但手机串号与标志不对应！"表示你的手机是真的(IMEI)，且进网许可证也是真的，但这两个号码不对应。<br>
...其他为以此类推，为相应伪的信息。<br>
注意：在"设备型号："等多个填写框中必须相应的填写正确，否则都会出现手机伪的信息(查询结果就不准确了)。<br>
附：(几条tenaa官方提示)<br>
===　标 志 验 证 常 见 问 题 与 解 答　===<br>
1.对提示信息为&#8220;您提供的标志信息为假&#8221;的解释 <br>
回答：如在网上验证后显示&#8220;您提供的标志信息为假&#8221;建议进一步核查所录入信息的正确性，如确信没有录入错误，则该枚标志为伪造标志。可以向你所在地的消协或工商局进行投诉。 <br>
2.对提示信息为&#8220;您提供的标志信息是真的，且该部手机已在本中心注册，但手机串号与标志信息不对应！&#8221;的解释。 <br>
回答：你所遇到的情况存在两种可能性. 1.手机进网许可标志为伪造标志.2.厂家未提供给本中心正确的对应关系,此种情况有可能是由厂家失误造成的. 无论哪种情况,建议向你当地工商局或消协进行投诉. <br>
3.对提示信息为&#8220;您提供的的标志信息是真的，但该手机暂未到本中心注册&#8221;的解释。 <br>
回答：据规定，手机的串号应与加帖在其机身上的标志一一对应，并由企业定期将对应关系上报受理中心。类似问题所述情况，是因为企业未及时将对应关系上报，但也不排除手机标志为伪造标志。建议向你当地工商局或消协进行投诉.<br>
<br>
第六部分&nbsp;&nbsp;新手宝典系列文章（和前面重复的已经都删除了）<br>
<br>
—— 关于下载QQ以后无法连接的问题以及我采取的方法(新手宝典1) <br>
<br>
<br>
如果谁安装以后还是不能登录,那就到浏览器选项里去设置一下"如何设置JAVA程序的HTTP上网方式？"地址是<a  href="http://mgame.qq.com/mqq/mo.shtml?help/sj.htm" target="_blank">http://mgame.qq.com/mqq/mo.shtml?help/sj.htm</a><br>
我在我的E680里是这么设置的:<br>
1.点击"浏览器"连接上网;<br>
2.连上移动梦网以后,点右下脚的"浏览器配置设置"<br>
3.在出现E680手机本身已经设置好的2个配置以后,你点中间带"+"号的那个图标,设置新配置;<br>
4.新配置的设置如下:<br>
A:设置名称:中国移动GPRS(也许随便取个名字也可以,我没试过)<br>
B:主IP:10.0.0.172<br>
C:端口:80<br>
D:次IP:10.0.0.172<br>
E:端口:80<br>
F:主页:<a  href="http://java.monternet.com/" target="_blank">http://java.monternet.com</a> <br>
G:网络连接:移动梦网.<br>
应该可以用了,这个设置应该对采用软件上WWW网站也应该有效.<br>
对了,还有一点,你在上QQ时,系统会问你采用何种连接:出现2个选项,一个是移动梦网,一个是连接互联网,你点移动梦网 <br>
<br>
—— 摩托罗拉 ** 三种鉴别手机真伪的方法(新手宝典2)<br>
<br>
方法一：登录信息产业部<a  href="http://www.tenaa.com.cn/" target="_blank">www.tenaa.com.cn</a>标志验证<br>
方法二：TEL010-82058767 OR 010-82050313 进行人工查询<br>
方法三：只要将RW#进网证号#扰码#手机机手号发送到9500，电信设备进网认证管理信息系统将自动回复鉴别信息。其中RW为固定代码，#可以用空格代替。</span><img src ="http://www.cnblogs.com/luckyzmw/aggbug/529154.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>E680I常用工具和使用说明</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/10/14/529120.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Sat, 14 Oct 2006 12:47:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/10/14/529120.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/529120.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/10/14/529120.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/529120.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/529120.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%">
    <tbody>
        <tr>
            <td class=bold>剑过无痕</td>
            <td align=right>2006-5-16 07:38</td>
        </tr>
    </tbody>
</table>
</td>
</tr>
<tr>
    <td class=smalltxt bgcolor="#ffffff"><strong>E680I常用工具和使用说明！！！</strong><br><br>[color=Red][size=5][font=黑体]现将本人发布的所有和E680I有关的软件和使用说明的链接汇总如下,方便大家使用![/font][/size][/color]<br><br>1、☆Linux智能手机 E680I*新手宝典全系列(新手必看)*问题汇总☆<br>[url]http://www.motobbs.com/viewthread.php?tid=575&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>2、MPKG安装软件全面更新，支持E680,E680i ！<br>[url]http://www.motobbs.com/viewthread.php?tid=558&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>3、经测试可安装的【手机号码归属地查询3.0版】支持134号段！<br>[url]http://www.motobbs.com/viewthread.php?tid=615&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>4、简单取消E680/E680i Realplayer50首歌限制<br>[url]http://www.motobbs.com/viewthread.php?tid=697&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>5、再也不用耳机听广播了<br>[url]http://www.motobbs.com/viewthread.php?tid=1231&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>6、E680I上java程序的安装<br>[url]http://www.motobbs.com/viewthread.php?tid=1230&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>7、修改主屏&#8220;没有设定日程安排&#8221;字样为你喜欢文字和机主姓名的小办法<br>[url]http://www.motobbs.com/viewthread.php?tid=14536&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>8、今天早上打电话时的惊人发现，大家都来看看E680/E680I的BUG，有图!&nbsp; &nbsp; <br>[url]http://www.motobbs.com/viewthread.php?tid=802&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>9、E680i上的两个小技巧<br>[url]http://www.motobbs.com/viewthread.php?tid=1236&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>10、给喜欢E680i新手的一些忠告<br>[url]http://www.motobbs.com/viewthread.php?tid=1242&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>11、E680I使用上的常见问题小结<br>[url]http://www.motobbs.com/viewthread.php?tid=1243&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>12、开机时无意之间发现E680I的飞机模式!<br>[url]http://www.motobbs.com/viewthread.php?tid=9611&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>13、E680i阅读word、excel、pdf时小技巧<br>[url]http://www.motobbs.com/viewthread.php?tid=1238&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>14、A780/E680i专用主题卸装软件<br>[url]http://www.motobbs.com/viewthread.php?tid=1020&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>15、E680i 硬件规格研究以 及 虚拟内存使用研究&nbsp; &nbsp; <br>[url]http://www.motobbs.com/viewthread.php?tid=588&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>16、另一种看版本号的方法!<br>[url]http://www.motobbs.com/viewthread.php?tid=2530&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>17、最新完美刷机版本C5ABP<br>[url]http://www.motobbs.com/viewthread.php?tid=1235&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>18、手机简单取得当前标准时间的2种方法<br>[url]http://www.motobbs.com/viewthread.php?tid=576&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>19、修改日程里闹钟铃声的方法!<br>[url]http://www.motobbs.com/viewthread.php?tid=2529&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>20、给装主题死机的朋友 -- 详细教程<br>[url]http://www.motobbs.com/viewthread.php?tid=623&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>21、压制小E影片的心得!<br>[url]http://www.motobbs.com/viewthread.php?tid=572&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>22、（行货小I）Telnet说明书(用&#8220;echo at+mode=99&gt;comX &#8221;不成功的看过来！<br>[url]http://www.motobbs.com/viewthread.php?tid=676&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>23、预防手机病毒的注意要点<br>[url]http://www.motobbs.com/viewthread.php?tid=574&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>24、透析主题安装方法：想装主题又不敢装的朋友看过来<br>[url]http://www.motobbs.com/viewthread.php?tid=625&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>25、大家可能还没有发现这个功能<br>[url]http://www.motobbs.com/viewthread.php?tid=1244&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>26、E680技巧总汇<br>[url]http://www.motobbs.com/viewthread.php?tid=706&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>27、E680i语音及声控功能的使用<br>[url]http://www.motobbs.com/viewthread.php?tid=1227&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>28、购机后先安装的软件 <br>[url]http://www.motobbs.com/viewthread.php?tid=1234&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>29、小I用USB充电时如何使用全部功能<br>[url]http://www.motobbs.com/viewthread.php?tid=1240&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>30、直接在手机上剪裁出自己喜欢的待机图片 <br>[url]http://www.motobbs.com/viewthread.php?tid=1237&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>31、用e680i自带的opera看电子书<br>[url]http://www.motobbs.com/viewthread.php?tid=1233&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>32、水货？行货？ <br>[url]http://www.motobbs.com/viewthread.php?tid=1246&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>33、E680和E680I的区别！<br>[url]http://www.motobbs.com/viewthread.php?tid=579&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>34、JBenchMark测试你手机的JAVA图形性能<br>[url]http://www.motobbs.com/viewthread.php?tid=678&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>35、将EXCEL格式的电话簿导入680I的方法<br>[url]http://www.motobbs.com/viewthread.php?tid=1245&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>36、E680i上的英文缩写简单注释<br>[url]http://www.motobbs.com/viewthread.php?tid=1239&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>37、手机使用与保养须知<br>[url]http://www.motobbs.com/viewthread.php?tid=577&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]<br><br>38、质疑万能手机充电器真的万能吗？ <br>[url]http://www.motobbs.com/viewthread.php?tid=573&amp;highlight=%2B%BD%A3%B9%FD%CE%DE%BA%DB[/url]</td>
</tr>
<img src ="http://www.cnblogs.com/luckyzmw/aggbug/529120.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Code Snippet Libraries压缩下载包</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/04/07/368858.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Thu, 06 Apr 2006 17:16:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/04/07/368858.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/368858.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/04/07/368858.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/368858.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/368858.html</trackback:ping><description><![CDATA[摘要: 看了《善用免费的Code Snippet Libraries加快你的开发速度 》，感觉这玩意儿的确不错，于是认认真真地到网上把它扒了下来，一安装，还挺麻烦，而且看样子会把14个分类的东西全混在一块儿，如果真的这样，300来个怎么找啊？？？<br>自己辛苦了一回，大家就不要那么辛苦了，我把做好的文件夹打包了传上来，大家只要把压缩包解压了（建议放到microsoft.net visual studio 8\vc#\snappets\2052下），然后到代码片断管理器中直接加载就可以了，省力多了吧。。。&nbsp;&nbsp;<a href='http://www.cnblogs.com/luckyzmw/archive/2006/04/07/368858.html'>阅读全文</a><img src ="http://www.cnblogs.com/luckyzmw/aggbug/368858.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>企业库中的一个小发现</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/03/26/359183.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Sun, 26 Mar 2006 05:02:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/03/26/359183.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/359183.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/03/26/359183.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/359183.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/359183.html</trackback:ping><description><![CDATA[摘要: 一直被企业库中的几个问题困扰：<br>    1、企业库用了以后，event log中一直出现一堆一堆的错误，也不知道该如何去解决，除了影响了日志的阅读以外，倒也没什么其他问题    <br>      2、Logging & Instrumentation Application Block这个block中，好像用来用去都只用到了一个logging，好像从来没有关Instrumentation 什么事，再加上对仪表盘这个玩意儿好像一直没有概念，也不知道干嘛用的（包括webcast讲座中好像也没有提到），所以就一直当作logging application block用下去了<br>    3、企业库中的Instrumentation到底实现了什么东西，其目的是什么<br>    <br>但是这几个问题对整个应用无伤大雅，所以也一直没空去管它，前段时间一直在看企业库的代码，才恍然大悟，原来这几个问题就是一个问题。&nbsp;&nbsp;<a href='http://www.cnblogs.com/luckyzmw/archive/2006/03/26/359183.html'>阅读全文</a><img src ="http://www.cnblogs.com/luckyzmw/aggbug/359183.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>企业库中的objectBuild类分析</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/03/23/356324.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Wed, 22 Mar 2006 16:42:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/03/23/356324.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/356324.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/03/23/356324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/356324.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/356324.html</trackback:ping><description><![CDATA[摘要: objectBuilder的介绍，我在上一篇文章中已经推荐了，如果想了解ob的朋友，可以对照着看，另外最好能够看看unit test的代码，会更容易明白为什么Build一个object会搞得这么复杂，以及里面具体每个类的目的和功能。&nbsp;&nbsp;<a href='http://www.cnblogs.com/luckyzmw/archive/2006/03/23/356324.html'>阅读全文</a><img src ="http://www.cnblogs.com/luckyzmw/aggbug/356324.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>企业库core中configuration部分类的分析</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/03/13/348636.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Sun, 12 Mar 2006 16:11:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/03/13/348636.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/348636.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/03/13/348636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/348636.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/348636.html</trackback:ping><description><![CDATA[摘要: 企业库.net2.0在核心层有了很大的变化，特别是objectbuilder（具体可见 ObjectBuilder技术内幕http://blog.csdn.net/niwalker/archive/2005/12/31/567022.aspx）这个ioc容器的引入和泛形的使用，并且同.net1.1版本中，整个类的设计就像设计模式的教科书，但是，也使类的结构非常复杂，我大致整理了一张图，供大家参考，其中如果有理解不对的地方，欢迎大家拍砖<br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/luckyzmw/archive/2006/03/13/348636.html'>阅读全文</a><img src ="http://www.cnblogs.com/luckyzmw/aggbug/348636.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>如何创建一个自定义帐户来运行 ASP.NET</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/02/21/334843.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Tue, 21 Feb 2006 07:34:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/02/21/334843.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/334843.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/02/21/334843.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/334843.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/334843.html</trackback:ping><description><![CDATA[<H1>如何创建一个自定义帐户来运行 ASP.NET</H1>
<H2 class=subtitle></H2>
<DIV class=date>发布日期： 10/28/2004<SPAN class=datePipe> | </SPAN>更新日期： 10/28/2004</DIV>
<DIV class=overview>
<DIV style="WIDTH: 250px"><IMG height=68 alt=a src="/admin/art/pponline.gif" width=250 border=0><BR>
<P class=figureCaption></P>
<DIV class=figureRule></DIV></DIV>
<P><A href="http://www.microsoft.com/security/guidance/topics/default.mspx" target=_blank>浏览全部&#8220;安全性指南&#8221;主题 </A></P>
<P>Microsoft Corporation</P>
<P><B>目标</B></P>
<P>本模块用于： </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>创建一个具有足够权限正确运行 ASP.NET 应用程序的最小特权帐户。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>配置 ASP.NET，使其使用自定义的最小权限帐户来运行。 </P></TD></TR></TBODY></TABLE>
<P><B>适用于：</B></P>
<P>本模块适用于下列产品和技术： </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>Microsoft_ Windows_ XP 或 Windows 2000 Server（带 Service Pack 3）以及更高版本的操作系统 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>Microsoft .NET Framework 版本 1.0（带 Service Pack 2）以及更高版本 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>Internet 信息服务 (IIS) 5.0 或 6.0（仅当使用 IIS 5.0 隔离模式时） </P></TD></TR></TBODY></TABLE>
<P><B>本模块的使用方法</B></P>
<P>要最大程度的利用本模块： </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>必须有开发 ASP.NET Web 应用程序的经验并熟悉 machine.config 文件的用途和结构。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>必须有使用 Windows 管理工具创建和管理独立或基于域的 Windows 用户帐户的经验。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>阅读模块&#8220;<A href="http://msdn.microsoft.com/library/en-us/secmod/html/secmod08.asp" target=_blank>ASP.NET Security</A>&#8221;。本模块将向您提供下列各项的详细信息：ASP.NET 安全性是如何工作的，ASP.NET 辅助进程标识对一个正在执行的应用程序的权限有哪些影响，以及如何使用模拟来轻松地向 Web 应用程序的用户授予适当的权限级别。 </P></TD></TR></TBODY></TABLE></DIV>
<CENTER><IMG title="" height=6 alt=* src="/library/gallery/templates/MNP2.Common/images/3squares.gif" width=30 border=0></CENTER>
<DIV style="HEIGHT: 18px"></DIV>
<H5 style="PADDING-TOP: 2px">本页内容</H5>
<TABLE style="MARGIN-TOP: 7px; MARGIN-BOTTOM: 12px" cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR vAlign=top>
<TD><A href="http://luckyzmw.cnblogs.com/admin/#EHAA"><IMG height=9 alt=摘要 hspace=4 src="/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width=7 vspace=2 border=0></A></TD>
<TD class=onThisPage><A href="http://luckyzmw.cnblogs.com/admin/#EHAA">摘要</A></TD></TR>
<TR vAlign=top>
<TD><A href="http://luckyzmw.cnblogs.com/admin/#EGAA"><IMG height=9 alt=预备知识 hspace=4 src="/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width=7 vspace=2 border=0></A></TD>
<TD class=onThisPage><A href="http://luckyzmw.cnblogs.com/admin/#EGAA">预备知识</A></TD></TR>
<TR vAlign=top>
<TD><A href="http://luckyzmw.cnblogs.com/admin/#EFAA"><IMG height=9 alt=创建一个新的本地帐户 hspace=4 src="/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width=7 vspace=2 border=0></A></TD>
<TD class=onThisPage><A href="http://luckyzmw.cnblogs.com/admin/#EFAA">创建一个新的本地帐户</A></TD></TR>
<TR vAlign=top>
<TD><A href="http://luckyzmw.cnblogs.com/admin/#EEAA"><IMG height=9 alt=分配最小特权 hspace=4 src="/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width=7 vspace=2 border=0></A></TD>
<TD class=onThisPage><A href="http://luckyzmw.cnblogs.com/admin/#EEAA">分配最小特权</A></TD></TR>
<TR vAlign=top>
<TD><A href="http://luckyzmw.cnblogs.com/admin/#EDAA"><IMG height=9 alt="分配 NTFS 权限" hspace=4 src="/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width=7 vspace=2 border=0></A></TD>
<TD class=onThisPage><A href="http://luckyzmw.cnblogs.com/admin/#EDAA">分配 NTFS 权限</A></TD></TR>
<TR vAlign=top>
<TD><A href="http://luckyzmw.cnblogs.com/admin/#ECAA"><IMG height=9 alt="配置 ASP.NET,从而使用新帐户来运行" hspace=4 src="/library/gallery/templates/MNP2.Common/images/arrow_px_down.gif" width=7 vspace=2 border=0></A></TD>
<TD class=onThisPage><A href="http://luckyzmw.cnblogs.com/admin/#ECAA">配置 ASP.NET,从而使用新帐户来运行</A></TD></TR></TBODY></TABLE><A name=EHAA></A>
<H2>摘要</H2>
<P>默认情况下，每个 ASP.NET 辅助进程在名为 ASPNET 的最小特权帐户的上下文中运行。如果 ASP.NET 应用程序部署在基于域的服务器上，或需要访问远程服务器上的资源，则可以通过配置 ASP.NET 以运行在不同帐户的上下文中来简化管理。</P>
<P>本模块描述了如何将 ASP.NET 配置为在自定义本地帐户或域帐户的上下文中运行，并描述了分配此帐户以使其正常工作的权限。</P>
<DIV style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px"><A href="http://luckyzmw.cnblogs.com/admin/#top"><IMG height=9 alt=返回页首 src="/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width=7 border=0></A><A class=topOfPage href="/admin/#top">返回页首</A></DIV><A name=EGAA></A>
<H2>预备知识</H2>
<P>在开始使用本模块之前，应了解以下内容：</P>
<H3>ASP.NET 辅助进程标识</H3>
<P>用于运行 ASP.NET 的默认帐户（在安装时创建）是一个最小特权的本地帐户，并在 machine.config 中以如下方式指定：</P><PRE class=codeSample>&lt;processModel enable="true" userName="machine" password="AutoGenerate" /&gt;
</PRE>
<P>此帐户在本地用户和组下标识为 ASPNET ，并有一个在 Local System Authority (LSA) 中受到安全保护的强密码。</P>
<P>当您需要使用 ASP.NET 进程标识访问网络资源（如数据库）时，可以执行下列任一操作： </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>使用域帐户。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>使用&#8220;镜像&#8221;本地帐户（即在两台计算机上用户名和密码匹配的帐户）。在计算机位于没有信任关系的不同域中时，或计算机由防火墙隔开而无法打开 NTLM 或 Kerberos 身份验证所需的端口时，需要使用此方法。 </P>
<P>最简单的方法是在 Web 服务器上将 ASPNET 帐户的密码改为一个已知的值，然后在目标计算机上用相同的密码创建一个名为 ASPNET 的帐户。在 Web 服务器上，必须首先更改本地用户和组中的 ASPNET 帐户密码，然后替换 machine.config 中 &lt;<B>processModel</B>&gt; 元素上的凭据。不应将纯文本密码存储在 machine.config 中，而应改用 aspnet_setreg.exe 将加密密码存储在注册表中。有关详细信息，请参阅模块 8&#8220;ASP.NET 安全性&#8221;。 </P><PRE class=codeSample>&lt;processModel enable="true" 
      userName="registry:HKLM\SOFTWARE\YourSecureApp\processModel\
                ASPNET_SETREG,userName" 
      password="registry:HKLM\SOFTWARE\YourSecureApp\processModel\
                ASPNET_SETREG,password" . . ./&gt;
</PRE>
<P>可以使用本模块中提供的步骤创建一个最小特权的本地帐户。 </P></TD></TR></TBODY></TABLE>
<H3>模拟固定标识</H3>
<P>通过在 web.config 中采用下列设置，您可以为特定的虚拟目录设置固定标识。使用 aspnet_setreg.exe 将加密凭据存储在注册表中。</P><PRE class=codeSample>&lt;identity impersonate="true"
          userName="registry:HKLM\SOFTWARE\YourSecureApp\
                    identity\ASPNET_SETREG,userName"
          password="registry:HKLM\SOFTWARE\YourSecureApp\
                    identity\ASPNET_SETREG,password" /&gt;
</PRE>
<P>如果在同一个 Web 服务器上有多个 Web 站点，而这些 Web 站点需要以不同的身份运行，则通常使用此方法；例如，在应用程序宿主方案中就需要采用这种方法。</P>
<P>本模块了描述如何创建最小特权的本地帐户。如果您主要进行管理工作，则可以使用一个具有强密码的最小特权受限域帐户。</P>
<P>当考虑用于运行 ASP.NET 的帐户时，则请记住下列几点： </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>默认情况下，ASP.NET 不进行模拟。因此，Web 应用程序所执行的任何资源访问都使用 ASP.NET 进程身份。在此情况下，Windows 资源必须有一个向 ASP.NET 进程帐户授予访问权的访问控制列表 (ACL)。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>如果启用了模拟，则应用程序使用原始调用方的安全上下文来访问资源，或如果配置了 IIS 进行匿名身份验证，则使用匿名 Internet 用户帐户（默认情况下为 IUSR_MACHINE）。在此情况下，资源必须有基于原始调用方身份（或 IUSR_MACHINE）的 ACL。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>在创建自定义帐户时，应始终遵循最小特权原则 — 只提供最小限度的所需特权和权限。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>避免使用 SYSTEM 帐户运行 ASP.NET。 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>避免向此帐户授予&#8220;作为部分操作系统&#8221;的特权。 </P></TD></TR></TBODY></TABLE>
<DIV style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px"><A href="http://luckyzmw.cnblogs.com/admin/#top"><IMG height=9 alt=返回页首 src="/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width=7 border=0></A><A class=topOfPage href="/admin/#top">返回页首</A></DIV><A name=EFAA></A>
<H2>创建一个新的本地帐户</H2>
<P>此过程创建一个新的本地帐户。默认情况下，这个新帐户将被添加到本地 <B>Users</B> 组中。</P>
<H3>要创建一个新的本地帐户，请执行下列操作： </H3>
<TABLE class=numberedList cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>1.</P></TD>
<TD>
<P>创建一个本地帐户（例如&#8220;CustomASPNET&#8221;）。 </P>
<P>确保对此帐户使用强密码。强密码应至少包含七个字符，并采用大小写字母、数字和其他字符（如 *、? 或 $）的混合方式。 </P></TD></TR>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>2.</P></TD>
<TD>
<P>清除 <B>User must change password at next logon</B> 选项。 </P></TD></TR>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>3.</P></TD>
<TD>
<P>选择 <B>Password never expires </B>选项。 </P></TD></TR></TBODY></TABLE>
<DIV style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px"><A href="http://luckyzmw.cnblogs.com/admin/#top"><IMG height=9 alt=返回页首 src="/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width=7 border=0></A><A class=topOfPage href="/admin/#top">返回页首</A></DIV><A name=EEAA></A>
<H2>分配最小特权</H2>
<P>此过程分配运行 ASP.NET 所需的一组最小的特权。</P>
<P><B>要分配最小特权，请执行下列操作：</B><B></B></P>
<TABLE class=numberedList cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>1.</P></TD>
<TD>
<P>从 <B>Administrative Tools</B> 程序组中，启动 <B>Local Security Policy</B> 工具。 </P></TD></TR>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>2.</P></TD>
<TD>
<P>展开 <B>Local Policies</B>，然后选择<B> User Rights Assignment</B>。 </P>
<P>右窗格中会显示出一个特权列表。 </P></TD></TR>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>3.</P></TD>
<TD>
<P>向新帐户分配下列特权： </P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>从网络访问此计算机 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>作为批处理作业登录 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>作为服务登录 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>拒绝本地登录 </P></TD></TR>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>拒绝通过终端服务登录 </P></TD></TR></TBODY></TABLE>
<P><B>注意</B> 要向帐户分配特权，请双击此特权，然后单击 <B>Add</B> 来选择所需的帐户。 </P></TD></TR>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>4.</P></TD>
<TD>
<P>关闭此工具。 </P></TD></TR></TBODY></TABLE>
<DIV style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px"><A href="http://luckyzmw.cnblogs.com/admin/#top"><IMG height=9 alt=返回页首 src="/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width=7 border=0></A><A class=topOfPage href="/admin/#top">返回页首</A></DIV><A name=EDAA></A>
<H2>分配 NTFS 权限</H2>
<P>此过程在本地文件系统中向自定义的 ASP.NET 帐户授予所需的 NTFS 权限。</P>
<P><B>注意</B> 此过程中的步骤适用于 Web 服务器上的文件系统（而不适用于远程计算机上的文件系统，为了进行网络身份验证，可以在远程计算机上复制此帐户）。</P>
<P><B>要分配</B><B> NTFS 权限，请执行下列步骤： </B></P>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=listBullet vAlign=top>&#8226;</TD>
<TD class=listItem>
<P>启动 Windows 资源管理器，并向表 1 中指定的文件夹分配适当的权限。 </P>
<P>表 1 中提到的固定模拟帐户是指可以使用 web.config 中的 &lt;<B>identity</B>&gt; 元素有选择地配置的帐户，如下所示。 </P><PRE class=codeSample>&lt;identity impersonate="true"
          userName="registry:HKLM\SOFTWARE\YourSecureApp\
                    identity\ASPNET_SETREG,userName"
          password="registry:HKLM\SOFTWARE\YourSecureApp\
                    identity\ASPNET_SETREG,password" /&gt;
</PRE>
<P>在本例中，aspnet_setreg.exe 已被用于以加密格式将自定义帐户凭据存储在注册表中。 </P>
<TABLE class=dataTable id=EAAADAA cellSpacing=0 cellPadding=0>
<THEAD>
<TR>
<TD class=tableHeader colSpan=4>表 1： 所需的 NTFS 权限</TD></TR>
<TR class=stdHeader vAlign=top>
<TD id=colEDBAAADAA>位置</TD>
<TD id=colECBAAADAA>所需权限</TD>
<TD id=colEBBAAADAA>帐户</TD>
<TD id=colEABAAADAA style="BORDER-RIGHT: #cccccc 1px solid">备注</TD></TR></THEAD>
<TBODY>
<TR class=record vAlign=top>
<TD>
<P class=lastInCell>临时 ASP.NET 文件：<BR>C:\WINNT\Microsoft.NET\Framework\&lt;version&gt;\<BR>临时 ASP.NET 文件</P></TD>
<TD>
<P class=lastInCell>完全控制</P></TD>
<TD>
<P class=lastInCell>Process 和固定模拟帐户</P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>这是 ASP.NET 的动态编译位置。在此文件夹下，为每个应用程序在离散目录中生成应用程序代码。<BR>&lt;compilation&gt; 元素中的 tempdir 属性可以用于更改此默认位置。</P></TD></TR>
<TR class=evenRecord vAlign=top>
<TD>
<P class=lastInCell>临时文件夹：<BR>C:\WINNT\temp</P></TD>
<TD>
<P class=lastInCell>Read/Write/Delete</P></TD>
<TD>
<P class=lastInCell>Process</P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>Web 服务用于生成序列化代理的位置。<BR>注意，<B>Delete</B> 权限使用 Windows 资源管理器文件夹属性对话框的 <B>Security</B> 页上的 <B>Advanced</B> 按钮设置。</P></TD></TR>
<TR class=record vAlign=top>
<TD>
<P class=lastInCell>应用程序虚拟目录：<BR>C:\inetpub\wwwroot\webapp1</P></TD>
<TD>
<P class=lastInCell>Read</P></TD>
<TD>
<P class=lastInCell>Process</P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>Web 应用程序文件的位置（即应用程序的虚拟根目录）。<BR>默认情况下，用户组具有适当的访问权限。</P></TD></TR>
<TR class=evenRecord vAlign=top>
<TD>
<P class=lastInCell>安装 (%installroot) 层次结构：<BR>(C:\WINNT\Microsoft.Net\Framework\v1.0.3705)</P></TD>
<TD>
<P class=lastInCell>Read</P></TD>
<TD>
<P class=lastInCell>Process和固定模拟帐户</P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>ASP.NET 必须能够访问 .NET Framework 程序集。<BR>默认情况下，用户组具有适当的访问权限。</P></TD></TR>
<TR class=record vAlign=top>
<TD>
<P class=lastInCell>全局程序集缓存：<BR>C:\WINNT\assembly</P></TD>
<TD>
<P class=lastInCell>Read</P></TD>
<TD>
<P class=lastInCell>Process 和固定模拟帐户</P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>这是全局程序集缓存。不能直接使用 Windows 资源管理器来编辑此文件夹的 ACL。应改用一个命令窗口并运行下列命令：<BR>cacls %windir%\assembly /e /t /p domain\useraccount:R<BR>另外，在使用 Windows 资源管理器前，用下列命令取消对 shfusion.dll 的注册：<BR>regsvr32&#8211;u shfusion.dll<BR>在用 Windows 资源管理器设置权限后，用下列命令重新注册 shfusion.dll：<BR>regsvr32 shfusion.dll</P></TD></TR>
<TR class=evenRecord vAlign=top>
<TD>
<P class=lastInCell>Web 站点根目录：<BR>C:\inetpub\wwwroot 或默认 Web 站点指向的路径</P></TD>
<TD>
<P class=lastInCell>Read</P></TD>
<TD>
<P class=lastInCell>Process</P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>ASP.NET 读取配置文件并监视此文件夹中的文件更改。</P></TD></TR>
<TR class=record vAlign=top>
<TD>
<P class=lastInCell>系统根目录：<BR>C:\WINNT\system32</P></TD>
<TD>
<P class=lastInCell>Read</P></TD>
<TD>
<P class=lastInCell>Process</P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>适用于 Framework 加载的系统 DLL。</P></TD></TR>
<TR class=evenRecord vAlign=top>
<TD>
<P class=lastInCell>应用程序文件夹层次结构<BR>C:\<BR>C:\inetpub\<BR>C:\inetpub\wwwroot\<BR>C:\inetpub\wwwroot\mywebapp1</P></TD>
<TD>
<P class=lastInCell>List Folder/Read</P></TD>
<TD>
<P class=lastInCell>Process</P></TD>
<TD style="BORDER-RIGHT: #cccccc 1px solid">
<P class=lastInCell>对于文件更改通知和 C# 编译器（为使文件规范化），Procss 帐户需要应用程序文件夹层次结构的列表文件夹和读取数据权限。这是返回到根目录所经过的全部父文件夹。</P></TD></TR></TBODY></TABLE>
<DIV class=dataTableBottomMargin></DIV></TD></TR></TBODY></TABLE>
<DIV style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px"><A href="http://luckyzmw.cnblogs.com/admin/#top"><IMG height=9 alt=返回页首 src="/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width=7 border=0></A><A class=topOfPage href="/admin/#top">返回页首</A></DIV><A name=ECAA></A>
<H2>配置 ASP.NET,从而使用新帐户来运行</H2>
<P>此过程通过编辑 machine.config 来将 ASP.NET 配置为使用新帐户来运行。</P>
<P><B>要将</B><B> ASP.NET 配置为使用新帐户来运行，请执行下列步骤： </B></P>
<TABLE class=numberedList cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>1.</P></TD>
<TD>
<P>在命令提示符下，运行 aspnet_setreg.exe 以将自定义帐户的用户名和密码的加密版本添加到注册表中。有关此实用工具的详细信息及其下载，请参阅 Microsoft 知识库文章 329290&#8220;HOWTO: Use the ASP.NET Utility to Encrypt Credentials and Session State Connection Strings&#8221;，位于 ： <A href="http://msdn.microsoft.com/isapi/gosupport.asp?Target=/default.aspx?scid=329290" target=_blank>http://support.microsoft.com/default.aspx?scid=329290</A>. </P><PRE class=codeSample>aspnet_setreg&#8211;k:SOFTWARE\YourSecureApp\processModel 
&#8211;u:"CustomASPNET"&#8211;p:"YourStrongPassword"
</PRE></TD></TR>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>2.</P></TD>
<TD>
<P>使用 Visual Studio.NET 或记事本打开 machine.config。 </P>
<P>Machine.config 位于下列文件夹中： </P><PRE class=codeSample>C:\WINNT\Microsoft.NET\Framework\v1.0.3705\CONFIG
</PRE></TD></TR>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>3.</P></TD>
<TD>
<P>定位到 &lt;<B>processModel</B>&gt; 元素并将 <B>userName</B> 和 <B>password</B> 属性设置为包含下列指向加密凭据详细信息的字符串。 </P><PRE class=codeSample>Default: 
&lt;processModel userName="machine" password="AutoGenerate" . . ./&gt;
Becomes: 
&lt;processModel 
  userName="registry:HKLM\SOFTWARE\YourSecureApp\processModel\
            ASPNET_SETREG,userName" 
  password="registry:HKLM\SOFTWARE\YourSecureApp\processmodel\
            ASPNET_SETREG,password" . . . /&gt;
</PRE></TD></TR>
<TR vAlign=top>
<TD class=listNumber noWrap align=right>
<P>4.</P></TD>
<TD>
<P>将更改保存到 machine.config 中</P></TD></TR></TBODY></TABLE><img src ="http://www.cnblogs.com/luckyzmw/aggbug/334843.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>新手学习XSL的好东西</title><link>http://www.cnblogs.com/luckyzmw/archive/2006/02/09/327414.html</link><dc:creator>luckyzmw</dc:creator><author>luckyzmw</author><pubDate>Wed, 08 Feb 2006 17:23:00 GMT</pubDate><guid>http://www.cnblogs.com/luckyzmw/archive/2006/02/09/327414.html</guid><wfw:comment>http://www.cnblogs.com/luckyzmw/comments/327414.html</wfw:comment><comments>http://www.cnblogs.com/luckyzmw/archive/2006/02/09/327414.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/luckyzmw/comments/commentRss/327414.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/luckyzmw/services/trackbacks/327414.html</trackback:ping><description><![CDATA[<STRONG>新手学习XSL的好东西<BR></STRONG>
<DIV width="100%">
<DIV style="FLOAT: right"><STRONG></STRONG></DIV>
<DIV><A class=contentlink href="http://home.zdjw.gov.cn/schools/zdsyzx/gudu/xml/Article_show.htm?Article_id=16" target=_blank><FONT color=#000050>http://home.zdjw.gov.cn/schools/zdsyzx/gudu/xml/Article_show.htm?Article_id=16</FONT></A><BR>有链接的页面还得看上面:)<BR>学XSL（一）&nbsp;(二）&nbsp;（三）&nbsp;（四）&nbsp;（五）&nbsp;（六）&nbsp;（七）&nbsp;（八）&nbsp;&nbsp;（返回）&nbsp; 
<P></P>
<P>2000-05-03&#183;&nbsp;禹希初&#183;CPCW</P>
<P>第一个XML文档</P>
<P>　　随着Internet的发展，越来越多的信息进入互联网，信息的交换、检索、保存及再利用等迫切的需求使HTML这种最常用的标记语言已越来越捉襟见肘。HTML将数据内容与表现融为一体，可修改性、数据可检索性差，而XML借鉴了HTML与数据库、程序语言的优点，将内容与表现分开，不仅使检索更为方便，更主要的是用户之间数据的交换更加方便，可重用性更强。</P>
<P>　　XML是一种元标记语言，没有许多固定的标记，为WEB开发人员提供了更大的灵活性。当我们使用HTML时，标记只是简单的表示内容的显示形式，而与表示的内容没有任何关联，为文档的进一步处理带来极大的不便。比如要表示个人简历，用HTML的表示方式如下：&nbsp;</P>
<P>&lt;&nbsp;HTML&nbsp;&gt;</P>
<P>&lt;&nbsp;BODY&nbsp;&gt;</P>
<P>&lt;&nbsp;TABLE&nbsp;border=1&nbsp;cellspacing=0&nbsp;&gt;</P>
<P>&lt;&nbsp;TH&nbsp;&gt;姓名&lt;&nbsp;TD&nbsp;&gt;禹希初&lt;&nbsp;TH&nbsp;&gt;性别&lt;&nbsp;TD&nbsp;&gt;男&lt;&nbsp;TH&nbsp;&gt;生日&lt;&nbsp;TD&nbsp;&gt;1977.5</P>
<P>&lt;&nbsp;TR&nbsp;&gt;</P>
<P>&lt;&nbsp;TH&nbsp;&gt;技能&lt;&nbsp;TD&nbsp;colspan=5&nbsp;&gt;数据库设计与维护、WEB开发</P>
<P>&lt;&nbsp;/TABLE&nbsp;&gt;</P>
<P>&lt;&nbsp;/BODY&nbsp;&gt;</P>
<P>&lt;&nbsp;/HTML&nbsp;&gt;</P>
<P>　　在这里，我们无法从标记TH、TD得知其内容表示什么，如果用XML，相应的文档（文件名：个人简历.xml）就可写成如下形式：&nbsp;</P>
<P>&lt;&nbsp;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&nbsp;&gt;</P>
<P>&lt;&nbsp;resume&nbsp;&gt;</P>
<P>&lt;&nbsp;name&nbsp;&gt;禹希初&lt;&nbsp;/name&nbsp;&gt;</P>
<P>&lt;&nbsp;sex&nbsp;&gt;男&lt;&nbsp;/sex&nbsp;&gt;</P>
<P>&lt;&nbsp;birthday&nbsp;&gt;1977.5&lt;&nbsp;/birthday&nbsp;&gt;</P>
<P>&lt;&nbsp;skill&nbsp;&gt;数据库设计与维护、WEB开发&lt;&nbsp;/skill&nbsp;&gt;</P>
<P>&lt;&nbsp;/resume&nbsp;&gt;</P>
<P>说明：</P>
<P>　　version──规定了XML文档的版本，此处只能是1.0；</P>
<P>　　encoding──&nbsp;此处规定了XML文档的编码类型，此处取值为&#8220;GB2312&#8221;，也就是&#8220;简体中文&#8221;。</P>
<P>　　对比两例，使用XML我们可以做到自定义标记，用标记表明内容的含义。这样在Internet上交流资料时，为用计算机处理文档提供了极大的方便，同时我们阅读源文件时也不会被一大堆格式弄得晕头转向。</P>
<P>　　然而，由于XML并没有为标记规定显示方式，如果我们在游览器中查看以上两个文档（建议使用IE5.0或更新版本），我们将看到xml文档并没有以诸如表格的方式来显示。难道我们就不能像HTML一样显示文档吗？回答是否定的。以个人简历为例，需要另建一个格式文件说明各个标记的显示方式，其内容如下（假设文件名为resume.css）：&nbsp;</P>
<P>resume{&nbsp;display:&nbsp;block;}</P>
<P>name{&nbsp;display:&nbsp;block;&nbsp;font-size:120%;}</P>
<P>sex{&nbsp;display:block;&nbsp;text-indent:2em}</P>
<P>birthday{&nbsp;display:block;&nbsp;text-indent:2em}</P>
<P>skill{&nbsp;display:block;&nbsp;text-indent:2em}</P>
<P>说明：</P>
<P>　　以上均为CSS样式，建议读者参考有关资料熟悉CSS，在以后学习中必须用到，此处由于篇幅关系不作介绍。建立文件resume.css后，在个人简历.xml文件的第一行后添加以下文字：&nbsp;</P>
<P>&lt;&nbsp;?xml:stylesheet&nbsp;type="text/css"&nbsp;href="resume.css"?&nbsp;&gt;</P>
<P>说明：</P>
<P>　　此处表示引用一个外部CSS样式文件，其中type规定样式类型（可取值为text/css或text/xsl），href规定文件路径。</P>
<P>　　保存文件，再以IE5.0打开文件。怎么样？格式有些不一样吧。好象还不令人满意，文档内容是清晰了，但显示效果比HTML编写的文档就差得多了，XML编写的文档就只能以这种方式显示吗？！</P>
<P>提示：</P>
<P>　　1.&nbsp;为了更好的理解与掌握XML，建议大家熟悉HTML&nbsp;4.0与CSS&nbsp;2.0语法；掌握<I>javascript</I>、VBscript中至少一种；编程经验、对数据库理论与SQL的了解均能使大家在学习XML时获益。</P>
<P>　　2.&nbsp;XML文档中标记必须成对出现，如果是空标记也必须有前加&#8220;/&#8221;的同名标记结束，或使用此种文式&lt;&nbsp;xml_mark/&nbsp;&gt;表示空标记。</P>
<P>　　3.&nbsp;XML以及下周将要介绍的XSL文档，属性值必须用双引号（"）或单引号（'）括起来。</P>
<P>　　4.&nbsp;XML文档必须是好结构的（XSL文档也是XML文档中一种），也就是说标记必须有结束标记、标记可以嵌套但不可交叉，如&nbsp;</P>
<P>&lt;&nbsp;outer&nbsp;&gt;&lt;&nbsp;inner&nbsp;&gt;&lt;&nbsp;/inner&nbsp;&gt;&lt;&nbsp;inner/&nbsp;&gt;&lt;&nbsp;/outer&nbsp;&gt;</P>
<P>是合法的，而下面的形式&nbsp;</P>
<P>&lt;&nbsp;outer&nbsp;&gt;&lt;&nbsp;inner&nbsp;&gt;&lt;&nbsp;/outer&nbsp;&gt;&lt;&nbsp;/inner&nbsp;&gt;</P>
<P>则是错误的。如果XML文档在浏览时出错，多半是违反了上面提到的规则。</P>
<P>跟我学XSL（二）（返回标题）</P>
<P>2000-05-04&#183;&nbsp;禹希初&#183;CPCW</P>
<P>XSL入门</P>
<P>　　上期我们讲到用CSS（层叠样式表）来格式化XML文档，其效果并不很令人满意。实际上CSS用来格式化HTML标记比较合适些，只是因为它简单才在上例中采用。</P>
<P>　　XML在更多的时候只是一种数据文件，怎样将它变为我们日常所看到的HTML格式那样的文件呢？如果我们将XML文件比作结构化的原料的话，那么XSL就好比&#8220;筛子&#8220;与&#8220;模子&#8220;，筛子选取自己需要的原料，这些原料再通过模子形成最终的产品：HTML。</P>
<P>　　这个模子大致是这样：我们先设计好表现的页面，再将其中需要从XML中获取数据来填充内容的部分&#8220;挖掉&#8220;，然后用XSL语句从XML中筛出相关的数据来填充。一言以譬之：这XSL实际上就是HTML的一个&#8220;壳子&#8220;，XML数据利用这个&#8220;壳&#8220;来生成&#8220;传统&#8220;的HTML。</P>
<P>　　XML在展开时是一个树形结构，我们将树形结构中自定义标记称为节点，节点之间存在父子、兄弟关系，我们要访问其中的结点从根结点就要以&#8221;／&#8221;来层层进入。</P>
<P>　　在XSL这个壳中，我们要从原料库？？XML里提取相关的数据，就要用到XSL提供的模式化查询语言。所谓模式化查询语言，就是通过相关的模式匹配规则表达式从XML里提取数据的特定语句，即我们上所说的&#8220;筛子&#8220;。</P>
<P>参考微软的&#8221;XSL开发者指南&#8221;，我们大致可将模式语言分为三种：&nbsp;</P>
<P>选择模式&nbsp;</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;&gt;、&lt;&nbsp;xsl:<I>value</I>-of&nbsp;&gt;,和&nbsp;&lt;&nbsp;xsl:apply-templates&nbsp;&gt;</P>
<P>测试模式&nbsp;</P>
<P>&lt;&nbsp;xsl:if&nbsp;&gt;&nbsp;和&lt;&nbsp;xsl:when&nbsp;&gt;</P>
<P>匹配模式&nbsp;</P>
<P>&lt;&nbsp;xsl:template&nbsp;&gt;&nbsp;</P>
<P>我们现在就分别对之进行介绍。</P>
<P>一、&nbsp;选择模式</P>
<P>　　选择模式语句将数据从XML中提取出来，是一种简单获得数据的方法，这几个标记都有一个select属性，选取XML中特定的结点名的数据。&nbsp;</P>
<P>1、&lt;&nbsp;xsl:for-each&nbsp;&gt;</P>
<P>如在XML中有这样的数据:</P>
<P>&lt;&nbsp;author&nbsp;&gt;</P>
<P>&lt;&nbsp;name&nbsp;&gt;小禹&lt;&nbsp;/name&nbsp;&gt;</P>
<P>&lt;&nbsp;name&nbsp;&gt;春华&lt;&nbsp;/name&nbsp;&gt;</P>
<P>&lt;&nbsp;name&nbsp;&gt;秋实&lt;&nbsp;/name&nbsp;&gt;</P>
<P>&lt;&nbsp;/author&nbsp;&gt;</P>
<P>　　我们要读取这三个作者名字，是一个一个地按&#8221;author/name&#8221;方法来读取吗，可有多个这样的name呀？如果有一种程序性的语句来循环读取有多好啊！</P>
<P>　　想得很对，XSL提供了这样的具有程序语言性质的语句&lt;&nbsp;XSL:for-each&nbsp;&gt;</P>
<P>　　用它读取这三个作者名字的方法如下:</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;select=&#8221;author/name&#8221;&nbsp;&gt;</P>
<P>&#8230;&#8230;.</P>
<P>&lt;&nbsp;./xsl:for-each&nbsp;&gt;</P>
<P>select，顾名思义：选取，它可以选定XML中特定唯一的标记，也可以选择某一类相同的标记，我们称之为结点集。&nbsp;</P>
<P>语法：&nbsp;</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;select="pattern"&nbsp;order-by="sort-criteria-list"&gt;</P>
<P>属性：&nbsp;</P>
<P>1.&nbsp;select</P>
<P>　　根据XSL样式查询考察上下文以决定哪类结点集（满足select条件）使用此样式描述。作为一种简化的表示就是，如果你想对文档中的某一种标记的内容的显示方式进行格式化，就可以将让select等于此元素的标记名。例如欲对标记xml_mark进行格式化，即可用如下方式表示：&nbsp;</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;select="xml_mark"&nbsp;&gt;</P>
<P>&lt;&nbsp;!--样式定义--&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:for-each&nbsp;&gt;</P>
<P>2.&nbsp;order-by</P>
<P>　　以分号（;）分隔、作为排序标准的列表。在列表元素前添加加号（+）表示按此标记的内容以升序排序，添加减号（-）表示逆序排序。作为一种简化的表示就是，排序标准列表就是由select规定的标记的子标记的序列，每个标记之间以（;）分隔。&nbsp;</P>
<P>2、&lt;&nbsp;xsl:<I>value</I>-of&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;&gt;模式只是选取节点，并没有取出节点的值，好比猴子只是爬到了树的某个枝干上，那么就用&lt;&nbsp;xsl:<I>value</I>-of&nbsp;&gt;来摘&#8220;胜利果实&#8220;吧！&nbsp;</P>
<P>语法：&nbsp;</P>
<P>&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="pattern"&nbsp;&gt;提取节点的值&nbsp;</P>
<P>属性：&nbsp;</P>
<P>select用来与当前上下文匹配的XSL式样。简单的讲，如果要在XSL文档某处插入某个XML标记（假定是xml_mark标记）的内容，可用如下方式表示：&nbsp;</P>
<P>&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="xml_mark"&nbsp;&gt;&lt;&nbsp;/xsl:<I>value</I>-of&nbsp;&gt;</P>
<P>或&nbsp;</P>
<P>&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="xml_mark"/&nbsp;&gt;</P>
<P>示例：</P>
<P>　　此处仍以上期的个人简历的作为例子，我们需要对文件（个人简历.xml）作一定修改，确切的说是将其中的第二行&nbsp;</P>
<P>&lt;&nbsp;?xml:stylesheet&nbsp;type="text/css"&nbsp;href="resume.css"?&nbsp;&gt;</P>
<P>修改为&nbsp;</P>
<P>&lt;&nbsp;?xml:stylesheet&nbsp;type="text/xsl"&nbsp;href="resume.xsl"?&nbsp;&gt;</P>
<P>然后建立一个新文件：resume.xsl，其内容如下：&nbsp;</P>
<P>&lt;&nbsp;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&nbsp;&gt;</P>
<P>&lt;&nbsp;HTML&nbsp;xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl"' target=_blank><FONT color=#4455aa>http://www.w3.org/TR/WD-xsl"</FONT></A>&nbsp;&gt;</P>
<P>&lt;&nbsp;HEAD&nbsp;&gt;</P>
<P>&lt;&nbsp;TITLE&nbsp;&gt;个人简历&lt;&nbsp;/TITLE&nbsp;&gt;</P>
<P>&lt;&nbsp;/HEAD&nbsp;&gt;&lt;&nbsp;BODY&nbsp;&gt;&nbsp;</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;select="resume"&nbsp;&gt;</P>
<P>&lt;&nbsp;P/&nbsp;&gt;</P>
<P>&lt;&nbsp;TABLE&nbsp;border="1"&nbsp;cellspacing="0"&nbsp;&gt;</P>
<P>&lt;&nbsp;CAPTION&nbsp;style="font-size:&nbsp;150%;&nbsp;font-weight:&nbsp;bold"&nbsp;&gt;</P>
<P>个人简历&nbsp;</P>
<P>&lt;&nbsp;/CAPTION&nbsp;&gt;</P>
<P>&lt;&nbsp;TR&nbsp;&gt;</P>
<P>&lt;&nbsp;TH&nbsp;&gt;姓名&lt;&nbsp;/TH&nbsp;&gt;&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="name"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TH&nbsp;&gt;性别&lt;&nbsp;/TH&nbsp;&gt;&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="sex"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TH&nbsp;&gt;生日&lt;&nbsp;/TH&nbsp;&gt;&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="birthday"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/TR&nbsp;&gt;</P>
<P>&lt;&nbsp;TR&nbsp;&gt;</P>
<P>&lt;&nbsp;TH&nbsp;&gt;技能&lt;&nbsp;/TH&nbsp;&gt;&lt;&nbsp;TD&nbsp;colspan="5"&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="skill"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/TR&nbsp;&gt;</P>
<P>&lt;&nbsp;/TABLE&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:for-each&nbsp;&gt;</P>
<P>&lt;&nbsp;/BODY&nbsp;&gt;</P>
<P>&lt;&nbsp;/HTML&nbsp;&gt;</P>
<P>　　完成这些以后再来让我们看一下辛勤劳动的成果，怎么样？效果不错吧。更酷还在后头呢。现在我们对文件（个人简历.xml）作进一步的修改：&nbsp;</P>
<P>1.&nbsp;在标记&lt;&nbsp;resume&nbsp;&gt;前添加一个新标记&lt;&nbsp;document&nbsp;&gt;；&nbsp;</P>
<P>2.&nbsp;将标记对&lt;&nbsp;resume&nbsp;&gt;&lt;&nbsp;/resume&nbsp;&gt;之间的内容（包括这一对标记）复制并粘贴在其后，并在最后用&lt;&nbsp;document&nbsp;&gt;结束。&nbsp;</P>
<P>3.&nbsp;以Notepad.exe打开文件resume.xsl，在标记&lt;&nbsp;HTML&nbsp;&gt;之后添加文字：&lt;&nbsp;xsl:for-each&nbsp;select="document"&nbsp;&gt;；在标记&lt;&nbsp;/HTML&nbsp;&gt;之前添加文字：&lt;&nbsp;/xsl:for-each&nbsp;&gt;，保存文件。</P>
<P>4.&nbsp;在浏览器中打开文件（个人简历.xml）。看到了什么？两份个人简历！</P>
<P>　　就这样，利用XML我们可以编写内容与样式完成分离的文档！当然，XSL文件比一般的HTML文件要复杂一些，然而一旦完成则可用于格式化所有同类的XML文档。</P>
<P>注：如果拷贝代码，请将空格删除&nbsp;</P>
<P>跟我学XSL（三）&nbsp;&nbsp;（返回标题）&nbsp;</P>
<P>2000-05-05&#183;&nbsp;禹希初&#183;CPCW</P>
<P>XSL模板与匹配模式</P>
<P>　　经过前几日的学习，我们学习了XHTML文档的编写和以及三个XSL元素，已能编写相当灵活的XSL文档，今天将学习的是XSL模板的编写。我们都知道，短的文档、程序十分好读，但当规模增大后，其复杂性也以更快的速度增加。</P>
<P>　　前面我们学了&lt;&nbsp;xsl:for-each&nbsp;&gt;、&lt;&nbsp;xsl:<I>value</I>-of&nbsp;&gt;等，可以用它们对XML数据实现简单的格式化输出，但如果遇到比较复杂的XML格式输出，将XSL按照要求依次写下来的话，一是设计困难，可扩展性差，不利于人员之间的分工协作；另则，可修改性很差，可能会出现牵一发而动全军的情况，不利于维护。程序中模块化设计逐步细化的方法在这里得到了应用！&nbsp;</P>
<P>　　XSL模板将XSL的设计细化成一个个模板（块），最后再将这些模板（块）组合成一个完整的XSL；好比船与集装箱，我们不是将所有的货物一件件地堆起来，而是装在各自的集装箱中，然后再在船上将这些集装箱堆放起来。这种方法可以使你先从整体上考虑整个XSL的设计，然后将一些表现形式细化成不同的模块，再具体设计这些模块，最后将它们整合在一起，这样，将宏观与微观结合起来，符合人们条理化、规范化要求。</P>
<P>装集装箱？？书写模板（块）：&lt;&nbsp;xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;&gt;</P>
<P>语法：&nbsp;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="node-context"&nbsp;language="language-name"&nbsp;&gt;</P>
<P>属性：&nbsp;</P>
<P>match&nbsp;──&nbsp;确定什么样的情况下执行此模板。作为一种简化的说明，在此处使用标记的名字；其中最上层模板必须将match设为&#8220;/&#8221;</P>
<P>language&nbsp;──&nbsp;确定在此模板中执行什么脚本语言，其取值与HTML中的SCRIPT标记的LANGUAGE属性的取值相同，缺省值是Jscript</P>
<P>&lt;&nbsp;xsl:template&nbsp;&gt;用match属性从XML选取满足条件的节点，征对这些特定的节点形成一个特定输出形式的模板。</P>
<P>吊集装箱上船-？？调用模板（块）：&lt;&nbsp;xsl:apply-templates&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:apply-templates&nbsp;&gt;</P>
<P>语法：&nbsp;</P>
<P>&lt;&nbsp;xsl:apply-templates&nbsp;select="pattern"&nbsp;order-by="sort-criteria-list"&nbsp;&gt;</P>
<P>属性：&nbsp;</P>
<P>select&nbsp;──&nbsp;确定在此上下文环境中应执行什么模板，即选取用&lt;&nbsp;xsl:template&nbsp;&gt;标记建立的模板（块）。&nbsp;</P>
<P>order-by&nbsp;──&nbsp;以分号（;）分隔的排序标准，通常是子标记的序列</P>
<P>示例：</P>
<P>　　以个人简历为例，为便于处理我们希望&#8220;技能&#8221;中每一项都用标记对&lt;&nbsp;skill&nbsp;&gt;&lt;&nbsp;/skill&nbsp;&gt;括起来，有多少项技能就有多少个这种标记对，经过修改后的个人简历XML文档内容如下：&nbsp;</P>
<P>&lt;&nbsp;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&nbsp;&gt;</P>
<P>&lt;&nbsp;?xml:stylesheet&nbsp;type="text/xsl"&nbsp;href="resume_template.xsl"?&nbsp;&gt;</P>
<P>&lt;&nbsp;document&nbsp;&gt;</P>
<P>&lt;&nbsp;resume&nbsp;&gt;</P>
<P>&lt;&nbsp;name&nbsp;&gt;禹希初&lt;&nbsp;/name&nbsp;&gt;</P>
<P>&lt;&nbsp;sex&nbsp;&gt;男&lt;&nbsp;/sex&nbsp;&gt;</P>
<P>&lt;&nbsp;birthday&nbsp;&gt;1977.5&lt;&nbsp;/birthday&nbsp;&gt;</P>
<P>&lt;&nbsp;skill&nbsp;&gt;数据库设计与维护&lt;&nbsp;/skill&nbsp;&gt;</P>
<P>&lt;&nbsp;skill&nbsp;&gt;WEB开发&lt;&nbsp;/skill&nbsp;&gt;</P>
<P>&lt;&nbsp;/resume&nbsp;&gt;</P>
<P>&lt;&nbsp;/document&nbsp;&gt;</P>
<P>　　然后，建立一个新XSL文件resume_template.xsl，采用模板的形式，其内容如下：&nbsp;</P>
<P>&lt;&nbsp;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:stylesheet&nbsp;xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl"' target=_blank><FONT color=#4455aa>http://www.w3.org/TR/WD-xsl"</FONT></A>&nbsp;&gt;</P>
<P>&lt;&nbsp;!--根模板--&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="/"&nbsp;&gt;</P>
<P>&lt;&nbsp;HTML&nbsp;&gt;&lt;&nbsp;HEAD&nbsp;&gt;&lt;&nbsp;TITLE&nbsp;&gt;个人简历&lt;&nbsp;/TITLE&nbsp;&gt;&lt;&nbsp;/HEAD&nbsp;&gt;</P>
<P>&lt;&nbsp;BODY&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:apply-templates&nbsp;select="document/resume"/&nbsp;&gt;</P>
<P>&lt;&nbsp;/BODY&nbsp;&gt;</P>
<P>&lt;&nbsp;/HTML&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;!--简历模板--&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="resume"&nbsp;&gt;</P>
<P>&lt;&nbsp;TABLE&nbsp;border="1"&nbsp;cellspacing="0"&nbsp;&gt;</P>
<P>&lt;&nbsp;CAPTION&nbsp;&gt;个人简历（&nbsp;</P>
<P>&lt;&nbsp;xsl:eval&nbsp;&gt;formatIndex(childNumber(this),&nbsp;"I")&lt;&nbsp;/xsl:eval&nbsp;&gt;</P>
<P>）&lt;&nbsp;/CAPTION&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:apply-templates&nbsp;select="name"&nbsp;/&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:apply-templates&nbsp;select="sex"&nbsp;/&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:apply-templates&nbsp;select="birthday"&nbsp;/&nbsp;&gt;</P>
<P>&lt;&nbsp;TR/&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;技能&lt;&nbsp;/TD&nbsp;&gt;&lt;&nbsp;TD&nbsp;COLSPAN="5"&nbsp;&gt;</P>
<P>&lt;&nbsp;TABLE&nbsp;cellspacing="0"&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:apply-templates&nbsp;select="skill"/&nbsp;&gt;</P>
<P>&lt;&nbsp;/TABLE&nbsp;&gt;</P>
<P>&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/TABLE&nbsp;&gt;</P>
<P>&lt;&nbsp;BR/&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;!--姓名模板--&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="name"&nbsp;&gt;&lt;&nbsp;TD&nbsp;&gt;姓名&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;!--性别模板--&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="sex"&nbsp;&gt;&lt;&nbsp;TD&nbsp;&gt;性别&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;!--生日模板--&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="birthday"&nbsp;&gt;&lt;&nbsp;TD&nbsp;&gt;生日&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;!--技能模板--&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="skill"&nbsp;&gt;</P>
<P>&lt;&nbsp;TR&nbsp;&gt;&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;&lt;&nbsp;/TR&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:stylesheet&nbsp;&gt;</P>
<P>　　保存文件，打开文件（个人简历.xml），效果令人满意吧。其实要做到同样的效果，用前面三周介绍的方法也可做，但你得把它作为一整体考虑。</P>
<P>　　在上面的XSL文件中，我们将性别、生日、技能等数据项分别用模板来单独写，再用&lt;&nbsp;xsl:apply-template&nbsp;&gt;来调用，这样，即使你日后要对这些模板作相应的修改与扩充也很方便，不致于出现互相干扰、混杂不清的情况。这种从上至下、逐层细化的设计方法，极大地减少工作复杂程度，也大大减少了差错的产生，可以实现多人的协作设计。</P>
<P>注意：</P>
<P>　　如果XML文档中不同标记有同名的子标记，在为其编写模板时，应把父标记作为其前缀，格式为（parent_mark/child_mark）。</P>
<P>　　模板文件必须有一个根模板，其属性match是&#8220;/&#8221;。</P>
<P>注：如果拷贝源代码，请将空格删除&nbsp;</P>
<P>跟我学XSL（四）&nbsp;&nbsp;（返回标题）&nbsp;</P>
<P>2000-05-06&#183;&nbsp;禹希初&#183;CPCW</P>
<P>测试模式&nbsp;</P>
<P>　　XML技术的优势之一就在于数据输出的可选择性，即选择需要的数据输出。前面我们所讲到的选择模式语句:&lt;xsl:for-each&gt;、&lt;xsl:<I>value</I>-of&gt;及&lt;xsl:apply-template&gt;只是简单的选取通过&#8221;/&#8221;符号层层到达的节点，如果我们对XML数据不需要全部输出，而只需要其中的满足某条件的部分数据，&#8220;萝卜青菜、各取所需&#8220;，那么条件判断&lt;xsl:if&gt;与多条件判断&lt;xsl:choose&gt;及&lt;xsl:when&gt;则迎合了这种需要，如果你对程序设计熟悉的话，会觉得它们似曾相识。&nbsp;</P>
<P>XSL中的IF，首先，介绍XSL元素&lt;xsl:if&gt;的语法结构：&nbsp;</P>
<P>&lt;xsl:if&gt;&nbsp;</P>
<P>语法：&nbsp;</P>
<P>&lt;xsl:if&nbsp;expr="script-expression"&nbsp;language="language-name"&nbsp;test="pattern"&gt;&nbsp;</P>
<P>属性：&nbsp;</P>
<P>　　expr&nbsp;──脚本语言表达式，计算结果为&#8220;真&#8221;或&#8220;假&#8221;；如果结果为&#8220;真&#8221;，且通过test，则在输出中显示其中内容（可省略此项属性）。&nbsp;</P>
<P>　　language&nbsp;──expr属性中表达式的脚本语言类型，其取值与HTML标记SCRIPT的LANGUAGE属性的取值相同，缺省为&#8220;JScript&#8221;test&nbsp;──源数据测试条件。&nbsp;</P>
<P>示例：&nbsp;</P>
<P>此处以一份报表为例，文件名为report.xml，其内容如下：&nbsp;</P>
<P>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;&nbsp;</P>
<P>&lt;?xml:stylesheet&nbsp;type="text/xsl"&nbsp;href="report.xsl"?&gt;&nbsp;</P>
<P>&lt;document&gt;&nbsp;</P>
<P>&lt;report&gt;&nbsp;</P>
<P>&lt;class&gt;&nbsp;</P>
<P>甲班&nbsp;</P>
<P>&lt;/class&gt;&lt;q1&gt;50&lt;/q1&gt;&lt;q2&gt;70&lt;/q2&gt;&nbsp;</P>
<P>&lt;q3&gt;30&lt;/q3&gt;&lt;q4&gt;10&lt;/q4&gt;&lt;/report&gt;&nbsp;</P>
<P>&lt;report&gt;&lt;class&gt;&nbsp;</P>
<P>乙班&nbsp;</P>
<P>&lt;/class&gt;&lt;q1&gt;20&lt;/q1&gt;&lt;q2&gt;30&lt;/q2&gt;&nbsp;</P>
<P>&lt;q3&gt;40&lt;/q3&gt;&lt;q4&gt;50&lt;/q4&gt;&lt;/report&gt;&nbsp;</P>
<P>&lt;report&gt;&lt;class&gt;&nbsp;</P>
<P>丙班&nbsp;</P>
<P>&lt;/class&gt;&lt;q1&gt;70&lt;/q1&gt;&lt;q2&gt;40&lt;/q2&gt;&nbsp;</P>
<P>&lt;q3&gt;20&lt;/q3&gt;&lt;q4&gt;10&lt;/q4&gt;&lt;/report&gt;&nbsp;</P>
<P>&lt;/document&gt;&nbsp;</P>
<P>　　我们采用XSL模板结合今天所学的&lt;xsl:if&gt;，为其编写一个XSL文档，要求季度产量小于等于20的用红色表示，文件名为report.xsl，内容如下：&nbsp;</P>
<P>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&gt;&nbsp;</P>
<P>&lt;xsl:stylesheet&nbsp;xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl">' target=_blank><FONT color=#4455aa>http://www.w3.org/TR/WD-xsl"&gt;</FONT></A>&nbsp;</P>
<P>&lt;xsl:template&nbsp;match="/"&gt;&nbsp;</P>
<P>&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;1999年生产统计&lt;/TITLE&gt;&lt;/HEAD&gt;&nbsp;</P>
<P>&lt;BODY&gt;&lt;xsl:apply-templates&nbsp;select="document&nbsp;;"/&gt;&lt;/BODY&gt;&nbsp;</P>
<P>&lt;/HTML&gt;&nbsp;</P>
<P>&lt;/xsl:template&gt;&nbsp;</P>
<P>&lt;xsl:template&nbsp;match="document"&gt;&nbsp;</P>
<P>&lt;H3&gt;1999年生产统计&lt;/H3&gt;&nbsp;</P>
<P>&lt;TABLE　border="1"&nbsp;cellspacing="0"&gt;&nbsp;</P>
<P>&lt;TH&gt;班组&lt;/TH&gt;&lt;TH&gt;&nbsp;</P>
<P>一季度&nbsp;</P>
<P>&lt;/TH&gt;&lt;TH&gt;&nbsp;</P>
<P>二季度&nbsp;</P>
<P>&lt;/TH&gt;&nbsp;</P>
<P>&lt;TH&gt;&nbsp;</P>
<P>三季度&nbsp;</P>
<P>&lt;/TH&gt;&lt;TH&gt;&nbsp;</P>
<P>四季度&nbsp;</P>
<P>&lt;/TH&gt;&nbsp;</P>
<P>&lt;xsl:apply-templates&nbsp;select="report"/&gt;&nbsp;</P>
<P>&lt;/TABLE&gt;&nbsp;</P>
<P>&lt;/xsl:template&gt;&nbsp;</P>
<P>&lt;xsl:template&nbsp;match="report"&gt;&nbsp;</P>
<P>&lt;TR&gt;&nbsp;</P>
<P>&lt;TD&gt;&lt;xsl:<I>value</I>-of&nbsp;select="class"/&gt;&lt;/TD&gt;&nbsp;</P>
<P>&lt;TD&gt;&lt;xsl:apply-templates&nbsp;select="q1"/&gt;&lt;/TD&gt;&nbsp;</P>
<P>&lt;TD&gt;&lt;xsl:apply-templates&nbsp;select="q2"/&gt;&lt;/TD&gt;&nbsp;</P>
<P>&lt;TD&gt;&lt;xsl:apply-templates&nbsp;select="q3"/&gt;&lt;/TD&gt;&nbsp;</P>
<P>&lt;TD&gt;&lt;xsl:apply-templates&nbsp;select="q4"/&gt;&lt;/TD&gt;&nbsp;</P>
<P>&lt;/TR&gt;&nbsp;</P>
<P>&lt;/xsl:template&gt;&nbsp;</P>
<P>&lt;xsl:template&nbsp;match="q1|q2|q3|q4"&gt;&nbsp;</P>
<P>&lt;!--此处测试产量，如小于等于20则添加一STYLE属性color，其值为red（红色）--&gt;&nbsp;</P>
<P>&lt;xsl:if&nbsp;test=".[<I>value</I>()&nbsp;$le$&nbsp;20]"&gt;&nbsp;</P>
<P>&lt;xsl:attribute&nbsp;name="style"&gt;color:red&lt;/xsl:attribute&gt;&nbsp;</P>
<P>&lt;/xsl:if&gt;&nbsp;</P>
<P>&lt;xsl:<I>value</I>-of/&gt;&nbsp;</P>
<P>&lt;/xsl:template&gt;&nbsp;</P>
<P>&lt;/xsl:stylesheet&gt;&nbsp;</P>
<P>说明：&nbsp;</P>
<P>q1|q2|q3|q4&nbsp;──标记q1、q2、q3、q3均用此模板确定输出&nbsp;</P>
<P>$le$&nbsp;──是关系运算符中的&#8220;小于等于&#8221;，其它关系有小于（$lt$）、大于（$gt$）、大于等于（$ge$）、等于（$eq$）、不等于（$ne$）等&nbsp;</P>
<P>.&nbsp;──表示引用当前标记&nbsp;</P>
<P>[&nbsp;]&nbsp;──表示筛选，只有满足筛选条件的标记才能被选取&nbsp;</P>
<P><I>value</I>()&nbsp;──XSL函数，其他常用XSL函数有text()、end()、index()等。&nbsp;</P>
<P>　　下期，我们将学习XSL的另外三个元素，可对同一数据进行多次测试，根据不同条件产生相应输出。&nbsp;</P>
<P>跟我学XSL（五）&nbsp;&nbsp;（返回标题）&nbsp;</P>
<P>2000-05-07&#183;&nbsp;禹希初&#183;CPCW</P>
<P>XSL中的choose</P>
<P>　　上期我们学习了XSL元素&lt;&nbsp;xsl:if&nbsp;&gt;，已能通过测试XML数据的值来决定不同的输出形式（不知你尝试过没有，实际上&lt;&nbsp;xsl:for-each&nbsp;&gt;也可部分实现&lt;&nbsp;xsl:if&nbsp;&gt;的功能），但有时，我们希望对同一数据同时测试多个条件，根据不同条件输出相应结果。当然，我们可以用if，假如我们只有if可用的话。幸好我们有一个更好的选择，那就是用&lt;&nbsp;xsl:choose&nbsp;&gt;。下面介绍相关元素的语法：&nbsp;</P>
<P>&lt;&nbsp;xsl:choose&nbsp;&gt;</P>
<P>语法：&lt;&nbsp;xsl:choose&nbsp;&gt;</P>
<P>属性：无，表示一个多选测试的开始&nbsp;</P>
<P>&lt;&nbsp;xsl:when&nbsp;&gt;</P>
<P>语法：&nbsp;</P>
<P>&lt;&nbsp;xsl:when&nbsp;expr="script-expression"&nbsp;language="language-name"&nbsp;test="pattern"&nbsp;&gt;</P>
<P>属性：&nbsp;</P>
<P>expr&nbsp;──&nbsp;脚本语言表达式，计算结果为&#8220;真&#8221;或&#8220;假&#8221;；如果结果为&#8220;真&#8221;，且通过test，则在输出中显示其中内容（可省略此项属性）。&nbsp;</P>
<P>language&nbsp;──&nbsp;expr属性中表达式的脚本语言类型，其取值与HTML标记SCRIPT的LANGUAGE属性的取值相同，缺省为&#8220;JScript&#8221;。&nbsp;</P>
<P>test&nbsp;──&nbsp;源数据测试条件。&nbsp;</P>
<P>&lt;&nbsp;xsl:otherwise&nbsp;&gt;</P>
<P>语法：&lt;&nbsp;xsl:otherwise&nbsp;&gt;</P>
<P>属性：无，在一个多选测试中，如果没有不满足&lt;&nbsp;xsl:when&nbsp;&gt;规定的条件，如果在最后有此标记，则输出此标记中的内容。</P>
<P>示例：</P>
<P>　　此处以学生成绩单为例，要求按成绩的高低给出优秀（&nbsp;&gt;85）、一般（70~85）、起格（60~69）、不及格（&lt;&nbsp;60），而不是显示分数。其中成绩单的XML文档(文件名：grade.xml)如下：&nbsp;</P>
<P>&lt;&nbsp;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&nbsp;&gt;</P>
<P>&lt;&nbsp;?xml:stylesheet&nbsp;type="text/xsl"&nbsp;href="grade.xsl"?&nbsp;&gt;</P>
<P>&lt;&nbsp;document&nbsp;&gt;</P>
<P>&lt;&nbsp;grade&nbsp;&gt;</P>
<P>&lt;&nbsp;name&nbsp;&gt;大胖&lt;&nbsp;/name&nbsp;&gt;&lt;&nbsp;english&nbsp;&gt;80&lt;&nbsp;/english&nbsp;&gt;</P>
<P>&lt;&nbsp;math&nbsp;&gt;90&lt;&nbsp;/math&nbsp;&gt;&lt;&nbsp;chymest&nbsp;&gt;90&lt;&nbsp;/chymest&nbsp;&gt;</P>
<P>&lt;&nbsp;/grade&nbsp;&gt;</P>
<P>&lt;&nbsp;grade&nbsp;&gt;</P>
<P>&lt;&nbsp;name&nbsp;&gt;小花&lt;&nbsp;/name&nbsp;&gt;&lt;&nbsp;english&nbsp;&gt;98&lt;&nbsp;/english&nbsp;&gt;</P>
<P>&lt;&nbsp;math&nbsp;&gt;70&lt;&nbsp;/math&nbsp;&gt;&lt;&nbsp;chymest&nbsp;&gt;85&lt;&nbsp;/chymest&nbsp;&gt;</P>
<P>&lt;&nbsp;/grade&nbsp;&gt;</P>
<P>&lt;&nbsp;/document&nbsp;&gt;</P>
<P>　　为实现按分数分等级显示，其XSL文档（文件名：grade.xsl）内容如下：&nbsp;</P>
<P>&lt;&nbsp;?xml&nbsp;version="1.0"&nbsp;encoding="GB2312"?&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:stylesheet&nbsp;xmlns:xsl="<A class=contentlink href='http://www.w3.org/TR/WD-xsl"' target=_blank><FONT color=#4455aa>http://www.w3.org/TR/WD-xsl"</FONT></A>&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="/"&nbsp;&gt;</P>
<P>&lt;&nbsp;HTML&nbsp;&gt;</P>
<P>&lt;&nbsp;HEAD&nbsp;&gt;&lt;&nbsp;TITLE&nbsp;&gt;成绩单&lt;&nbsp;/TITLE&nbsp;&gt;&lt;&nbsp;/HEAD&nbsp;&gt;</P>
<P>&lt;&nbsp;BODY&nbsp;&gt;&lt;&nbsp;xsl:apply-templates&nbsp;select="document"/&nbsp;&gt;&lt;&nbsp;/BODY&nbsp;&gt;</P>
<P>&lt;&nbsp;/HTML&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="document"&nbsp;&gt;</P>
<P>&lt;&nbsp;TABLE&nbsp;border="1"&nbsp;cellspacing="0"&nbsp;&gt;</P>
<P>&lt;&nbsp;TH&nbsp;&gt;姓名&lt;&nbsp;/TH&nbsp;&gt;&nbsp;&lt;&nbsp;TH&nbsp;&gt;英语&lt;&nbsp;/TH&nbsp;&gt;&lt;&nbsp;TH&nbsp;&gt;数学&lt;&nbsp;/TH&nbsp;&gt;&lt;&nbsp;TH&nbsp;&gt;化学&lt;&nbsp;/TH&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:apply-templates&nbsp;select="grade"/&nbsp;&gt;</P>
<P>&lt;&nbsp;/TABLE&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="grade"&nbsp;&gt;</P>
<P>&lt;&nbsp;TR&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:apply-templates&nbsp;select="name"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:apply-templates&nbsp;select="english"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:apply-templates&nbsp;select="math"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:apply-templates&nbsp;select="chymest"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/TR&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="name"&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of/&nbsp;&gt;&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="english|math|chymest"&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:choose&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:when&nbsp;test=".[<I>value</I>()&nbsp;$gt$&nbsp;85]"&nbsp;&gt;优秀&lt;&nbsp;/xsl:when&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:when&nbsp;test=".[<I>value</I>()&nbsp;$gt$&nbsp;70]"&nbsp;&gt;一般&lt;&nbsp;/xsl:when&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:when&nbsp;test=".[<I>value</I>()&nbsp;$gt$&nbsp;60]"&nbsp;&gt;起格&lt;&nbsp;/xsl:when&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:otherwise&nbsp;&gt;不起格&lt;&nbsp;/xsl:otherwise&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:choose&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:stylesheet&nbsp;&gt;</P>
<P>说明：</P>
<P>　　在&lt;&nbsp;xsl:choose&nbsp;&gt;选择中，从第一个&lt;&nbsp;xsl:when&nbsp;&gt;开始，逐个测试，直到满足一个测试条件就将其中的内容输出，不再测试后面的条件；如果不满足任何一个条件，则输出&lt;&nbsp;xsl:otherwise&nbsp;&gt;中的内容。</P>
<P>　　标记对&lt;&nbsp;xsl:when&nbsp;&gt;&lt;&nbsp;/xsl:when&nbsp;&gt;与&lt;&nbsp;xsl:otherwise&nbsp;&gt;&lt;&nbsp;/xsl:otherwise&nbsp;&gt;中可嵌套&lt;&nbsp;xsl:if&nbsp;&gt;或&lt;&nbsp;xsl:choose&nbsp;&gt;。</P>
<P>注：如果拷贝源代码，请将空格删除</P>
<P>跟我学XSL（六）&nbsp;&nbsp;（返回标题）&nbsp;</P>
<P>2000-05-08&#183;&nbsp;禹希初&#183;CPCW</P>
<P>运算符、关系与逻辑运算符，特殊字符等</P>
<P>　　今天我们学习XSL的各种运算符，满足编写更大灵活性的XSL样式的要求。</P>
<P>表一、运算符与特殊字符</P>
<P>运算符&nbsp;描述&nbsp;</P>
<P>/&nbsp;选择子元素，返回左侧元素的直接子元素；如果&#8220;/&#8221;位于最左侧表示选择根结点的直接子元素&nbsp;</P>
<P>//&nbsp;递归下降，不论深度，搜索指定的元素；如果位于最左侧表示从根结点出发递归下降搜索指定元素&nbsp;</P>
<P>.&nbsp;表示当前元素&nbsp;</P>
<P>*&nbsp;通配符，选择任意元素，不考虑名字&nbsp;</P>
<P>@&nbsp;取得属性值，作为属性名的前缀&nbsp;</P>
<P>@*&nbsp;通配符，选择任意属性，不考虑名字&nbsp;</P>
<P>:&nbsp;名字作用范围分隔符，将名字作用范围前缀与元素或属性名分隔开来&nbsp;</P>
<P>!*&nbsp;在相关节点上应用指定方法&nbsp;</P>
<P>(&nbsp;)*&nbsp;分组，明确指定优先顺序&nbsp;</P>
<P>[&nbsp;]&nbsp;应用过滤样式&nbsp;</P>
<P>[&nbsp;]*&nbsp;下标运算符，用于在集合中指示元素&nbsp;</P>
<P>表二、逻辑运算符</P>
<P>比较运算符&nbsp;可选方式&nbsp;描述&nbsp;</P>
<P>and&nbsp;$and$或&nbsp;逻辑与&nbsp;</P>
<P>or&nbsp;$or$或||&nbsp;逻辑或&nbsp;</P>
<P>not()&nbsp;$not$&nbsp;逻辑非&nbsp;</P>
<P>表三、关系运算符&nbsp;</P>
<P>=&nbsp;$eq$&nbsp;相等&nbsp;</P>
<P>=&nbsp;$ieq$&nbsp;相等（不区分大小写）&nbsp;</P>
<P>!=&nbsp;$ne$&nbsp;不等&nbsp;</P>
<P>$ine$&nbsp;不等（不区分大小写）&nbsp;</P>
<P>&lt;&nbsp;$lt$&nbsp;小于&nbsp;</P>
<P>$ilt$&nbsp;小于（不区分大小写）&nbsp;</P>
<P>&lt;&nbsp;=&nbsp;$le$&nbsp;小于等于&nbsp;</P>
<P>$ile$&nbsp;小于等于（不区分大小写）&nbsp;</P>
<P>&gt;&nbsp;$gt$&nbsp;大于&nbsp;</P>
<P>$igt$&nbsp;大于（不区分大小写）&nbsp;</P>
<P>&gt;=&nbsp;$ge$&nbsp;大于等于&nbsp;</P>
<P>$ige$&nbsp;大于等于（不区分大小写）&nbsp;</P>
<P>$all$&nbsp;集合运算符，如果集合中所有项目均满足条件则返回&#8220;真&#8221;&nbsp;</P>
<P>$any$&nbsp;集合运算符，如果集合中任意项目满足条件则返回&#8220;真&#8221;&nbsp;</P>
<P>|&nbsp;集合运算符，返回两个集合的联合&nbsp;</P>
<P>示例一：</P>
<P>　　从个人简历中寻找具有具有&#8220;WEB开发&#8221;技能的人的姓名与E-Mail。假设文档结构如下所示：&nbsp;</P>
<P>&lt;&nbsp;document&nbsp;&gt;</P>
<P>&lt;&nbsp;resume&nbsp;&gt;</P>
<P>&lt;&nbsp;name&nbsp;&gt;name&lt;&nbsp;/name&nbsp;&gt;</P>
<P>&lt;&nbsp;sex&nbsp;&gt;sex&lt;&nbsp;/sex&nbsp;&gt;</P>
<P>&lt;&nbsp;birthday&nbsp;&gt;birthday&lt;&nbsp;/birthday&nbsp;&gt;</P>
<P>&lt;&nbsp;skill&nbsp;&gt;skill1&lt;&nbsp;/skill&nbsp;&gt;</P>
<P>&lt;&nbsp;skill&nbsp;&gt;skill2&lt;&nbsp;/skill2&nbsp;&gt;</P>
<P>&#8230;&nbsp;</P>
<P>&lt;&nbsp;skill&nbsp;&gt;skilln&lt;&nbsp;/skill&nbsp;&gt;</P>
<P>&lt;&nbsp;/resume&nbsp;&gt;</P>
<P>&lt;&nbsp;resume&nbsp;&gt;</P>
<P>&#8230;&nbsp;</P>
<P>&lt;&nbsp;/resume&nbsp;&gt;</P>
<P>&#8230;&nbsp;</P>
<P>&lt;&nbsp;/document&nbsp;&gt;</P>
<P>　　为从以上结构的个人简历中寻找出所有具有&#8220;WEB开发&#8221;技能的人的姓名与E-Mail的XSL文档结构如下：&nbsp;</P>
<P>&lt;&nbsp;TABLE&nbsp;border="1"&nbsp;cellspacing="0"&nbsp;&gt;</P>
<P>&lt;&nbsp;TH&nbsp;&gt;姓名&lt;&nbsp;/TH&nbsp;&gt;&lt;&nbsp;TH&nbsp;&gt;E-Mail&lt;&nbsp;/TH&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;select="resume&nbsp;[&nbsp;$any$&nbsp;skill='WEB开发'&nbsp;]"&nbsp;&gt;</P>
<P>&lt;&nbsp;TR&nbsp;&gt;&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="name"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="E-Mail"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/TR&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:for-each&nbsp;&gt;</P>
<P>&lt;&nbsp;/TABLE&nbsp;&gt;</P>
<P>说明：&nbsp;</P>
<P>1.[&nbsp;]&nbsp;───表示选择条件，只有满足条件的个人简历才被显示；&nbsp;</P>
<P>2.$any$&nbsp;──由于每个人有多种技能，故加$any$作为前缀，以使每个人所有技能都能被比较；&nbsp;</P>
<P>3.skill='WEB开发'&nbsp;──筛选条件</P>
<P>示例二、</P>
<P>　　仍上面的XML文档为例，如果欲选择1977/1/1之前出生的人的姓名、技能与E-Mail，相应的XSL文档结构如下（假定生日格式为yyyy/mm/dd）：&nbsp;</P>
<P>&lt;&nbsp;TABLE&nbsp;border="1"&nbsp;cellspacing="0"&nbsp;&gt;</P>
<P>&lt;&nbsp;TH&nbsp;&gt;姓名&lt;&nbsp;/TH&nbsp;&gt;&lt;&nbsp;TH&nbsp;&gt;技能&lt;&nbsp;/TH&nbsp;&gt;&lt;&nbsp;TH&nbsp;&gt;E-Mail&lt;&nbsp;/TH&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;select="resume&nbsp;[&nbsp;birthday&nbsp;$lt$&nbsp;'1977/1/1'&nbsp;]"&nbsp;&gt;</P>
<P>&lt;&nbsp;TR&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="name"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="skill&nbsp;[0]"/&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;select="skill&nbsp;[index()&nbsp;&gt;0]"&nbsp;&gt;、&nbsp;</P>
<P>&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="."/&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:for-each&nbsp;&gt;</P>
<P>&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:<I>value</I>-of&nbsp;select="E-Mail"/&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/TR&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:for-each&nbsp;&gt;</P>
<P>&lt;&nbsp;/TABLE&nbsp;&gt;</P>
<P>说明：&nbsp;</P>
<P>1.&nbsp;birthday&nbsp;$lt$&nbsp;'1977/1/1'&nbsp;──&nbsp;搜索条件，在此处使用&#8220;&lt;&nbsp;&#8221;会错误，故使用&#8220;$lt$&#8221;表示小于。&nbsp;</P>
<P>2.&nbsp;skill&nbsp;[0]&nbsp;───&nbsp;表示选择skill的第一项&nbsp;</P>
<P>3.&nbsp;skill&nbsp;[index()&nbsp;&gt;0]───表示选择skill的第二项以后（包括第二项）的项目&nbsp;</P>
<P>4.&nbsp;xsl:<I>value</I>-of&nbsp;select="."&nbsp;───&nbsp;表示选择当前标记的值</P>
<P>　　相信大家应该注意到，在前面以及本次的例子中出现了一些函数，如index()、formatIndex()、childNumber()，也许大家还不完全明了其中的含义吧？敬请关注下一课。</P>
<P>注：如果拷贝源代码，请将空格删除&nbsp;</P>
<P>跟我学XSL（七）&nbsp;&nbsp;（返回标题）&nbsp;</P>
<P>2000-05-09&#183;&nbsp;禹希初&#183;CPCW</P>
<P>XSL函数一</P>
<P>　　本期学习XSL样式方法，即可用于XSL元素&lt;&nbsp;xsl:for-each&nbsp;&gt;、&lt;&nbsp;xsl:<I>value</I>-of&nbsp;&gt;、&lt;&nbsp;xsl:template&nbsp;&gt;的select属性、&lt;&nbsp;xsl:apply-templates&nbsp;&gt;的match属性、&lt;&nbsp;xsl:if&nbsp;&gt;、&lt;&nbsp;xsl:when&nbsp;&gt;的test属性中，对元素的范围进行筛选，从而提供更大的灵活性。</P>
<P>　　XML与DHTML（动态HTML）一样，这些节点都是一个个对象，而且这些对象都是有层次的，从根节点开始构成一颗层次清淅的树状结构，这就形成了文档对象模型DOM，通过对象的属性、方法来达到访问控制XML节点的目的。</P>
<P>　　我们这里不打算就XML的DOM逐一详细阐述，因为这完全可以写成一个篇幅较多的教程，我们先就一些常见的方法作一些讨论，以期对DOM的对象方法有一个大致的了解。</P>
<P>　　注：从本期开始，所有示例不再提供完整源代码，如有不明白之处，请仔细阅读前面七期、并动手练手。</P>
<P>一、end()</P>
<P>含义：返回集合中最后一个元素。</P>
<P>示例：输出最后一份简历</P>
<P>假定XML文件格式为：</P>
<P>&#8230;&#8230;&lt;&nbsp;resume&nbsp;&gt;&#8230;&lt;&nbsp;/resume&nbsp;&gt;&#8230;&#8230;&lt;&nbsp;resume&nbsp;&gt;&#8230;&lt;&nbsp;/resume&nbsp;&gt;&#8230;&#8230;</P>
<P>相应XSL文件内容为：&nbsp;</P>
<P>&lt;&nbsp;xsl:for-each&nbsp;select="resume[end()]"&nbsp;&gt;&#8230;&#8230;&lt;&nbsp;/xsl:for-each&nbsp;&gt;</P>
<P>或&nbsp;</P>
<P>&lt;&nbsp;xsl:templates&nbsp;match="resume[end()]"&nbsp;&gt;&#8230;&#8230;&lt;&nbsp;/xsl:templates&nbsp;&gt;</P>
<P>或&nbsp;</P>
<P>&lt;&nbsp;xsl:apply-template&nbsp;select="resume[end()]"&nbsp;&gt;&#8230;&#8230;&lt;&nbsp;/xsl:apply-template&nbsp;&gt;</P>
<P>二、index()</P>
<P>含义：返回该元素在集合中的位置，返回值是一整数，其中第一个元素返回0</P>
<P>示例：返回前面三份简历&nbsp;</P>
<P>resume[index()&nbsp;$le$&nbsp;3]</P>
<P>注意：index()是与父元素相关的，请看下例：&nbsp;</P>
<P>&lt;&nbsp;x&nbsp;&gt;</P>
<P>&lt;&nbsp;y/&nbsp;&gt;</P>
<P>&lt;&nbsp;y/&nbsp;&gt;</P>
<P>&lt;&nbsp;/x&nbsp;&gt;</P>
<P>&lt;&nbsp;x&nbsp;&gt;</P>
<P>&lt;&nbsp;y/&nbsp;&gt;</P>
<P>&lt;&nbsp;y/&nbsp;&gt;</P>
<P>&lt;&nbsp;/x&nbsp;&gt;</P>
<P>返回所有&lt;&nbsp;x&nbsp;&gt;中的第一个&lt;&nbsp;y&nbsp;&gt;</P>
<P>x/y[index()=0]&nbsp;或x/y[0]</P>
<P>三、nodeName()</P>
<P>含义：返回元素的名字，即标记名</P>
<P>示例：选择任意元素，假如其名字（即标记名）等于&#8220;name&#8221;</P>
<P>*[nodeName()='name']&nbsp;或&nbsp;*[name]</P>
<P>四、number()</P>
<P>含义：将值转换为数值形式，如果不是数值则返回空，要求参数</P>
<P>示例：年龄(age)小于30岁的人的简历(resume)</P>
<P>resume[number(age)&nbsp;$lt$&nbsp;30]&nbsp;或resume[age&nbsp;$lt$&nbsp;30]</P>
<P>五、nodeType()</P>
<P>含义：返回结点类型，结果为是数值。以下是返回值列表：</P>
<P>结点类型&nbsp;结点类型值&nbsp;结点的字符形式描述&nbsp;</P>
<P>Element&nbsp;1&nbsp;'element'&nbsp;</P>
<P>Element&nbsp;Attribute&nbsp;2&nbsp;'attribute'&nbsp;</P>
<P>Markup-Delimited&nbsp;Region&nbsp;of&nbsp;Text&nbsp;3&nbsp;'text'&nbsp;</P>
<P>Processing&nbsp;Instruction&nbsp;7&nbsp;'processing_instruction'&nbsp;</P>
<P>Comment&nbsp;8&nbsp;'comment'&nbsp;</P>
<P>Document&nbsp;Entity&nbsp;9&nbsp;'document'&nbsp;</P>
<P>六、<I>value</I>()</P>
<P>含义：返回元素或属性的值</P>
<P>示例：<I>value</I>()是元素或属性的缺省方法，以下表示是等价&nbsp;</P>
<P>name!<I>value</I>()="NAME"与name="NAME"</P>
<P>@attr="attribute_<I>value</I>"与@attr="attribute_<I>value</I>"</P>
<P>注：@是属性前缀，@attr表示是属性attr</P>
<P>七、attribute()</P>
<P>含义：返回所有属性结点的集合，等价于&#8220;@*&#8221;</P>
<P>示例：寻找所有的resume元素，满足条件至少有一个属性的值为&#8220;ABC&#8221;</P>
<P>resume[$any$&nbsp;attribute()='ABC']或resume[$any$&nbsp;@*='ABC']</P>
<P>寻找所有的resume元素，满足条件至少有一个子元素有一个属性的值为&#8220;ABC&#8221;</P>
<P>resume[$any$&nbsp;*/attribute()='ABC']或resume[$any$&nbsp;*/@*='ABC']</P>
<P>八、comment()</P>
<P>含义：返回所有注释结点&nbsp;</P>
<P>示例：例如&nbsp;</P>
<P>resume[$any$&nbsp;comment()='禹希初的简历']</P>
<P>表示寻找含有注释语句&nbsp;</P>
<P>&lt;&nbsp;!--禹希初的简历--&nbsp;&gt;</P>
<P>的元素&lt;&nbsp;resume&nbsp;&gt;</P>
<P>九、cdata()</P>
<P>含义：返回所有CDATA类型的结点的集合</P>
<P>示例：例如&nbsp;</P>
<P>resume[$any$&nbsp;cdata()='禹希初的简历']</P>
<P>表示寻找含有下述语句（必须是直接子结点）&nbsp;</P>
<P>&lt;&nbsp;![CDATA[禹希初的简历]]&nbsp;&gt;</P>
<P>的元素&lt;&nbsp;resume&nbsp;&gt;</P>
<P>十、node()</P>
<P>含义：返回当前上下文环境中除根结点和属性结点以外的所有结点的集合，等价于</P>
<P>&#8220;*&nbsp;|&nbsp;pi()&nbsp;|&nbsp;comment()&nbsp;|&nbsp;text()&#8221;</P>
<P>示例：寻找所有元素resume，其最后一个结点的名字为"skill"</P>
<P>resume[node()[end()]!nodeName()='skill']</P>
<P>寻找所有resume元素的第一个结点：resume/node()[0]</P>
<P>十一、textnode()</P>
<P>含义：返回所有文本类型的结点的集合</P>
<P>示例：寻找每一个p元素的第二个文本结点&nbsp;</P>
<P>p/textnode(1)或p!textnode(1)</P>
<P>十二、text()</P>
<P>含义：返回所有表示文本字符串的结点的集合，等价于"cdata()|textnode()"；</P>
<P>　　本期的内容就介绍至此，另有一个函数date()在本人的机器上一试就发生错误使浏览器自动关闭，还有一个函数pi()本人尚未找到适当的应用方法，就不介绍了，下期将讲述如何XSL中使用脚本。</P>
<P>跟我学XSL（八）&nbsp;&nbsp;（返回标题）&nbsp;</P>
<P>2000-05-10&#183;&nbsp;禹希初&#183;CPCW</P>
<P>脚本与XSL的结合及应用</P>
<P>有时，我们可能会希望XML文档输出时能对其中内容加上一些统计信息或者如编号什么，利用前面的知识就不太容易实现了。今天将介绍两个新元素&lt;&nbsp;xsl:eval&nbsp;&gt;与&lt;&nbsp;xsl:script&nbsp;&gt;，使我们能轻松处理这个难题。&nbsp;</P>
<P>&lt;&nbsp;xsl:eval&nbsp;&gt;</P>
<P>含义：&nbsp;</P>
<P>计算脚本表达式，输出一个文本字符串&nbsp;</P>
<P>语法：&nbsp;</P>
<P>&lt;&nbsp;xsl:eval&nbsp;language="language-name"&nbsp;&gt;</P>
<P>属性：&nbsp;</P>
<P>language&nbsp;──&nbsp;规定所用脚本语言的名字，可用的属性有&#8220;<I>javascript</I>&#8221;、&#8220;JScript&#8221;、&#8220;VBScript&#8221;、&#8220;VBS&#8221;等，缺省为&#8220;JScript&#8221;。&nbsp;</P>
<P>&lt;&nbsp;xsl:script&nbsp;&gt;</P>
<P>含义：&nbsp;</P>
<P>声明全局变量或定义函数。&nbsp;</P>
<P>语法：&nbsp;</P>
<P>&lt;&nbsp;xsl:script&nbsp;language="language-name"&nbsp;&gt;</P>
<P>属性：</P>
<P>同&lt;&nbsp;xsl:eval&nbsp;&gt;</P>
<P>示例：</P>
<P>　　不知大家对于第四期《跟我学XML》中的例子是否还有印象？其中的XML文档并没有对简历编号，但输出中却加上了大写的罗马数字序号。今天将再举一稍为复杂一些的例子：</P>
<P>　　假如我们编写一份年终生产统计表，其中需要小计一项，常规的作法是事先将其算出来，现在不必了，我们可以只给出单项统计，显示时再统计小计一项。请找出《跟我学XML》的第五期，XML文件不必修改，对XSL文件的修改如下：&nbsp;</P>
<P>&#8230;&#8230;&nbsp;</P>
<P>&lt;&nbsp;xsl:template&nbsp;match="document"&nbsp;&gt;</P>
<P>&#8230;&#8230;&nbsp;</P>
<P>&lt;&nbsp;xsl:apply-templates&nbsp;select="report"/&nbsp;&gt;</P>
<P>&lt;&nbsp;TR&nbsp;&gt;&lt;&nbsp;TD&nbsp;&gt;小计&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:eval&nbsp;&gt;total(this,"q1")&lt;&nbsp;/xsl:eval&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:eval&nbsp;&gt;total(this,"q2")&lt;&nbsp;/xsl:eval&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:eval&nbsp;&gt;total(this,"q3")&lt;&nbsp;/xsl:eval&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;TD&nbsp;&gt;&lt;&nbsp;xsl:eval&nbsp;&gt;total(this,"q4")&lt;&nbsp;/xsl:eval&nbsp;&gt;&lt;&nbsp;/TD&nbsp;&gt;</P>
<P>&lt;&nbsp;/TR&nbsp;&gt;</P>
<P>&lt;&nbsp;/TABLE&nbsp;&gt;</P>
<P>&lt;&nbsp;xsl:script&nbsp;&gt;</P>
<P>function&nbsp;total(node,q){</P>
<P>temp=0;&nbsp;</P>
<P>mark='/document/report/'+q;</P>
<P>v=node.selectNodes(mark);</P>
<P>for(t=v.nextNode();t;t=v.nextNode()){</P>
<P>temp+=Number(t.text);</P>
<P>}</P>
<P>return&nbsp;temp;&nbsp;//小计值&nbsp;</P>
<P>}&nbsp;</P>
<P>&lt;&nbsp;/xsl:script&nbsp;&gt;</P>
<P>&lt;&nbsp;/xsl:template&nbsp;&gt;</P>
<P>说明：</P>
<P>　　黑体部分为添加部分，注意添加部分分为两部分，&lt;&nbsp;xsl:script&nbsp;&gt;&lt;&nbsp;/xsl:script&nbsp;&gt;必须置于&lt;&nbsp;/TABLE&nbsp;&gt;之后，切记。&nbsp;</P>
<P>selectNodes()&nbsp;──&nbsp;是XMLDOMObject的一个方法，返回文档中所有满足条件的结点的集合，条件与&lt;&nbsp;xsl:for-each&nbsp;&gt;和select属性的取值采用同样的写法，可以加筛选、下标等限制，如：</P>
<P>寻找一季度产量大于等于50的班组&nbsp;</P>
<P>/document/report/q1[<I>value</I>()&nbsp;$ge$&nbsp;50]</P>
<P>以上写法还有一个更简单的写法&nbsp;</P>
<P>//q1[<I>value</I>()&nbsp;$ge$&nbsp;50]</P>
<P>//表示从根结点出发遍历所有结点，寻找满足条件的结点，如果文档内有同名但意义不同的结点则不能用此种方法，非不得已不建议使用。以此为例，如果希望统计年总产量，则可以下述字符串寻找结点（建议使用最后一种，此种描述将精确找到需要汇总的数据）&nbsp;</P>
<P>//*[<I>value</I>()&nbsp;$gt$&nbsp;0]</P>
<P>或&nbsp;</P>
<P>//(q1|q2|q3|q4)</P>
<P>或&nbsp;</P>
<P>/document/report/(q1|q2|q3|q4)</P>
<P>nextNode()&nbsp;──&nbsp;返回结点集中的下一个结点&nbsp;</P>
<P>Number()&nbsp;──&nbsp;将提供的参数转换为数值</P>
<P>　　下期介绍XSL函数2，用于&lt;&nbsp;xsl:script&nbsp;&gt;及&lt;&nbsp;xsl:eval&nbsp;&gt;中，以及&lt;&nbsp;xsl:if&nbsp;&gt;和&lt;&nbsp;xsl:when&nbsp;&gt;的expr属性。建议读者熟悉<I>javascript</I>、JScript、VBScript中至少一种，否你能用XSL完成的工作将十分有限。由于篇幅关系，此处不作详细介绍。&nbsp;</P>
<P>注：如果拷贝源代码，请将空格删除&nbsp;</P>
<P>XLink介绍&nbsp;</P>
<P>2000-03-02&#183;&nbsp;蔡依纯&nbsp;译&#183;中文XML</P>
<P>　　如果在这个世界上每部电脑中的每个资料块都能够被识别、定址及连结，那将是多么令人振奋的事呢!Xink就是说明如何在网络上做到这点的规格文件。</P>
<P>　　HTML的连结</P>
<P>　　由於WWW的风行，大部分的人都熟悉超文字连结的基本观念，亦即是&#8220;一个连结具有两个端点及一个方向，两个端点我们通常称为Anchor。这个连结可以从一个起点连到任何一个网路资源的目标点，这些连结可能是一张图片，一卷影片，一段声音，一个程式，一篇HTML的文件，或其中的元素等等&#8221;。</P>
<P>　　假如你常使用浏览器，你一定会知道，当你在连结上按滑鼠的右键时，就会出现一个选单，而其中一个选择是&#8220;在新视窗开启&#8221;。</P>
<P>　　在HTML中，对於这些连结都是用一个「Anchor」的标志所做成。</P>
<P>　　如果你是撰写HTML的高手，你一定知道在head标志里有个特别的标志叫做link，它提供了多种的连结功能：比方像是连结到样式表（新的浏览器会提供使用者多一点选择，让其自行选择使用哪一个样式表），或是连结到有音乐的地方（当下载完毕後可自动地播放），抑或是连结到另一个网页（可使浏览器预先载入该网页，以省去等待的时间）等。</P>
<P>　　以上所描述的都是连结的功能，事实上，有很多其他的超文字连结功能是HTML没有办法做到的，即使如早期（1960年末至1970年初期）的超文字连结系统所提供的连结功能，HTML亦没办法做到。然而，HTML之所以会成功，是因为它使用最简单的方式去使用超连结，而且使用者并不　要特别的编辑器（Editor）便可制作网页。</P>
<P>　　多用途的连结！</P>
<P>　　有时当我们看到「连结」时，我们发现其实它看起并不像是连结，但事实上，为什么呢？许多的事物包括电子化地址、识别字、位址或是查询等，都可以有连结这个动作。当你想到两个资料间有&#8220;relationship&#8221;、&#8220;role&#8221;、&#8220;pointer&#8221;或是&#8220;has&nbsp;a&#8221;等关联性时，在XML（eXtensibleMarkupLanguage）中我们可以用「连结」的方法来加以标示。</P>
<P>　　读者们应有一个观念，在HTML4.0规格中，所定义的超文字连结标准，并不是就是连结的所有特性，所以在这里我们将对连结做更清楚的定义：</P>
<P>　　1.一个连结可以有一个、二个甚至是很多个ends，而每一个end都可以是指标，事实上连结本身可以很明确地指定是外部（externally）连结，因而连接到每一个end。</P>
<P>　　2.一个连结并不　一定要有方向，但它也可以有很多或是没有方向，除此之外，连结的方向不　要一定得从&#8220;context&#8221;到&#8220;part&#8221;才行。</P>
<P>　　3.连结的end可以是某一范围，不一定是要连结到整个resource或某一地方。</P>
<P>　　4.连结点的表现方式乃视连结资料的角色而定，「撷取」和「取代」只是可能性的行为之一。是故，使用者设定连结为撷取资料并取代画面只是连结功能的表现之一。</P>
<P>　　XML连结对我们有什么用呢？简言之，像是资料模型化、资料交换、超文字连结或是任何不同关系的资料型态上，都可以派上用场。</P>
<P>　　XLinks有一重要功能就是建立「topicmaps」，这是一种依据metadata连结到种种不同网路资源的方式。Topicmaps允许不同的资料有外在的注解（External&nbsp;Annotation）。因此，我们可以说Topicmaps是有结构性的metadata，而依据各特性关联主题，可以连结到不同的网路资源。</P>
<P>　　XLinks</P>
<P>XLink定义了几种常用的连结型态：Simple、Extended、Group和Document。&nbsp;</P>
<P>1.Simple的用法比较接近在HTML内a标志的用法（如下HTML的写法所示）。&nbsp;</P>
<P>2.Extended的用法包含arc和locator的元素，并允许各种种类的扩充连结。&nbsp;</P>
<P>3.Group和document的用法，是让群组连结到一些特别的文件。</P>
<P>以下我们将说明Simple的语法，有两种方法可以知道一个连结是否是Xlink：&nbsp;</P>
<P>1.直接使用simple字眼；&nbsp;</P>
<P>2.以xlink：type表示。</P>
<P>让我们来看看下面Simple的例子：&nbsp;</P>
<P>1.以HTML的写法如下：&nbsp;</P>
<P>2.以Xlink的写法：</P>
<P>　　同样一个连结，另一种Xlink也可以写成：</P>
<P>　　xmlns：xlink属性是一个名称　域（Namespaces）宣告的例子，而所谓的名称　域，是方便使用者同时使用数个文件型别宣告（Document&nbsp;TypeDeclaration）之机制，至於这样的做法，我们相信在未来之HTML版本中，也会朝这一方向努力。</P>
<P>　　也许我们觉得很奇怪，为什么这些arcs会接在一起，而形成extendedlink呢？有些人可能比较喜欢（图二）的写法，因为这种连结并没有&#8220;from&#8221;和&#8220;to&#8221;，只有href的地址。</P>
<P>　　在locator的定义中包含两个原性：href和role。href属性包含URL，role属性则包含了如何去使用连结的关键字。</P>
<P>　　Xlink扩展了URIs的使用，其中actuate和show对於Xlink来说是非常重要的属性，原因如下：</P>
<P>　　1.actuate的属性可以说明Link是自动地或人工地(user-command)追踪。</P>
<P>　　2.show的属性说明另一端的连结是　要显示一个新（new）的视窗,或是取代（replace）成目前的视窗，或是　要剖析的（若该连结连结到XML文件）。</P>
<P>　　对于HTML的高手来说，上述href属性的用法较不平常，这是因为含有查询条件的正确URL，而它的主要目的是查询文件。</P>
<P>　　这一种URL使用了一个很特别的语法，就是在URL之前放问号（？）来查询，许多指向资料库的连结都用这个技巧。</P>
<P>　　W3C正在发展中的Xpointer是一种特殊的查询，也是Xlink推展的一部份。Xpointer的语法是?xptr=加上XML&nbsp;PathExpression【像是id（phone2）】。从上面的例子中看来，id指到唯一识别字phone2。（这个跟xlink:arc的from和to的用意一样）。&nbsp;</P>
<P>XMLPathExpression可让我们以不同种类的标准来选择某一元素树状结构式（Elementtreeofstructure&nbsp;data）特殊分枝。<BR><BR><BR>转载自：<A href="http://bbs.xml.org.cn/dispbbs.asp?boardID=8&amp;ID=6411">http://bbs.xml.org.cn/dispbbs.asp?boardID=8&amp;ID=6411</A></P></DIV></DIV><img src ="http://www.cnblogs.com/luckyzmw/aggbug/327414.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47957/" target="_blank">乔布斯和埃利森</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>