亚洲国产婷婷六月丁香,亚洲国产精品一区二区成人片国内,亚洲A∨精品一区二区三区http://m.tkk7.com/haogj/category/8076.htmlzh-cnThu, 01 Mar 2007 13:30:30 GMTThu, 01 Mar 2007 13:30:30 GMT60 ANT十五大最佳實(shí)踐 http://m.tkk7.com/haogj/archive/2006/04/24/42892.htmlhaogjhaogjMon, 24 Apr 2006 13:19:00 GMThttp://m.tkk7.com/haogj/archive/2006/04/24/42892.htmlhttp://m.tkk7.com/haogj/comments/42892.htmlhttp://m.tkk7.com/haogj/archive/2006/04/24/42892.html#Feedback1http://m.tkk7.com/haogj/comments/commentRss/42892.htmlhttp://m.tkk7.com/haogj/services/trackbacks/42892.html ?
?ANT十五大最佳實(shí)踐

在Ant出現(xiàn)之前,構(gòu)建和部署Java應(yīng)用需要使用包括特定平臺的腳本、Make文件、各種版本的IDE甚至手工操作的“大雜燴”。現(xiàn)在,幾乎所有的開源Java項(xiàng)目都在使用Ant,大多數(shù)公司的內(nèi)部項(xiàng)目也在使用Ant。Ant在這些項(xiàng)目中的廣泛使用自然導(dǎo)致了讀者對一整套Ant最佳實(shí)踐的迫切需求。

本文總結(jié)了我喜愛的Ant技巧或最佳實(shí)踐,多數(shù)是從我親身經(jīng)歷的項(xiàng)目錯(cuò)誤或我聽說的其他人經(jīng)歷的 “恐怖”故事中得到靈感的。比如,有人告訴我有個(gè)項(xiàng)目把XDoclet 生成的代碼放入帶有鎖定文件功能的版本控制工具中。當(dāng)開發(fā)者修改源代碼時(shí),他必須記住手工檢出(Check out)并鎖定所有將要重新生成的文件。然后,手工運(yùn)行代碼生成器,只到這時(shí)他才能夠讓Ant編譯代碼,這一方法還存在如下一些問題:

  • 生成的代碼無法存儲在版本控制系統(tǒng)中。
  • Ant(本案例中是Xdoclet)應(yīng)該自動(dòng)確定下一次構(gòu)建涉及的源文件,而不應(yīng)由程序員手工確定。
  • Ant的構(gòu)建文件應(yīng)該定義好正確的任務(wù)依賴關(guān)系,這樣程序員就不必為了完成構(gòu)建而不得不按照特定順序調(diào)用任務(wù)。

當(dāng)我開始一個(gè)新項(xiàng)目時(shí),我首先編寫Ant構(gòu)建文件。Ant文件明確地定義構(gòu)建的過程,并被團(tuán)隊(duì)中的每個(gè)程序員使用。本文所列的技巧基于這樣的假定:Ant構(gòu)建文件是一個(gè)必須仔細(xì)編寫的重要文件,它應(yīng)在版本控制系統(tǒng)中得到維護(hù),并被定期進(jìn)行重構(gòu)。下面是我的十五大Ant最佳實(shí)踐。

1. 采用一致的編碼規(guī)范

Ant用戶有的喜歡有的痛恨其構(gòu)建文件的XML語法。與其跳進(jìn)這一令人迷惑的爭論中,不如讓我們先看一些能保持XML構(gòu)建文件簡潔的方法。

首先也是最重要的,花費(fèi)時(shí)間格式化你的XML讓它看上去很清晰。不論XML是否美觀,Ant都可以工作。但是丑陋的XML很難令人讀懂。倘若你在任務(wù)之間留出空行,有規(guī)則的縮進(jìn),每行文字不超過90列左右,那么XML令人驚訝地易讀。再加上使用能夠高亮XML語法的優(yōu)秀編輯器或IDE工具,你就不會有閱讀的麻煩。

同樣,精選含意明確、容易讀懂的詞匯來命名任務(wù)和屬性。比如,dir.reports就比rpts特定的編碼規(guī)范并不重要,只要拿出一套規(guī)范并堅(jiān)持使用就行。

2. 將build.xml放在項(xiàng)目根目錄中

Ant構(gòu)建文件build.xml可以放在任何位置,但是放在項(xiàng)目頂級目錄中可以保持項(xiàng)目簡潔。這是最常用的規(guī)范,開發(fā)者能夠在頂級目錄中找到預(yù)期的build.xml。把構(gòu)建文件放在根目錄中,也能夠使人容易了解項(xiàng)目目錄樹中不同目錄之間的邏輯關(guān)系。以下是一個(gè)典型的項(xiàng)目目錄層次:

[root dir]
? | build.xml?
? +--src?
? +--lib (包含第三方 JAR包)?
? +--build (由 build任務(wù)生成)?
? +--dist (由 build任務(wù)生成)

當(dāng)build.xml在頂級目錄時(shí),假設(shè)你處于項(xiàng)目某個(gè)子目錄中,只要輸入:ant -find compile 命令,不需要改變工作目錄就能夠以命令行方式編譯代碼。參數(shù)-find告訴Ant尋找存在于上級目錄中的build.xml并執(zhí)行。

3. 使用單一的構(gòu)建文件

有人喜歡將一個(gè)大項(xiàng)目分解成幾個(gè)小的構(gòu)建文件,每個(gè)構(gòu)建文件分擔(dān)整個(gè)構(gòu)建過程的一小部分工作。這確實(shí)是看法不同的問題,但是應(yīng)該認(rèn)識到,將構(gòu)建文件分割會增加對整體構(gòu)建過程的理解難度。要注意在單一構(gòu)建文件能夠清楚表現(xiàn)構(gòu)建層次的情況下不要過工程化(over-engineer)。

即使你把項(xiàng)目劃分為多個(gè)構(gòu)建文件,也應(yīng)使程序員能夠在項(xiàng)目根目錄下找到核心build.xml。盡管該文件只是將實(shí)際構(gòu)建工作委派給下級構(gòu)建文件,也應(yīng)保證該文件可用。

4. 提供良好的幫助說明

應(yīng)盡量使構(gòu)建文件自文檔化。增加任務(wù)描述是最簡單的方法。當(dāng)你輸入ant -projecthelp時(shí),你就可以看到帶有描述的任務(wù)清單。比如,你可以這樣定義任務(wù):

<target name="compile" ?
?? description="Compiles code, output goes to the build dir.">

最簡單的規(guī)則是把所有你想讓程序員通過命令行就可以調(diào)用的任務(wù)都加上描述。對于一般用來執(zhí)行中間處理過程的內(nèi)部任務(wù),比如生成代碼或建立輸出目錄等,就無法使用描述屬性。

這時(shí),可以通過在構(gòu)建文件中加入XML注釋來處理。或者專門定義一個(gè)help任務(wù),當(dāng)程序員輸入ant help時(shí)來顯示詳細(xì)的使用說明。

<target name="help" description="Display detailed usage information">
? <echo>Detailed help...</echo></target>

5. 提供清除任務(wù)

每個(gè)構(gòu)建文件都應(yīng)包含一個(gè)清除任務(wù),用來刪除所有生成的文件和目錄,使系統(tǒng)回到構(gòu)建文件執(zhí)行前的初始狀態(tài)。執(zhí)行清空任務(wù)后還存在的文件都應(yīng)處在版本控制系統(tǒng)的管理之下。比如:

<target name="clean"
????description="Destroys all generated files and dirs.">
? <delete dir="${dir.build}"/>
? <delete dir="${dir.dist}"/>
</target>

除非是在產(chǎn)生整個(gè)系統(tǒng)版本的特殊任務(wù)中,否則不要自動(dòng)調(diào)用clean任務(wù)。當(dāng)程序員僅僅執(zhí)行編譯任務(wù)或其他任務(wù)時(shí),他們不需要構(gòu)建文件事先執(zhí)行既令人討厭又沒有必要的清空任務(wù)。要相信程序員能夠確定何時(shí)需要清空所有文件。

6. 使用ANT管理任務(wù)從屬關(guān)系

假設(shè)你的應(yīng)用由Swing GUI組件、Web界面、EJB層和公共應(yīng)用代碼組成。在大型系統(tǒng)中,你需要清晰地定義每個(gè)Java包屬于系統(tǒng)的哪一層。否則任何一點(diǎn)修改都要被迫重新編譯成百上千個(gè)文件。糟糕的任務(wù)從屬關(guān)系管理會導(dǎo)致過度復(fù)雜而脆弱的系統(tǒng)。改變GUI面板的設(shè)計(jì)不應(yīng)造成Servlet和EJB的重編譯。

當(dāng)系統(tǒng)變得龐大后,稍不注意就可能將依賴于客戶端的代碼引入到服務(wù)端。這是因?yàn)榈湫偷腎DE項(xiàng)目文件編譯任何文件都使用單一的classpath。而Ant能讓你更有效地控制構(gòu)建活動(dòng)。

設(shè)計(jì)你的Ant構(gòu)建文件編譯大型項(xiàng)目的步驟:首先,編譯公共應(yīng)用代碼,將編譯結(jié)果打成JAR包文件。然后,編譯上一層的項(xiàng)目代碼,編譯時(shí)依靠第一步產(chǎn)生的JAR文件。不斷重復(fù)這一過程,直到最高層的代碼編譯完成。

分步構(gòu)建強(qiáng)化了任務(wù)從屬關(guān)系管理。如果你工作在底層Java框架上,偶然引用到高層的GUI模板組件,這時(shí)代碼不需要編譯。這是由于構(gòu)建文件在編譯底層框架時(shí)在源路徑中沒有包含高層GUI面板組件的代碼。

7. 定義并重用文件路徑

如果文件路徑在一個(gè)地方一次性集中定義,并在整個(gè)構(gòu)建文件中得到重用,那么構(gòu)建文件更易于理解。以下是這樣做的一個(gè)例子:

<project name="sample" default="compile" basedir=".">
? <path id="classpath.common">
??? <pathelement location="${jdom.jar.withpath}"/>
??? ...etc? </path>
? <path id="classpath.client">
??? <pathelement location="${guistuff.jar.withpath}"/>
??? <pathelement location="${another.jar.withpath}"/>
??? <!-- reuse the common classpath -->
??? <path refid="classpath.common"/>
? </path>
? <target name="compile.common" depends="prepare">
??? <javac destdir="${dir.build}" srcdir="${dir.src}">
????????? <classpath refid="classpath.common"/>
????????? <include name="com/oreilly/common/**"/>
??? </javac>
? </target>
</project>

當(dāng)項(xiàng)目不斷增長構(gòu)建日益復(fù)雜時(shí),這一技術(shù)越發(fā)體現(xiàn)出其價(jià)值。你可能需要為編譯不同層次的應(yīng)用定義各自的文件路徑,比如運(yùn)行單元測試的、運(yùn)行應(yīng)用程序的、運(yùn)行Xdoclet的、生成JavaDocs的等等不同路徑。這種組件化路徑定義的方法比為每個(gè)任務(wù)單獨(dú)定義路徑要優(yōu)越得多。否則,很容易丟失任務(wù)從屬關(guān)系的軌跡。

8. 定義恰當(dāng)?shù)娜蝿?wù)從屬關(guān)系

假設(shè)dist任務(wù)從屬于jar任務(wù),那么哪個(gè)任務(wù)從屬于compile任務(wù)哪個(gè)任務(wù)從屬于prepare任務(wù)呢?Ant構(gòu)建文件最終定義了任務(wù)的從屬關(guān)系圖,它必須被仔細(xì)地定義和維護(hù)。

應(yīng)該定期檢查任務(wù)的從屬關(guān)系以保證構(gòu)建工作得到正確執(zhí)行。大的構(gòu)建文件隨著時(shí)間推移趨向于增加更多的任務(wù),所以到最后可能由于不必要的從屬關(guān)系導(dǎo)致構(gòu)建工作非常困難。比如,你可能發(fā)現(xiàn)在程序員只需編譯一些沒有使用EJB的GUI代碼時(shí)又重新生成了EJB代碼。

以“優(yōu)化”的名義忽略任務(wù)的從屬關(guān)系是另一種常見的錯(cuò)誤。這種錯(cuò)誤迫使程序員為了得到恰當(dāng)?shù)慕Y(jié)果必須記住并按照特定的順序調(diào)用一串任務(wù)。更好的做法是:提供描述清晰的公共任務(wù),這些任務(wù)包含正確的任務(wù)從屬關(guān)系;另外提供一套“專家”任務(wù)讓你能夠手工執(zhí)行個(gè)別的構(gòu)建步驟,這些任務(wù)不提供完整的構(gòu)建過程,但是讓那些專家用戶在快速而惱人的編碼期間能夠跳過某些步驟。

9.使用屬性

任何需要配置或可能發(fā)生變化的信息都應(yīng)作為Ant屬性定義下來。對于在構(gòu)建文件中多次出現(xiàn)的值也同樣處理。屬性既可以在構(gòu)建文件頭部定義,也可以為了更好的靈活性而在單獨(dú)的屬性文件中定義。以下是在構(gòu)建文件中定義屬性的樣式:

<project name="sample" default="compile" basedir=".">
? <property name="dir.build" value="build"/>
? <property name="dir.src" value="src"/>
? <property name="jdom.home" value="../java-tools/jdom-b8"/>
? <property name="jdom.jar" value="jdom.jar"/>
? <property name="jdom.jar.withpath"
????????????????????value="${jdom.home}/build/${jdom.jar}"/>
??? etc...
</project>

或者你可以使用屬性文件:

<project name="sample" default="compile" basedir=".">
? <property file="sample.properties"/>
?? etc...
</project>

在屬性文件 sample.properties中:

dir.build=build
dir.src=src
jdom.home=../java-tools/jdom-b8
jdom.jar=jdom.jarjdom.jar.withpath=${jdom.home}/build/${jdom.jar}

用一個(gè)獨(dú)立的文件定義屬性是有好處的,它可以清晰地定義構(gòu)建中的可配置部分。另外,在開發(fā)者工作在不同操作系統(tǒng)的情況下,你可以在不同的平臺上提供該文件的不同版本。

10. 保持構(gòu)建過程獨(dú)立

為了最大限度的擴(kuò)展性,不要應(yīng)用外部路徑和庫文件。最重要的是不要依賴于程序員的CLASSPATH設(shè)置。取而代之的是,在構(gòu)建文件中使用相對路徑并定義自己的路徑。如果你引用了絕對路徑如C:\java\tools,其他開發(fā)者未必使用與你相同的目錄結(jié)構(gòu),所以就無法使用你的構(gòu)建文件。

如果你部署開放源碼項(xiàng)目,應(yīng)該提供包含編譯代碼所需的所有JAR文件的發(fā)行版本。當(dāng)然,這是在遵守許可協(xié)議的基礎(chǔ)上。對于內(nèi)部項(xiàng)目,相關(guān)的JAR文件都應(yīng)在版本控制系統(tǒng)的管理中,并撿出(check out)到大家都知道的位置。

當(dāng)你必須引用外部路徑時(shí),應(yīng)將路徑定義為屬性。使程序員能夠用適合他們自己的機(jī)器環(huán)境的參數(shù)重載這些屬性。你也可以使用以下語法引用環(huán)境變量:

<property environment="env"/>
<property name="dir.jboss" value="${env.JBOSS_HOME}"/>

11. 使用版本控制系統(tǒng)

構(gòu)建文件是一個(gè)重要的制品,應(yīng)該像代碼一樣進(jìn)行版本控制。當(dāng)你標(biāo)記你的代碼時(shí),也應(yīng)用同樣的標(biāo)簽標(biāo)記構(gòu)建文件。這樣當(dāng)你需要回溯到舊版本并進(jìn)行構(gòu)建時(shí),能夠使用相應(yīng)版本的構(gòu)建文件。

除構(gòu)建文件之外,你還應(yīng)在版本控制中維護(hù)第三方JAR文件。同樣,這使你能夠重新構(gòu)建舊版本的軟件。這也能夠更容易保證所有開發(fā)者擁有一致的JAR文件,因?yàn)樗麄兌际峭瑯?gòu)建文件一起從版本控制系統(tǒng)中撿出的。

通常應(yīng)避免在版本控制系統(tǒng)中存放構(gòu)建成果。倘若你的源代碼很好地得到了版本控制,那么通過構(gòu)建過程你能夠重新生成任何版本的產(chǎn)品。

12. 把Ant作為“最小公分母”

假設(shè)你的開發(fā)團(tuán)隊(duì)使用IDE工具,當(dāng)程序員通過點(diǎn)擊圖標(biāo)就能夠構(gòu)建整個(gè)應(yīng)用時(shí)為什么還要為Ant而煩惱呢?

IDE的問題是一個(gè)關(guān)于團(tuán)隊(duì)一致性和重現(xiàn)性的問題。幾乎所有的IDE設(shè)計(jì)初衷都是為了提高程序員的個(gè)人生產(chǎn)率,而不是開發(fā)團(tuán)隊(duì)的持續(xù)構(gòu)建。典型的IDE要求每個(gè)程序員定義自己的項(xiàng)目文件。程序員可能擁有不同的目錄結(jié)構(gòu),可能使用不同版本的庫文件,還可能工作在不同的平臺上。這將導(dǎo)致出現(xiàn)這種情況:在Bob那里運(yùn)行良好的代碼,到Sally那里就無法運(yùn)行。

不管你的開發(fā)團(tuán)隊(duì)使用何種IDE,一定要建立所有程序員都能夠使用的Ant構(gòu)建文件。要建立一個(gè)程序員在將新代碼提交版本控制系統(tǒng)前必須執(zhí)行Ant構(gòu)建文件的規(guī)則。這將確保代碼是經(jīng)過同一個(gè)Ant構(gòu)建文件構(gòu)建的。當(dāng)出現(xiàn)問題時(shí),要使用項(xiàng)目標(biāo)準(zhǔn)的Ant構(gòu)建文件,而不是通過某個(gè)IDE來執(zhí)行一個(gè)干凈的構(gòu)建。

程序員可以自由選擇任何他們習(xí)慣使用的IDE工具或編輯器。但是Ant應(yīng)作為公共基線以保證代碼永遠(yuǎn)是可構(gòu)建的。

13. 使用zipfileset屬性

人們經(jīng)常使用Ant產(chǎn)生WAR、JAR、ZIP和 EAR文件。這些文件通常都要求有一個(gè)特定的內(nèi)部目錄結(jié)構(gòu),但其往往與你的源代碼和編譯環(huán)境的目錄結(jié)構(gòu)不匹配。

一個(gè)最常用的方法是寫一個(gè)Ant任務(wù),按照期望的目錄結(jié)構(gòu)把一大堆文件拷貝到臨時(shí)目錄中,然后生成壓縮文件。這不是最有效的方法。使用zipfileset屬性是更好的解決方案。它讓你從任何位置選擇文件,然后把它們按照不同目錄結(jié)構(gòu)放進(jìn)壓縮文件中。以下是一個(gè)例子:

<ear earfile="${dir.dist.server}/payroll.ear"
??? appxml="${dir.resources}/application.xml">
? <fileset dir="${dir.build}" includes="commonServer.jar"/>
? <fileset dir="${dir.build}">
??? <include name="payroll-ejb.jar"/>
? </fileset>
? <zipfileset dir="${dir.build}" prefix="lib">
? ??<include name="hr.jar"/>
??? <include name="billing.jar"/>
? </zipfileset>
? <fileset dir=".">
??? <include name="lib/jdom.jar"/>
??? <include name="lib/log4j.jar"/>
??? <include name="lib/ojdbc14.jar"/>
? </fileset>
? <zipfileset dir="${dir.generated.src}" prefix="META-INF">
??? <include name="jboss-app.xml"/>
? </zipfileset>
</ear>

在這個(gè)例子中,所有JAR文件都放在EAR文件包的lib目錄中。hr.jar和billing.jar是從構(gòu)建目錄拷貝過來的。因此我們使用zipfileset屬性把它們移動(dòng)到EAR文件包內(nèi)部的lib目錄。prefix屬性指定了其在EAR文件中的目標(biāo)路徑。

14. 測試Clean任務(wù)

假設(shè)你的構(gòu)建文件中有clean和compile的任務(wù),執(zhí)行以下的測試。第一步,執(zhí)行ant clean;第二步,執(zhí)行ant compile;第三步,再執(zhí)行ant compile。第三步應(yīng)該不作任何事情。如果文件再次被編譯,說明你的構(gòu)建文件有問題。

構(gòu)建文件應(yīng)該只在與輸出文件相關(guān)聯(lián)的輸入文件發(fā)生變化時(shí)執(zhí)行任務(wù)。一個(gè)構(gòu)建文件在不必執(zhí)行諸如編譯、拷貝或其他工作任務(wù)的時(shí)候執(zhí)行這些任務(wù)是低效的。當(dāng)項(xiàng)目規(guī)模增長時(shí),即使是小的低效工作也會成為大的問題。

15. 避免特定平臺的Ant封裝

不管什么原因,有人喜歡用簡單的、名稱叫做compile之類的批文件或腳本裝載他們的產(chǎn)品。當(dāng)你去看腳本的內(nèi)容你會發(fā)現(xiàn)以下內(nèi)容:

ant compile

其實(shí)開發(fā)人員都很熟悉Ant,并且完全能夠自己鍵入ant compile。請不要僅僅為了調(diào)用Ant而使用特定平臺的腳本。這只會使其他人在首次使用你的腳本時(shí)增加學(xué)習(xí)和理解的煩擾。除此之外,你不可能提供適用于每個(gè)操作系統(tǒng)的腳本,這是真正煩擾其他用戶的地方。

總結(jié)

太多的公司依靠手工方法和特別程序來編譯代碼和生成軟件發(fā)布版本。那些不使用Ant或類似工具定義構(gòu)建過程的開發(fā)團(tuán)隊(duì),花費(fèi)了太多的時(shí)間來捕捉代碼編譯過程中出現(xiàn)的問題:在某些開發(fā)者那里編譯成功的代碼,到另一些開發(fā)者那里卻失敗了。

生成并維護(hù)構(gòu)建腳本不是一項(xiàng)富有魅力的工作,但卻是一項(xiàng)必需的工作。一個(gè)好的Ant構(gòu)建文件將使你能夠集中到更喜歡的工作——寫代碼中去!

參考



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=675230



haogj 2006-04-24 21:19 發(fā)表評論
]]>
xml中的空格之完全解說http://m.tkk7.com/haogj/archive/2006/04/11/40523.htmlhaogjhaogjTue, 11 Apr 2006 13:40:00 GMThttp://m.tkk7.com/haogj/archive/2006/04/11/40523.htmlhttp://m.tkk7.com/haogj/comments/40523.htmlhttp://m.tkk7.com/haogj/archive/2006/04/11/40523.html#Feedback0http://m.tkk7.com/haogj/comments/commentRss/40523.htmlhttp://m.tkk7.com/haogj/services/trackbacks/40523.htmlxml中的空格之完全解說
轉(zhuǎn)載自:http://www.knowsky.com/3123.html
轉(zhuǎn)自:動(dòng)態(tài)網(wǎng)制作指南 www.knowsky.com 
提示:我提取了《xslt從入門到精通》中關(guān)于空格解釋的核心部分,借以拋磚引玉,希望大家踴躍參與討論。談?wù)勀銓崭竦睦斫狻?

只適合對xml文件結(jié)構(gòu)有一定了解的學(xué)者,不適合初學(xué)者。請按從上至下的順序閱讀。


對html文件而言,空格不重要;然而,對xml而言,默認(rèn)立場就是要保留空格結(jié)點(diǎn)(空格結(jié)點(diǎn)的解釋見下文)。


根據(jù)xml規(guī)范的規(guī)定,所謂空格是四種字符的任意組合序列:
-----------------------
空格字符(space),對應(yīng)字符值為 #x20
回車字符(Carriage Return),對應(yīng)字符值為 #xD
換行字符(Newline),對應(yīng)字符值為 #xA
制表字符(Tab),對應(yīng)字符值為 #x9。

xml文件的空格也會形成結(jié)點(diǎn),也就是空格結(jié)點(diǎn)。空格結(jié)點(diǎn)屬于文字結(jié)點(diǎn)類型。

對xml和xslt而言,空格結(jié)點(diǎn)會牽涉到兩個(gè)議題:
-----------------------
1。在xml輸入文件中決定哪些空格是重要的,xslt處理器要看見這些空格結(jié)點(diǎn)。而決定的密鑰就是xml:space屬性。
2。在xsl模板文件中決定哪些空格是重要的,xslt處理器應(yīng)將它復(fù)制到結(jié)果樹中,而決定的密鑰就是xsl:strip-space
和xsl:preserve-space這兩個(gè)命令。


“重要和不重要的空格結(jié)點(diǎn)”
-----------------------
若某元素的內(nèi)容只能放元素,則該元素中的空格結(jié)點(diǎn)就是不重要的(Insignificant);
如果某元素的內(nèi)容是#PCDATA的類型,則其內(nèi)的空格結(jié)點(diǎn)應(yīng)視為重要的(Signficant)。
至于元素內(nèi)容混雜了文字內(nèi)容和元素的情況,則無從評判,應(yīng)視元素及其內(nèi)容之語意而定。


xslt處理器接觸到xml輸入文件之前,會先由xml分析器進(jìn)行分析
-----------------------
(1)xml:space屬性可以改變后續(xù)接手的xml應(yīng)用程序處理空格結(jié)點(diǎn)的模式,例如,xslt處理器就會受xml:space屬性影響。
(2)xml文件中任何一列標(biāo)記或內(nèi)容尾端的結(jié)尾的結(jié)尾符號全部會換成單一新行字符(#xA)。
(3)屬性值交給xml應(yīng)用程序之前,xml分析器也應(yīng)該先對屬性值做規(guī)范化的操作。這是因?yàn)椴煌牟僮飨到y(tǒng)每一行文字列的結(jié)尾字符有不同的組合,例如,windows系統(tǒng)會由返回字符呵新行字符組成結(jié)尾符號,而Unix系統(tǒng)則僅由新行字符組 成結(jié)尾符號。xml分析器在讀取xml文件之后,便先行將所有結(jié)尾符號換成單一新行字符,不僅統(tǒng)一了不同系統(tǒng)間不同結(jié)尾符號設(shè)計(jì)的差異性,同時(shí)也簡化了后續(xù)xml應(yīng)用程序的的操作難度。這樣一個(gè)處理過程稱為“規(guī)范化(Normalization)”。
 a,每一文字列的結(jié)尾符號都要規(guī)范化成單一的新行字符(#xA)。
 b,任何一個(gè)空格符(#x20、#xD、#xA、#x9)都應(yīng)換成一個(gè)空格字符(#x20)。
 c,屬性值中若含有字參碼,則應(yīng)替換成該參考字符,例如,&#xA;會換成新行字符(#xA)。
 d,屬性值若含有實(shí)體參考,則應(yīng)以其替換文字替換。
 e,除此之外,任何字符都應(yīng)直接放入規(guī)范化屬性值中。
 f,最后,如果屬性類型不是CDATA,則xml分析器應(yīng)該再進(jìn)一步把屬性值前后的空格字符序列刪除,而且屬性值中間若有空格序列,也應(yīng)該替換成單一空格字符。
    
    
xslt處理器把xml輸入文件和xsl模板文件的結(jié)構(gòu)樹建好之后,會現(xiàn)把組件中相鄰的文字結(jié)點(diǎn)合并成單一的文字結(jié)點(diǎn),然后再把一些文字結(jié)點(diǎn)抽掉。然而,如果文字結(jié)點(diǎn)符合下列條件之一,就會被保留下來:
-----------------------
(1)文字結(jié)點(diǎn)的父元素是空格保留元素名稱集(Set Of Whitespace-preserving Element Names)中的一員。
(2)文字結(jié)點(diǎn)中至少有一個(gè)非空格符。
(3)文字結(jié)點(diǎn)的某個(gè)祖先組件中有xml:space屬性,其值為preserve,而且較近的祖先元素中沒有其他xml:space屬性值為default。除此之外的文字結(jié)點(diǎn)逗會被抽掉。


對xsl模板而言,所謂的空格保留元素名稱集只有一個(gè)xsl:text組件可用。xsl模板文件的空格結(jié)點(diǎn)都會被刪除,但是,如果空格結(jié)點(diǎn)出現(xiàn)在xsl:text組件中就會被保留下來。


 



haogj 2006-04-11 21:40 發(fā)表評論
]]>
字符編碼的奧秘http://m.tkk7.com/haogj/archive/2006/04/09/40120.htmlhaogjhaogjSun, 09 Apr 2006 14:08:00 GMThttp://m.tkk7.com/haogj/archive/2006/04/09/40120.htmlhttp://m.tkk7.com/haogj/comments/40120.htmlhttp://m.tkk7.com/haogj/archive/2006/04/09/40120.html#Feedback6http://m.tkk7.com/haogj/comments/commentRss/40120.htmlhttp://m.tkk7.com/haogj/services/trackbacks/40120.html
  閱讀全文

haogj 2006-04-09 22:08 發(fā)表評論
]]>
用于解析 sina 新聞頁面的 XSLT 文件 http://m.tkk7.com/haogj/archive/2006/03/20/36437.htmlhaogjhaogjMon, 20 Mar 2006 13:29:00 GMThttp://m.tkk7.com/haogj/archive/2006/03/20/36437.htmlhttp://m.tkk7.com/haogj/comments/36437.htmlhttp://m.tkk7.com/haogj/archive/2006/03/20/36437.html#Feedback0http://m.tkk7.com/haogj/comments/commentRss/36437.htmlhttp://m.tkk7.com/haogj/services/trackbacks/36437.html<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
?<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
?<xsl:template match="/">
??<html>
???<head>
????<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
????<title>Sina newsletter</title>
???</head>
???<body>
????<xsl:apply-templates select="html/body/div/table/tbody/tr/td/div[@id='article']"/>
???</body>
??</html>
?</xsl:template>
?
?<!-- 新聞內(nèi)容 -->
?<xsl:template match="div">
?
??<!-- 新聞標(biāo)題 -->
??<xsl:apply-templates select="table/tbody/tr/th/h1"/>
??
??<!-- 新聞的內(nèi)容 -->
??<xsl:apply-templates select="table/tbody/tr/td"/>
?</xsl:template>
?
?<!-- 顯示標(biāo)題? -->
?<xsl:template match="h1">
??<h1>
???<xsl:value-of select="text()"/>
??</h1>
?</xsl:template>
?<!-- 顯示段落 -->
?<xsl:template match="p">
??<p>
???<xsl:apply-templates />
??</p>
?</xsl:template>
?
?<!-- 顯示內(nèi)容中文字 -->
?<xsl:template match="text()">
??<xsl:value-of select="."/>
?</xsl:template>
?
</xsl:stylesheet>


haogj 2006-03-20 21:29 發(fā)表評論
]]>
[轉(zhuǎn)帖]XML 中的常見問題http://m.tkk7.com/haogj/archive/2006/03/05/33743.htmlhaogjhaogjSun, 05 Mar 2006 12:34:00 GMThttp://m.tkk7.com/haogj/archive/2006/03/05/33743.htmlhttp://m.tkk7.com/haogj/comments/33743.htmlhttp://m.tkk7.com/haogj/archive/2006/03/05/33743.html#Feedback0http://m.tkk7.com/haogj/comments/commentRss/33743.htmlhttp://m.tkk7.com/haogj/services/trackbacks/33743.html[轉(zhuǎn)帖]XML 中的常見問題
XML 中的常見問題

引自:http://www.microsoft.com/china/msdn/Archives/workshop/xmlfaq.asp

--------------------------------------------------------------------------------
Microsoft Corporation
2000 年 6 月 7 日 
目錄 

一般問題 

什么是 XML? 
什么是 MSXML? 
Microsoft XML 分析器能夠做什么? 
MSXML、MSXML2 和 MSXML3 之間的區(qū)別是什么? 
XML 可以代替 HTML 嗎? 
在 HTML 中增加 XML 的好處是什么? 
XML 只適用于核心開發(fā)人員嗎? 
開始使用 XML 時(shí)需要什么? 
有如何使用 XML 的實(shí)際例子嗎? 
我可以忽略 XML 嗎? 
Microsoft Internet Explorer 4.0 支持 XML 嗎? 
Internet Explorer 5.0 對 XML 提供哪個(gè)級別的支持? 
HTML、動(dòng)態(tài) HTML 和 XML 之間的關(guān)系是什么? 
為什么 XML 這么重要? 
Microsoft 提供什么 XML 產(chǎn)品? 
在 Web 上傳輸,必須壓縮 XML 嗎? <
XML 作為數(shù)據(jù)格式有多安全?有沒有增加 XML 安全性的計(jì)劃?
確認(rèn) 

什么是 DTD 及其用途? 
Web 開發(fā)人員在使用 XML 描述數(shù)據(jù)時(shí)必須包括 DTD 嗎? 
什么是 XML 架構(gòu)?它們與 DTD 的區(qū)別是什么? 
什么是名稱空間,它們?yōu)楹沃匾?nbsp;
XSLT 和 XPath 

什么是 XSLT? 
XSL、XQL、XSL 模式 和 XSLT 之間的區(qū)別是什么? 
什么是 XPath? 
為什么 XSLT 對 XML 很重要? 
XSLT 和 CSS 之間的區(qū)別是什么?它們不是樣式表嗎?
標(biāo)準(zhǔn) 

Microsoft 如何與 XML 標(biāo)準(zhǔn)兼容? 
XML 和 World Wide Web Consortium (W3C) 之間的關(guān)系是什么? 
XML 和 W3C 的地位關(guān)系如何? 
DOM 在 W3C 中的地位如何?
工具支持 

SQL Server 和 ADO 支持 XML 嗎? 
目前有 Microsoft 工具可以幫助我快速沿用 XML 嗎? 
什么是 SOAP? 
XML 如何適用于構(gòu)造三層 Web 使能的應(yīng)用程序的 
Microsoft Windows(R) Distributed InterNet Applications (Windows DNA) 策略?

問題和解決方案 

為什么在調(diào)用了 Load() 方法后,我的文檔對象仍然為空? 
如何加載有外國和特殊字符的文檔? 
如何在 Visual Studio 6.0 C++ 中使用 MSXML COM 組件? 
如何在 XML 中使用 HTML 實(shí)體? 
在元素內(nèi)容中如何處理空白字符? 
如何處理屬性中的空白字符? 
在 XML 對象模型中如何處理空白字符? 
XML 聲明做什么? 
如何以可讀格式打印我的 XML 文檔? 
如何在 DTD 中使用名稱空間? 
如何在 Visual Basic 中使用 XMLDSO? 
如何在 Java 中使用 XML DOM?

--------------------------------------------------------------------------------

一般問題 

什么是 XML? 

可擴(kuò)展標(biāo)記語言 (XML) 是 Web 上的數(shù)據(jù)通用語言。它使開發(fā)人員能夠?qū)⒔Y(jié)構(gòu)化數(shù)據(jù),從許多不同的應(yīng)用程序傳遞到桌面,進(jìn)行本地計(jì)算和演示。XML 允許為特定應(yīng)用程序創(chuàng)建唯一的數(shù)據(jù)格式。它還是在服務(wù)器之間傳輸結(jié)構(gòu)化數(shù)據(jù)的理想格式。

什么是 MSXML? 

MSXML 是提供核心 XML 服務(wù)的 Microsoft 軟件組件。

Microsoft XML 分析器能夠做什么? 

最新版本的 Microsoft 核心 XML 服務(wù)提供下面四種不同的功能。

基于文檔對象模型 (DOM) 的分析器,它能夠獲取文本流(能夠轉(zhuǎn)換到 XML 的文件、程序中的字符串或者任何其他文本)并將它轉(zhuǎn)換為能夠編程處理的可導(dǎo)航 XML 樹結(jié)構(gòu)。


SAX(Simple API for XML)分析器,它針對處理大型文檔和高吞吐量的情況進(jìn)行了優(yōu)化的。SAX 是基于事件的分析器,它讀取文檔并將分析事件(例如元素的開始和結(jié)尾)直接報(bào)告給應(yīng)用程序。用戶創(chuàng)建的應(yīng)用程序?qū)崿F(xiàn)了處理不同事件的處理程序,這非常類似于處理圖形用戶界面 (GUI) 中的事件。


XSLT 處理器讀取 XSLT 文件,并將可擴(kuò)展樣式表轉(zhuǎn)換語言 (XSLT) 文件的指令應(yīng)用到 XML 文件,以產(chǎn)生某些類型的輸出。除了創(chuàng)建 XML結(jié)構(gòu)之外,XSLT 處理器還可以在得到的 XSLT 過濾器上執(zhí)行一定量的優(yōu)化,另外,從技術(shù)的角度看,它更像是一種編譯器。


驗(yàn)證分析器讀取文檔類型定義 (DTD) 或者 XML 架構(gòu),然后檢驗(yàn)實(shí)際得到的文檔的格式是否正確,以及是否不包含與架構(gòu)沖突的數(shù)據(jù)。請注意,僅對架構(gòu)而言,驗(yàn)證架構(gòu)將返回架構(gòu)本身作為對象,可以在以后在 HTML 列表框中創(chuàng)建選項(xiàng)時(shí)引用這個(gè)對象。 
所有四種功能都包含在同一 MSXML 庫軟件包中,它可以從 MSDN XML 開發(fā)人員中心(英文)免費(fèi)得到。

MSXML、MSXML2 和 MSXML3 之間的區(qū)別是什么? 

在過去三年中 XML 經(jīng)歷了許多反復(fù),所以目前存在不同版本的 Microsoft XML 分析器也不奇怪。Internet Explorer 4.0 包含早期版本的 XML 分析器,它比 XSL、XML 數(shù)據(jù)或者大多數(shù)其他的 XML 技術(shù)(并且有完全不同的 DOM 模型)要早。該早期版本的分析器包含在 MSXML.dll 庫中。從 MSDN XML 開發(fā)人員中心(英文)可將分析器升級到較新的一種。

我們極力建議您升級到新的分析器,因?yàn)樗獜?qiáng)大得多。Internet Explorer 5.0 包括 MSXML 2.0 分析器,它包含 XSL 和 XML 架構(gòu)的基本版本。MSXML2 是 SQL Server 2000 附帶的分析器版本。MSXML2 包含了許多性能增強(qiáng)的功能,并且在總體上提高了性能和可伸縮性。MSXML3 是當(dāng)前作為“技術(shù)預(yù)覽”附帶的版本。MSXML3 包括 XSLT 和 XPath 支持以及 SAX 接口。

XML 可以代替 HTML 嗎? 

XML 比 HTML 提供更大的靈活性,但是它不可能很快代替 HTML。實(shí)際上,XML 和 HTML 能夠很好地在一起工作。Microsoft 希望許多作者和開發(fā)人員都能同時(shí)使用 XML 和 HTML,比如用 XSLT 來生成 HTML。

在 HTML 中增加 XML 的好處是什么? 

在 Web 上使用 XML 的好處有:

它提供用于本地計(jì)算的數(shù)據(jù)。傳遞到桌面的數(shù)據(jù)可以進(jìn)行本地計(jì)算。XML 分析器可以讀取數(shù)據(jù),并將它遞交給本地應(yīng)用程序(例如瀏覽器)進(jìn)一步查看或處理。數(shù)據(jù)也可以由使用 XML 對象模型的腳本或其他編程語言來處理。


向用戶提供正確的結(jié)構(gòu)化數(shù)據(jù)視圖。傳遞到桌面的數(shù)據(jù)可以以多種方式表示。本地?cái)?shù)據(jù)集,可以根據(jù)用戶喜好和配置等因素,以適當(dāng)?shù)男问剑谝晥D中動(dòng)態(tài)表現(xiàn)給用戶。


允許集成不同來源的結(jié)構(gòu)化數(shù)據(jù)。一般情況下,使用代理,在中間層服務(wù)器上集成來自后端數(shù)據(jù)庫和其他應(yīng)用程序的數(shù)據(jù),使該數(shù)據(jù)能夠傳遞給桌面或者其他服務(wù)器,做進(jìn)一步聚合、處理和分布。


描述來自多種應(yīng)用程序的數(shù)據(jù)。由于 XML 是可擴(kuò)展的,因此它可以用于描述來自多種應(yīng)用程序的數(shù)據(jù),從描述 Web 頁面集合到數(shù)據(jù)記錄。由于數(shù)據(jù)是自描述的,因此不需要數(shù)據(jù)的內(nèi)置描述,也能夠接收和處理數(shù)據(jù)。


通過粒度更新來提高性能。XML 允許粒度更新。開發(fā)人員不必在每次有改動(dòng)時(shí)都發(fā)送整個(gè)結(jié)構(gòu)化數(shù)據(jù)集。有了粒度更新后,只有改變的元素才必須從服務(wù)器發(fā)送到客戶機(jī)。改變的數(shù)據(jù)可以在不必刷新整個(gè)頁面或表的情況下顯示。 
XML 只適用于核心開發(fā)人員嗎? 

不。和 HTML 文檔一樣,XML 文檔可以由任何人創(chuàng)建 — 甚至是沒有任何編程經(jīng)驗(yàn)的人。XML 僅僅是一種描述信息的標(biāo)準(zhǔn)方式。此外,它還是一種語言,可以在沒有任何軟件的情況下用它來編寫。您可以在文本編輯器中編寫 XML 文檔,并且直接放入 Web 站點(diǎn),不需要編寫傳統(tǒng)方式下的任何代碼。

開始使用 XML 時(shí)需要什么? 

要使用 XML,您需要能夠讀取 XMl 文檔的 XML 分析器,并且使它的內(nèi)容能被處理。Microsoft 提供了一種分析器,可以從 MSDN XML 開發(fā)人員中心(英文)下載。 

要使用 XML 文檔,可以使用文本編輯器(例如記事本)或任何其他可以用于創(chuàng)建 HTML 頁面的編輯器。要?jiǎng)?chuàng)建完整形式的 XML 應(yīng)用程序,請使用諸如 Microsoft? Visual Studio? 的編程環(huán)境。

有如何使用 XML 的實(shí)際例子嗎? 

XML 正在數(shù)量驚人的應(yīng)用程序中使用,范圍從 Web 站點(diǎn)創(chuàng)建和文檔化到數(shù)據(jù)庫集成和分布式編程。在下面幾個(gè)領(lǐng)域中,XML 有其用武之地:

業(yè)務(wù)對業(yè)務(wù)的傳輸。業(yè)務(wù)數(shù)據(jù)(發(fā)票、購買定單、會計(jì)和稅務(wù)信息等等)是以 XML 格式在廠商之間電子傳輸?shù)摹Ec舊的電子數(shù)據(jù)交換 (EDI) 格式相比,XML 提供了許多優(yōu)點(diǎn),而不僅僅是可以在傳輸中從一種發(fā)票格式轉(zhuǎn)換到另一種。


分布式編程。XML 是非常理想的復(fù)雜多平臺應(yīng)用程序構(gòu)造方案,這樣就使得 Windows 服務(wù)器和其他操作系統(tǒng)的集成成為可能。


Web 站點(diǎn)體系結(jié)構(gòu)。由于 XML 的層次結(jié)構(gòu)和分布式特性,Web 站點(diǎn)開發(fā)人員在他們 Web 站點(diǎn)的總體體系結(jié)構(gòu)和導(dǎo)航結(jié)構(gòu)中越來越多地使用它。此外,越來越多的目錄表和索引表、跟蹤用戶信息及 Web 站點(diǎn)狀態(tài)的 XML 結(jié)構(gòu)、基于 HTML 的組件和處理數(shù)據(jù)流的渠道,都用 XML 和 XSLT 編寫。


數(shù)據(jù)庫操作。XML 正成為與數(shù)據(jù)庫交互的流行工具 — 無論從 SQL 查詢中檢索 XML 數(shù)據(jù)集,還是用 XML 記錄更新數(shù)據(jù)庫。而且我們還有分離實(shí)現(xiàn)的優(yōu)點(diǎn)。通過將數(shù)據(jù)壓縮為 SML,就不需要對實(shí)際的數(shù)據(jù)庫結(jié)構(gòu)有任何了解。


文檔管理。目前的大多數(shù)公司都陷在文書工作的海洋里,而且會越來越糟。XML 正在越來越多地用于將文檔編碼成 XML,使文檔更易于檢索或提供鏈接到文檔的注釋上下文,以便更有效地進(jìn)行參考。 
我可以忽略 XML 嗎? 

如果您想在 Internet 世界中競爭的話,那就不可以忽略 XML。XML 是導(dǎo)致以我們考慮編程本身的方式進(jìn)行模式轉(zhuǎn)移的一種語言。傳統(tǒng)的專用客戶機(jī)/服務(wù)器應(yīng)用程序,正在給“隨時(shí)隨地訪問”的 Internet 服務(wù)讓位,XML 是處理任何事情(從數(shù)據(jù)訪問處理到在該新環(huán)境中表現(xiàn)數(shù)據(jù))的邏輯媒體。

Microsoft Internet Explorer 4.0 支持 XML 嗎? 

是的。Internet Explorer 4.0 支持 XML 下列功能:

通用的 XML 分析器,它讀取 XML 文件并將它們傳遞到應(yīng)用程序(例如查看器)進(jìn)行處理。應(yīng)用程序開發(fā)人員可以使用 Microsoft 的兩個(gè)分析器:C++ 中的 Microsoft XML 分析和 Java 中的 Microsoft XML 分析器。


XML 對象模型 (XML OM) 使用 World Wide Web Consortium (W3C) 標(biāo)準(zhǔn)文檔對象模型 (DOM) 允許程序通過 XML 分析器訪問結(jié)構(gòu)化數(shù)據(jù),使開發(fā)人員擁有交互和計(jì)算數(shù)據(jù)的能力。有關(guān)詳細(xì)信息,請參見 DOM 規(guī)范(英文) 。


XML 數(shù)據(jù)源對象 (XML DSO) 允許開發(fā)人員連接到結(jié)構(gòu)化 XML 數(shù)據(jù),并用動(dòng)態(tài) HTML 的數(shù)據(jù)綁定機(jī)制將它提供給 HTML 頁面。 
Internet Explorer 5.0 對 XML 提供哪個(gè)級別的支持? 

Internet Explorer 5 提供下列 XML 支持:

直接查看 XML。Microsoft XML 實(shí)現(xiàn)允許用戶通過他們的 Web 瀏覽器使用 XSL 或者層疊樣式表 (CSS) 查看 XML,就象查看 HTML 文檔一樣。


高性能、驗(yàn)證 XML 引擎。Internet Explorer 4.0 開發(fā)人員熟悉的 XML 引擎已經(jīng)得到了很大的增強(qiáng),并且完全支持 W3C XML 1.0 和 XML 名稱空間,這樣開發(fā)人員就可以在 Web 上統(tǒng)一限定元素名稱,從而避免了相同名稱的元素之間的沖突。Windows 中的本機(jī) XML 支持意味著,當(dāng)開發(fā)人員在應(yīng)用程序和組件之間移動(dòng)數(shù)據(jù)時(shí),可以使用完整的 XML 處理功能來讀取和處理數(shù)據(jù)。


可擴(kuò)展樣式轉(zhuǎn)換語言 (XSLT) 支持。使用基于最新的 W3C Working Draft 的 Microsoft XSLT 處理器,開發(fā)人員可以對 XML 數(shù)據(jù)應(yīng)用樣式表,并以易于自定義的動(dòng)態(tài)和靈活方式來顯示數(shù)據(jù)。Microsoft XSLT 處理器的查詢功能也允許開發(fā)人員用程序,在客戶機(jī)或服務(wù)器上,在 XML 數(shù)據(jù)集內(nèi)部查找和摘取信息。


XML 架構(gòu)。架構(gòu)(英文) 定義 XML 文檔規(guī)則,包括元素名稱和豐富的數(shù)據(jù)類型,它們的元素可以表現(xiàn)為組合,并且每個(gè)元素的屬性都可用。為了啟用多層應(yīng)用程序,Microsoft 將根據(jù)提交給 W3C XML 工作組的縮減 XML 數(shù)據(jù)架構(gòu) (XDR) 來發(fā)布 XML 架構(gòu)的技術(shù)預(yù)覽。


服務(wù)器端 XML。服務(wù)器端 XML 處理允許使用 XML 作為在多個(gè)分布式應(yīng)用程序服務(wù)器(甚至是跨越操作系統(tǒng)邊界)之間傳送數(shù)據(jù)的標(biāo)準(zhǔn)方式。


XML 文檔對象模型 (DOM)。XML DOM 是標(biāo)準(zhǔn)對象應(yīng)用程序編程接口,它使開發(fā)人員能夠用程序控制 XML 文檔內(nèi)容、結(jié)構(gòu)、格式等等。Microsoft XML 實(shí)現(xiàn)包括對 W3C XML DOM 建議的完全支持,并且可以用腳本、Visual Basic 開發(fā)系統(tǒng)、C++ 和其他編程語言來訪問。


C++ XML 數(shù)據(jù)源對象。XML DSO 允許將 HTML 元素直接綁定到 XML 數(shù)據(jù)島。此外,它還提高了性能,有強(qiáng)大的能力可以綁定到不同 XML 節(jié)點(diǎn)上,而且利用了 Internet Explorer 5 beta 中所有的新的數(shù)據(jù)綁定功能。 
HTML、動(dòng)態(tài) HTML 和 XML 之間的關(guān)系是什么? 

HTML 可以和 CSS 一起用于格式化和表示超鏈接頁面。動(dòng)態(tài) HTML,通過 DOM,使 HTML 中的所有元素,都可以通過與語言無關(guān)的腳本和其他編程語言來訪問,從而在很大程度上提高了客戶機(jī)端的交互能力,而且不需要對服務(wù)器的額外需求。頁面的對象模型允許動(dòng)態(tài)更改任何方面的內(nèi)容(包括增加、刪除和移動(dòng))。

通過為結(jié)構(gòu)化數(shù)據(jù)添加 XML,為開發(fā)人員提供了構(gòu)造下一代豐富、靈活 Web 應(yīng)用程序的技術(shù)。使用 XML,他們可以為桌面提供結(jié)構(gòu)化數(shù)據(jù),并且用 XML 對象模型計(jì)算數(shù)據(jù)。現(xiàn)在的開發(fā)人員可以在瀏覽器(例如 Microsoft Internet Explorer 4.0 和 Microsoft Internet Explorer 5)或者其他應(yīng)用程序中,通過腳本顯示基于 XML 的數(shù)據(jù)。此外,他們也可以對數(shù)據(jù)應(yīng)用格式化規(guī)則,而不需要使用 XSLT 樣式表的復(fù)雜腳本(實(shí)際上是將基于 XML 的數(shù)據(jù)轉(zhuǎn)換為顯示)。這兩種顯示基于 XML 數(shù)據(jù)的方法,都使得生成復(fù)雜數(shù)據(jù)的多個(gè)視圖成為可能。

為什么 XML 這么重要? 

XML 將成為計(jì)算領(lǐng)域的未來。作為一種技術(shù),它的影響力將滲透到編程的每個(gè)方面,從嵌入式系統(tǒng)到圖形界面,到分布式系統(tǒng)以及數(shù)據(jù)庫管理。它實(shí)際上已經(jīng)成為軟件工業(yè)之間數(shù)據(jù)通信的標(biāo)準(zhǔn),并且迅速代替 EDI 系統(tǒng)成為全球幾乎所有工業(yè)進(jìn)行業(yè)務(wù)交換的主要媒體。它很有可能會成為創(chuàng)建和存儲大多數(shù)文檔的語言,不管是否在 Internet 上,并且有可能成為 Internet 應(yīng)用程序服務(wù)器的基礎(chǔ),有些人相信它將代替許多目前生產(chǎn)的小包裝產(chǎn)品。

Microsoft 提供什么 XML 產(chǎn)品? 

Microsoft 正在努力為許多領(lǐng)域開發(fā) XML 資源:

數(shù)據(jù)訪問。最新的 ActiveX? 數(shù)據(jù)對象 (ADO) 的化身,已經(jīng)支持 XML 的生成和消費(fèi)將近一年了,并且 Microsoft SQL Server 2000 為基于 SQL 的信息和 XML 之間的互相轉(zhuǎn)換提供了許多接口。


瀏覽器支持。Microsoft 是第一個(gè)生產(chǎn)能夠閱讀 XML 文件(無論是用原始結(jié)構(gòu)形式,還是通過 XSL 或 CSS 樣式表)的商業(yè)瀏覽器 (Internet Explorer 5) 的公司。


BizTalk Server 2000。Microsoft? BizTalk(TM) Server 2000 提供了在大量不同格式(包括 XML)之間通信的方式,來幫助推動(dòng)業(yè)務(wù)對業(yè)務(wù)的應(yīng)用程序。BizTalk Server 也包括了許多架構(gòu)生成和映射工具,從而大大簡化了業(yè)務(wù)或商業(yè)需要的 XML 結(jié)構(gòu)的開發(fā)。 
在 Web 上傳輸,必須壓縮 XML 嗎? 

一般來說,壓縮 XML 的需要是與應(yīng)用程序有關(guān)的,并且很大程度上是服務(wù)器和客戶機(jī)之間移動(dòng)數(shù)據(jù)量的函數(shù)。用于描述數(shù)據(jù)結(jié)構(gòu)的標(biāo)記的反復(fù)特性,使 XML 能夠非常好地壓縮數(shù)據(jù)。值得注意的是 HTTP 1.1 服務(wù)器和客戶機(jī)的壓縮都是標(biāo)準(zhǔn)的,XML 可以自動(dòng)從中受益。

XML 作為數(shù)據(jù)格式有多安全?有沒有增加 XML 安全性的計(jì)劃? 

XML 和 HTML 一樣安全。正因?yàn)榘踩?nbsp;HTTP (HTTPS) 可以用于對 HTTP 添加密碼技術(shù),從而保護(hù)了 HTML,因此它也可以用于保護(hù) XML。XML 是表示結(jié)構(gòu)化數(shù)據(jù)的基于文本格式。這可以使數(shù)據(jù)的簡單性和互操作性最大化。對 XML 格式增加安全性和驗(yàn)證能力時(shí)可以采取許多步驟。首先,XML 可以在傳輸?shù)娇蛻糁霸诜?wù)器上加密,然后在客戶機(jī)上解密。應(yīng)用于數(shù)據(jù)本身的數(shù)字簽名也可以驗(yàn)證 XML。

確認(rèn) 

什么是 DTD 及其用途? 

文檔類型定義 (DTD) 定義了一類 XML 文檔的正確語法。也就是說,它列出了許多元素名稱,什么元素可以和其他元素一起顯示,什么屬性可以用于每種元素類型等等。DTD 使用 XML 文檔使用的不同語法形式。

Web 開發(fā)人員在使用 XML 描述數(shù)據(jù)時(shí)必須包括 DTD 嗎? 

不。XML 可以用于描述有或沒有 DTD 的數(shù)據(jù)。術(shù)語“有效”XML 指代引用 DTD 的 XML 數(shù)據(jù),而“良好形成的”XML 是未使用 DTD 的 XML。此外,“良好形成的”XML 還是 XML 和標(biāo)準(zhǔn)統(tǒng)一標(biāo)記語言 (SGML) 的基本區(qū)別之一。很明顯,在這兩種情況下,XML 本身都必須遵守語言的標(biāo)準(zhǔn)(例如,所有標(biāo)記都必須是閉合的,并且標(biāo)記不能重疊)。

什么是 XML 架構(gòu)?它們與 DTD 的區(qū)別是什么? 

雖然 XML 1.0 提供了定義 XML 文檔的內(nèi)容模型的機(jī)制 — DTD — 但是很明顯還需要定義內(nèi)容模型的更全面更有效的方法。XML 架構(gòu)是特殊的 XML 結(jié)構(gòu)的定義(從其組織和數(shù)據(jù)類型兩個(gè)方面)。XML 架構(gòu)使用“XML 架構(gòu)”語言來指定在架構(gòu)中如何定義元素的每種類型,以及與元素關(guān)聯(lián)的數(shù)據(jù)類型。與 DTD 相比,架構(gòu)的最鮮明的特點(diǎn),便是架構(gòu)本身就是 XML 文檔。這意味著閱讀它所描述的 XML 的工具也可以閱讀它。

Microsoft 的 XML 服務(wù)目前支持 XML 數(shù)據(jù)架構(gòu),它代表了在 1999 年 3 月 Internet Explorer 5 裝運(yùn)時(shí) “W3C 架構(gòu)”活動(dòng)的快照。XML 數(shù)據(jù)架構(gòu)允許開發(fā)人員在他們的 XML 文檔中添加數(shù)據(jù)類型,以及定義開放的內(nèi)容模型。這種對 DTD 功能的擴(kuò)展對 XML 編程很關(guān)鍵。

但是 W3C 正在準(zhǔn)備“XML 架構(gòu)定義 (XSD)”,它將成為“XML 架構(gòu)標(biāo)準(zhǔn)”。Microsoft 計(jì)劃在此規(guī)范成為建議后,立即使對“XML 架構(gòu)定義 (XSD)”的支持成為它核心 XML 服務(wù)的一部分。

什么是名稱空間,它們?yōu)楹沃匾?nbsp;

名稱空間是 XML 的另一個(gè)高級功能,并作為 XML 1.0 規(guī)范的一部分,在 W3C 筆記中作了概述。它們允許開發(fā)人員限定元素名稱和關(guān)系。名稱空間使元素名稱唯一可識別,從而避免了名稱相同,但是在不同詞典中定義的元素之間發(fā)生名稱沖突。它們允許混合來自不同名稱空間的標(biāo)記,這一點(diǎn)對多個(gè)來源的數(shù)據(jù)很重要。

例如,書店可以定義 <TITLE> 標(biāo)記代表書名,它只包含在 <BOOK> 元素中。但是,個(gè)人目錄可以定義 <TITLE> 代表個(gè)人的職位,例如:

  <TITLE>President</TITLE>

名稱空間有助于清晰地定義這種差別。

XSLT 和 XPATH 

什么是 XSLT? 

XSLT(英文) ,或者用于轉(zhuǎn)換的可擴(kuò)展樣式表語言,它是在 1999 年 11 月 6 日獲得批準(zhǔn)的 W3C 建議。從標(biāo)記和編程兩重意義上說,這種語言提供了將 XML 結(jié)構(gòu)轉(zhuǎn)換到其他 XML 結(jié)構(gòu)、HTML 或者任何數(shù)量的其他文本格式(例如 SQL)的機(jī)制。雖然它可以用于創(chuàng)建 Web 頁面的顯示輸出,但是 XSLT 的實(shí)際功能在于能夠改變底層結(jié)構(gòu),而不是簡單地改變這些結(jié)構(gòu)的媒體表示,就像在層疊樣式表 (CSS) 中一樣。

XSL、XQL、XSL 模式 和 XSLT 之間的區(qū)別是什么? 

XSLT 源自 CSS 在對 XML 文檔結(jié)構(gòu)改動(dòng)上的局限性,當(dāng)時(shí)創(chuàng)建 XML 的原因更傾向于代替 HTML 而不是提供通用數(shù)據(jù)描述語言。因此可擴(kuò)展樣式表語言 (XSL) 成為構(gòu)造格式化 XML 新方法的成果。

但是,“W3C 樣式工作”組的成員和早期 XML 采用者很快就發(fā)現(xiàn),能夠?qū)?nbsp;XML 從一種格式轉(zhuǎn)換到另一個(gè)格式的語言,可以極大地簡化生成的大量代碼。Microsoft 向 W3C 提交了一個(gè)建議,最初名稱為 XML 查詢語言(或 XQL),它隨之被 W3C 采納為 XSL 模式語言。該語言的大多數(shù)功能最終都被納入了 XSLT 規(guī)范中。 

最終標(biāo)準(zhǔn)結(jié)合了為不同初始條件而修改的 XSLT 參數(shù),創(chuàng)建代碼功能塊的命名模板,以及大量用于數(shù)值和字符串處理的增強(qiáng)功能。XSLT 還為在語言中添加內(nèi)置功能提供方便,提供了 Microsoft 可在自己的實(shí)現(xiàn)中用來添加許多極其有用功能(包括訪問 COM 對象和腳本)的產(chǎn)品。

什么是 XPath? 

XPath(英文)  是為 XML 定義的查詢語言,它提供在文檔中選擇節(jié)點(diǎn)子集的簡單語法。通過 XPath,通過指定類似于目錄的路徑(即名稱)以及路徑中的條件,可以檢索元素集合。XPath 對 XSLT 和 XML DOM 都很重要,并與 XPointer 規(guī)范(允許根據(jù)統(tǒng)一資源定位符 [URL] 和 XPath 表達(dá)式的組合來選擇文檔片斷)有聯(lián)系。

為什么 XSLT 對 XML 很重要? 

XSLT 是將一種 XML 文檔轉(zhuǎn)換為另一種的語言。這意味著它提供了單源 XML 數(shù)據(jù)的機(jī)制,可以在 Web 頁面中創(chuàng)建由用戶動(dòng)態(tài)更改的豐富視圖,可以為目標(biāo)通信過濾數(shù)據(jù)。XSLT 對于業(yè)務(wù)規(guī)則編碼已經(jīng)足夠強(qiáng)大。它可以從數(shù)據(jù)生成圖形(不僅僅是 Web 頁面)。它甚至可以處理與其他服務(wù)器的通信 — 特別是和能夠集成到 XSLT 中的腳本模塊協(xié)作 — 以及在 XSLT 自身內(nèi)部生成適當(dāng)?shù)南ⅰkm然它不可能代替桌面系統(tǒng)中的大多數(shù)交互(出于性能和使用方便性兩方面分原因),但是在未來的幾年中,XSLT 很有可能最終成為系統(tǒng)之間進(jìn)行通信的主要“編程”語言。

XSLT 和 CSS 之間的區(qū)別是什么?它們不是樣式表嗎? 

層疊樣式表 (CSS) 的任務(wù)是對 HTML 元素指定一組顯示屬性。CSS 決定了頁面的視覺外觀,但是不會改變源文檔的結(jié)構(gòu)。

另一方面,XSLT 也稱為基于模板的語言,它允許將某種模式映射到源文檔中,該源文檔的輸出是用 XML、HTML 或純文本書寫的。使用 XSLT,可以將 XML 文檔的結(jié)構(gòu)轉(zhuǎn)換為不同的 XML 文檔。例如,您可以更改 XML 文檔的順序、添加或刪除元素、執(zhí)行條件測試或者用元素的集合進(jìn)行迭代。

XSLT 和 CSS 不是兼容標(biāo)準(zhǔn)。一種在 XML 中創(chuàng)建 Web 頁面的有用技術(shù),是用 XSLT 將 XML 轉(zhuǎn)換為諸如列表或表的結(jié)構(gòu),然后將 CSS 應(yīng)用于結(jié)果,控制這些結(jié)構(gòu)在適當(dāng)媒體中的顯示。您甚至可以從 XSLT 創(chuàng)建 CSS。

標(biāo)準(zhǔn) 

Microsoft 如何與 XML 標(biāo)準(zhǔn)兼容? 

從 XML 語言開始產(chǎn)生起,Microsoft 就站在了 XML 的最前沿,而且很值得注意的是,W3C 在過去幾年中所生成的大多數(shù) XML 建議和工作草案,都包括來自至少一個(gè)(在某些情況下可能是數(shù)個(gè))Microsoft 職員的輸入和參與。Microsoft 已經(jīng)多次被委以重任,與 W3C 標(biāo)準(zhǔn)組織一起,確保 XML 的開發(fā)能使所有用戶受益,并且在許多不同領(lǐng)域的開發(fā)中都作出了重要貢獻(xiàn),包括 XML 規(guī)范、DOM、XSLT 和架構(gòu)定義語言。Microsoft 承諾將與最新規(guī)范和標(biāo)準(zhǔn)保持一致。

XML 和 World Wide Web Consortium (W3C) 之間的關(guān)系是什么? 

W3C 有一活躍的 XML 工作組。Microsoft 從 1996 年 6 月起就是該組織的共同發(fā)起者之一,從那時(shí)起許多業(yè)界企業(yè)都開始加入,包括 Netscape Communications Corp.、IBM 和 Oracle。有關(guān) XML 標(biāo)準(zhǔn)過程的詳細(xì)信息,請?jiān)L問 W3C Web 站點(diǎn)(英文)。

XML 和 W3C 的地位關(guān)系如何? 

XML 1.0 是在 1998 年 12 月被正式批準(zhǔn)的,現(xiàn)在仍是個(gè)穩(wěn)定的標(biāo)準(zhǔn)。有關(guān)當(dāng)前 XML 規(guī)范的詳細(xì)信息以及 W3C 內(nèi)部的提交和審閱過程,請參見 W3C Web 站點(diǎn)(英文)。

DOM 在 W3C 中的地位如何? 

DOM Level 1 的 W3C 文檔狀態(tài)為“推薦”。這說明 W3C 目前正在提議將它作為 World Wide Web 上的標(biāo)準(zhǔn)。有關(guān) DOM 和在 W3C 內(nèi)部提交和審閱過程的詳細(xì)信息,請參見 DOM 規(guī)范(英文)。

工具支持 

SQL Server 和 ADO 支持 XML 嗎? 

Microsoft ActiveX 數(shù)據(jù)對象 (ADO) 技術(shù),提供許多將數(shù)據(jù)庫記錄集(數(shù)據(jù)記錄集合)轉(zhuǎn)換為 XML 格式的方法,以及從給定結(jié)構(gòu)中獲取 XML 并將其轉(zhuǎn)換回 ADO 所支持?jǐn)?shù)據(jù)庫(包括 SQL Server 和 Oracle 數(shù)據(jù)庫)的工具。此外,通過 MSXML2 和 MSXML3 中的 XML 數(shù)據(jù)源對象,還可以將任意 XML 直接加載到 ADO 中以生成記錄集。

SQL Server 2000 還允許通過 URL 直接設(shè)置和檢索 XML,方式和調(diào)用 Web 頁面非常相似。這是處理數(shù)據(jù)的強(qiáng)大機(jī)制,因?yàn)樗旧弦馕吨梢詫?nbsp;SQL Server 數(shù)據(jù)直接集成到 XML 過濾器和 Web 頁面,基本上凡是有 XML 文檔的地方都可以集成 SQL Server 數(shù)據(jù)。此外,還可以設(shè)置自定義模板,來控制如何從 SQL Server 數(shù)據(jù)中產(chǎn)生 XML,使數(shù)據(jù)庫成為生成 XHTML 頁面的強(qiáng)大工具。

最后,諸如 BizTalk Server 這樣的應(yīng)用程序還允許在任意數(shù)量的不同數(shù)據(jù)源(從 XML 文檔到數(shù)據(jù)庫到 Excel 和 Word 文檔)之間進(jìn)行映射、為 Web 體系結(jié)構(gòu)創(chuàng)建復(fù)雜數(shù)據(jù)管道以及根據(jù) XML 數(shù)據(jù)庫需求構(gòu)造有效的架構(gòu)。

目前有 Microsoft 工具可以幫助我快速沿用 XML 嗎? 

Microsoft BizTalk Server 2000 是用于數(shù)據(jù)交換的、基于 XML 的服務(wù)器,它提供啟用電子商務(wù)業(yè)務(wù)社會的基本結(jié)構(gòu)和工具。BizTalk Server 的基礎(chǔ)是基于規(guī)則的業(yè)務(wù)文檔路由、轉(zhuǎn)換和跟蹤基本結(jié)構(gòu)。該基本結(jié)構(gòu)允許公司通過在組織邊界之內(nèi)或之間的應(yīng)用程序中間交換業(yè)務(wù)文檔,例如購買定單和發(fā)票,來集成、管理和自動(dòng)化業(yè)務(wù)過程。有關(guān)詳細(xì)信息,請參見Microsoft BizTalk Server 2000(英文) 。

什么是 SOAP? 

SOAP 是簡單對象訪問協(xié)議,是創(chuàng)建大范圍分布式、復(fù)雜計(jì)算環(huán)境的工具,該計(jì)算環(huán)境可使用現(xiàn)有的 Internet 基本結(jié)構(gòu)運(yùn)行在 Internet 上。SOAP 可以使應(yīng)用程序用許許多多方法在 Internet 上互相直接通信。有關(guān) SOAP 的詳細(xì)信息,請參見 SOAP 規(guī)范(英文)。

XML 如何適用于 Microsoft Windows? Distributed InterNet Applications (Windows DNA) 策略來構(gòu)造三層并具有 Web 功能的應(yīng)用程序? 

XML 正在快速成為將結(jié)構(gòu)化數(shù)據(jù)從中間層傳送到桌面的工具。基于 XML 的數(shù)據(jù)可以通過中間層代理與多種后端(數(shù)據(jù)庫)源集成。架構(gòu)(參見“XML 數(shù)據(jù)”一節(jié))可以改進(jìn)該過程,并且開發(fā)人員可以更精確地描述和交換數(shù)據(jù)。

問題和解決方案 

為什么在調(diào)用了 Load() 方法后,我的文檔對象仍然為空? 

默認(rèn)情況下操作是異步加載的。這意味著如果提供 http URL 地址,那么 load() 方法將直接返回,并且文檔對象仍然為空,因?yàn)閿?shù)據(jù)還沒有從服務(wù)器返回。為了糾正這個(gè)問題,請?jiān)诖a中添加下面的行:

xmldoc.async = false;

同時(shí),如果是從獨(dú)立的 C++ 應(yīng)用程序加載 http XML 文檔,那么必須查詢消息隊(duì)列才能繼續(xù)加載。

如何加載有外國和特殊字符的文檔? 

文檔可以包含外國字符,例如:

<test>foreign characters (úóí?) </test>

例如 磲 的外國字符必須在前面加上 escape 序列。外國字符可以是 UTF-8 編碼或用不同編碼指定,如下所示:
<?xml version="1.0" encoding="iso-8859-1"?>
<test>foreign characters (磲) </test>

現(xiàn)在可以正確加載 XML 了。

其他字符是保留在 XML 中的,并且需要以不同的方式處理。下面的 XML:

<foo>This & that</foo>
產(chǎn)生如下錯(cuò)誤:
此處不允許有空格。
行 0000001: <foo>This & that</foo>
位置  0000012: ----------^

此處 & 是 XML 句法結(jié)構(gòu)的一部分,如果它僅僅放在 XML 數(shù)據(jù)源內(nèi)部,那么不能解釋為 &。您需要替換稱為“實(shí)體”的特殊字符序列。

<foo>This & that</foo>
下面的字符需要相應(yīng)的實(shí)體:

< <
& &
> >
" "
' &apos;

引號字符被用作標(biāo)記中屬性值的定界符,因此通常不能在屬性值的內(nèi)部使用。例如,下面的內(nèi)容將返回錯(cuò)誤:
<foo description="John′s Stuff">

此處的單引號既用作屬性定界符,又在屬性值自身中。為了糾正這個(gè)問題,可以將屬性定界符換成雙引號:

<foo description="John′s Stuff">
或者可以將單引號轉(zhuǎn)義為實(shí)體 &apos; 

<foo description="John&apos; Stuff">
上述兩種方式都將通過 XML 對象模型中的 getAttribute 方法返回屬性值 John's Stuff。同樣,對于雙引號,您可以使用實(shí)體
"。
也可以通過將文本放在 CDATA 節(jié)中來處理元素內(nèi)容中的特殊字符。下面的內(nèi)容是正確的:

<xml>
  <![CDATA[ This & that <stuff> is just "text" content。 ]]>
</xml>
在本例子中,XML 對象模型將 CDATA 節(jié)點(diǎn)顯示 xml 節(jié)點(diǎn)的子節(jié)點(diǎn),它將返回字符串

This & that <stuff> is just "text" content.
作為 nodevalue


如何在 Visual Studio 6.0 C++ 中使用 MSXML COM 組件? 

在 Visual C++ 6.0 中使用 MSXML COM 組件的最簡便方式是使用 #import 指令:

#import "msxml.dll" named_guids no_namespace#import "msxml.dll" named_guids no_namespace
它定義了所有 IXML* 接口和接口 ID,從而可以在應(yīng)用程序中使用它們了。也可以從 INETSDK 獲取 MSXML 類型庫和頭文件(英文),以及包含類 IIDs 的 uuid.lib。

如何在 XML 中使用 HTML 實(shí)體? 

下面的 XML 包含 HTML 實(shí)體:

<copyright>Copyright ? 2000, Microsoft Inc, All rights reserved.</copyright>

它產(chǎn)生下列錯(cuò)誤:

引用未定義的實(shí)體 'copy'。
行: 1, 位置:23, 錯(cuò)誤碼:0xC00CE002
<copyright>Copyright ? 2000, ...
----------------------^

這是因?yàn)?nbsp;XML 只有五個(gè)內(nèi)置實(shí)體。關(guān)于內(nèi)置實(shí)體的詳細(xì)信息,請參閱如何加載有外國和特殊字符的文檔?。

要使用 HTML 實(shí)體,需要用 DTD 定義它們。有關(guān) DTD 的詳細(xì)信息,請參閱 W3C XML 建議(英文)。要使用該 DTD,請將它直接包括在 DOCTYPE 標(biāo)記中,如下所示:
<!DOCTYPE foo SYSTEM "http://msdn.microsoft.com/xml/general/htmlentities.dtd">
<copyright>Copyright ? 2000, Microsoft Inc, All rights reserved.</copyright>
要加載它,需要關(guān)閉 IXMLDOMDocument 接口的 validateOnParse 屬性。請嘗試將它粘貼到“Validator 測試頁”中,關(guān)閉 DTD 驗(yàn)證,然后單擊“驗(yàn)證”。請注意文檔將加載,并且版權(quán)字符將顯示在 validator 頁面的末尾的 DOM 樹中。

如果已經(jīng)完成了 DTD 驗(yàn)證,那么必須將作為參數(shù)實(shí)體的 HTML 實(shí)體包括在現(xiàn)有的 DTD 中,如下所示:
<!ENTITY % HTMLENT SYSTEM "http://msdn.microsoft.com/xml/general/htmlentities.dtd">
%HTMLENT;<!ENTITY % HTMLENT SYSTEM "http://msdn.microsoft.com/xml/general/htmlentities.dtd">
%HTMLENT;
它將定義所有 HTML 實(shí)體,以便在 XML 文檔中使用它們。

在元素內(nèi)容中如何處理空白字符? 

XML DOM 有三種訪問元素文本內(nèi)容的方式:

屬性 行為 
nodevalue 按照原始的 XML 源中指定的那樣,返回 TEXT、CDATA、COMMENT 和 PI 節(jié)點(diǎn)上的原始文本內(nèi)容(包括空白字符)。對于 ELEMENT 節(jié)點(diǎn)和 DOCUMENT 本身,則返回空值。 
數(shù)據(jù) 與 nodevalue 相同 
文本 重復(fù)連接指定子樹中的多個(gè) TEXT 和 CDATA 節(jié)點(diǎn)并返回組合結(jié)果。 

注意: 空白字符包括新行、tab 和空格。

nodevalue 屬性通常返回原始文檔中的內(nèi)容,與文檔如何加載和當(dāng)前 xml:space 范圍無關(guān)。

文本屬性連接指定子樹中的所有文本并擴(kuò)展實(shí)體。這與文檔如何加載、preserveWhiteSpace 開關(guān)的當(dāng)前狀態(tài)和當(dāng)前 xml:space 范圍有關(guān),請看如下所示:

preserveWhiteSpace = true when the document is loaded preserveWhiteSpace=true preserveWhiteSpace=true preserveWhiteSpace=false preserveWhiteSpace=false 
xml:space=preserve xml:space=default xml:space=preserve xml:space=default 
保留 保留 保留 保留并截?cái)?nbsp;

preserveWhiteSpace = false when the document is loaded preserveWhiteSpace=true preserveWhiteSpace=true preserveWhiteSpace=false preserveWhiteSpace=false 
xml:space=preserve xml:space=default xml:space=preserve xml:space=default 
半保留 半保留并截?cái)?nbsp;半保留 半保留并截?cái)?nbsp;


此處的保留表示和原始 XML 文檔中完全相同的原始文本內(nèi)容,截?cái)嘁馕吨皩?dǎo)和尾部空格已經(jīng)刪除,半保留意味著保留了“重要的空白字符”并規(guī)范化了“不重要的空白字符”。重要的空白字符是文本內(nèi)容內(nèi)部的空白字符。不重要的空白字符是標(biāo)記之間的空白字符,請看如下所示:

<name>\n
\t<first>    Jane</first>\n
\t<last>Smith     </last>\n
</name>
在本示例中,紅色是可以忽略的不重要的空白字符,而綠色是重要的空白字符,因?yàn)樗俏谋緝?nèi)容的一部分,因此有不可忽略的重要含義。所以在本例中,文本屬性返回下列結(jié)果:

狀態(tài) 返回值 
保留 "\n\t    Jane\n\tSmith    \n"
 
保留并截?cái)?nbsp;"Jane\n\tSmith"
 
半保留 "    Jane Smith    "
 
半保留并截?cái)?nbsp;"Jane Smith"
 

請注意“半保留”將規(guī)范化不重要的空白字符,例如,新行和 tab 字符將退化為單個(gè)空格。如果更改 xml:space 屬性和 preserveWhiteSpace 開關(guān),那么文本屬性將返回相應(yīng)的不同值。

CDATA and xml:space="preserve" subtree boundaries 
在下面的例子中,CDATA 節(jié)點(diǎn)或“保留”節(jié)點(diǎn)的內(nèi)容將得到連接,原因是它們不參與不重要的空白字符規(guī)范化。例如:

<name>\n
\t<first> Jane </first>\n
\t<last><![CDATA[     Smith     ]></last>\n
</name>
在這種情況下,CDATA 節(jié)點(diǎn)內(nèi)部的空白字符不再與“不重要”空白字符“合并”,并且不會截?cái)唷R虼恕鞍氡A舨⒔財(cái)唷鼻闆r將返回下列內(nèi)容:

"Jane      Smith     "
在此,</first> 和 <last> 標(biāo)記之間的不重要的空白字符將包括在內(nèi),與 CDATA 節(jié)點(diǎn)的內(nèi)容無關(guān)。如果用下列內(nèi)容代替 CDATA,那么將返回相同結(jié)果:

<last xml:space="preserve">     Smith     </last>
實(shí)體是特殊的 

實(shí)體是作為 DTD 的一部分加載和分析的,并且顯示在 DOCTYPE 節(jié)點(diǎn)下。它們不一定要有任何 xml:space 范圍。例如:

<!DOCTYPE foo [
<!ENTITY Jane "<employee>\n
\t<name> Jane </name>\n
\t<title>Software Design Engineer</title>\n
</employee>">
]>
<foo xml:space="preserve">&Jane;</foo>
假定 preserveWhiteSpace=false(在 DOCTYPE 標(biāo)記范圍內(nèi)),在分析實(shí)體時(shí)不重要的空白字符丟失。實(shí)體將不會有空白字符節(jié)點(diǎn)。樹將類似于:

DOCTYPE foo
    ENTITY: Jane
        ELEMENT: employee
            ELEMENT: name
                TEXT: Jane 
            ELEMENT: title
                TEXT>:Software Design Engineer
    ELEMENT: foo
       ATTRIBUTE: xml:space="preserve"
       ENTITYREF: Jane

請注意,在 DOCTYPE 內(nèi)部 ENTITY 節(jié)點(diǎn)下顯露的 DOM 樹不包含任何 WHITESPACE 節(jié)點(diǎn)。這意味著 ENTITYREF 節(jié)點(diǎn)的子節(jié)點(diǎn)也沒有 WHITESPACE 節(jié)點(diǎn),即使實(shí)體引用在 xml:space="preserve" 的范圍內(nèi)也是這樣。

給定文檔中引用的每個(gè) ENTITY 的實(shí)例通常都有相同的樹。

如果實(shí)體必須絕對保留空白字符,那么它必須在自己內(nèi)部指定自己的 xml:space 屬性,或者文檔 preserveWhiteSpace 開關(guān)必須設(shè)置為 true。

如何處理屬性中的空白字符? 

有幾種方式可以訪問屬性值。IXMLDOMAttribute 接口有 nodevalue 屬性,它等價(jià)于作為 Microsoft 擴(kuò)展的 nodevalue 和 text 屬性。這些屬性返回:屬性 返回的文本 
attrNode.nodevalue
attrNode.value
getAttribute("name") 返回和原始文檔中完全相同的內(nèi)容(和擴(kuò)展的實(shí)體)。 
attrNode.nodeTypedvalue Null 
attrNode.text 除了前導(dǎo)和尾部的空白字符已經(jīng)截?cái)嘀猓渌c nodevalue 相同。 


“XML 語言”規(guī)范為 XML 應(yīng)用程序定義了下列行為:屬性類型 返回的文本 
CDATA ID、IDREF、IDREFS、ENTITY、ENTITIES、NOTATION、枚舉 
半規(guī)范化 全規(guī)范化 
在此半規(guī)范化代表將新行和 tab 字符轉(zhuǎn)換為空格,但是多個(gè)空格不會退化為一個(gè)空格。

在 XML 對象模型中如何處理空白字符? 

有些時(shí)候,XML 對象模型將顯示包含空白字符的 TEXT 節(jié)點(diǎn)。空白字符被截?cái)嗪螅喟霑硪恍┗靵y。例如下面的 XML 例子:

<?xml version="1.0" ?>
<!DOCTYPE person [
  <!ELEMENT person (#PCDATA|lastname|firstname)>
  <!ELEMENT lastname (#PCDATA)>
  <!ELEMENT firstname (#PCDATA)>
]>
<person>
  <lastname>Smith</lastname>
  <firstname>John</firstname>
</person>

生成下列樹:

Processing Instruction: xml
DocType: person
ELEMENT: person
 TEXT: 
 ELEMENT: lastname
 TEXT: 
 ELEMENT: firstname
 TEXT: 

名字和姓氏兩邊是只包含空白字符的 TEXT 節(jié)點(diǎn),因?yàn)椤皃erson”元素的內(nèi)容模型是 MIXED;它包含 #PCDATA 關(guān)鍵字。MIXED 內(nèi)容模型指定元素之間可以有文本存在。因此,下面的內(nèi)容也是正確的:

<person>
My last name is <lastname>Smith</lastname> and my first name is
<firstname>John</firstname>
</person>

結(jié)果是類似于下面的樹:

ELEMENT: person
 TEXT: My last name is
 ELEMENT: lastname
 TEXT: and my first name is
 ELEMENT: firstname
 TEXT: 

如果沒有單詞“is”之后和 <lastname>之前的空白字符,以及 </lastname>之后和單詞“and”之前的空白字符,那么句子便無法理解。因此,對于 MIXED 內(nèi)容模型來說,文字組合、空白字符和元素都是相關(guān)的。對于非 MIXED 內(nèi)容模型來說則不是這樣。

要使只有空白字符的 TEXT 節(jié)點(diǎn)消失,請從“person”元素聲明中刪除 #PCDATA 關(guān)鍵字:

<!ELEMENT person (lastname,firstname)>

結(jié)果是下面清晰的樹:

Processing Instruction: xml
DocType: person
ELEMENT: person
 ELEMENT: lastname
 ELEMENT: firstname


XML 聲明做什么? 

XML 聲明必須列在 XML 文檔的頂部:

<?xml version="1.0" encoding="utf-8"?>
它指定下面的項(xiàng)目:

該文檔是 XML 文檔。在丟失或者還沒有指定 MIME 類型時(shí) MIME 探測器可以用它來檢測文件是否為類型 text/xml。 
文檔符合 XML 1.0 規(guī)范。在以后 XML 有其他版本時(shí)這一點(diǎn)很重要。 
文檔字符編碼。編碼屬性是可選的,默認(rèn)為 UTF-8。 
注意:XML 聲明必須在 XML 文檔的第一行,因此下面的 XML 文件:

<!--HEADLINE="Dow closes as techs get hammered"-->
<?xml version="1.0"?> 
產(chǎn)生下面的分析錯(cuò)誤:

無效的 xml 聲明。
行 0000002:     <?xml version="1.0"?>
位置  0000007: ------^
注意:XML 聲明是可選的。如果需要在頂部指定注釋或者處理指令,那么請不要放入 XML 聲明。但是,默認(rèn)的編碼將為 UTF-8。

如何以可讀格式打印我的 XML 文檔? 

在用 DOM 從零開始構(gòu)造文檔以產(chǎn)生 XML 文件時(shí),任何內(nèi)容都在一行上,相互之間沒有空格。這是默認(rèn)的行為。

構(gòu)造在 Internet Explorer 5 中的默認(rèn) XSL 樣式表,以可讀格式顯示和打印 XML 文檔。例如,如果已經(jīng)安裝了 IE5,請嘗試查看 nospace.xml 文件。瀏覽器中應(yīng)該顯示下面的樹:

- <ORDER>
 - <ITEM NAME="123">
    <NAME>XYZ</NAME> 
    <PRICE>12.56</PRICE> 
   </ITEM> 
  </ORDER>
在 XML 中沒有插入空白字符。

打印可讀 XML 是非常有趣的,特別是有定義不同類型內(nèi)容模型的 DTD 時(shí)。例如,在混合內(nèi)容模型 (#PCDATA) 下不能插入空格,因?yàn)樗赡芨淖儍?nèi)容的含義。比如請考慮下面的 XML:

<B>E</B><I>lephant</I>
這最好不輸出為:

<B>E</B>
<I>lephant</I>
因?yàn)閱卧~邊界不再正確。

所有這些都使自動(dòng)化打印成為問題。如果不需要打印可讀 XML,那么可以使用 DOM 在適當(dāng)?shù)奈恢貌迦肟瞻鬃址鳛槲谋竟?jié)點(diǎn)。


如何在 DTD 中使用名稱空間? 要在 DTD 中使用名稱空間,請?jiān)谑褂盟脑氐?nbsp;ATTLIST 聲明中聲明它,如下所示:

<!ELEMENT x:customer ANY >
<!ATTLIST x:customer xmlns:x CDATA #FIXED "urn:...">

名稱空間類型必須為 #FIXED。屬性的名稱空間也是這樣:
<!ELEMENT customer ANY >
<!ATTLIST customer
          x:value CDATA #IMPLIED
          xmlns:x CDATA #FIXED "urn:...">

名稱空間和 XML 架構(gòu) 
DTD 和 XML 架構(gòu)不能混合。例如,下面的

xmlns:x CDATA #FIXED "x-schema:myschema.xml"

將不導(dǎo)致使用在 myschema.xml 中定義的架構(gòu)定義。對 DTD 和 XML 架構(gòu)的使用是互斥的。

如何在 Visual Basic 中使用 XMLDSO? 

使用下面的 XML 作為例子:

<contacts>
 <person>
  <name>Mark Hanson</name> 
  <telephone>206 765 4583</telephone> 
 </person>
 <person>
  <name>Jane Smith</name> 
  <telephone>425 808 1111</telephone> 
 </person>
</contacts>
可以按如下方式綁定到 ADO 記錄集:

創(chuàng)建新的 VB 6.0 項(xiàng)目。 
添加對 Microsoft ActiveX Data Objects 2.1 或更高版本、Microsoft Data Adapter Library 和 Microsoft XML 2.0 版的引用。 
用下面的代碼將 XML 數(shù)據(jù)加載到 XML DSO 控件中:
Dim dso As New XMLDSOControl
Dim doc As IXMLDOMDocument
Set doc = dso.XMLDocument
doc.Load ("d:\test.xml")

用下面的代碼將 DSO 映射到使用 DataAdapter 的新記錄集對象中:
Dim da As New DataAdapter
Set da.Object = dso
Dim rs As New ADODB.Recordset
Set rs.DataSource = da
訪問數(shù)據(jù):
MsgBox rs.Fields("name").value

結(jié)果顯示字符串“Mark Hanson” 
如何在 Java 中使用 XML DOM? 

必須已經(jīng)安裝 MSXML.DLL 的 IE5 版本。在 Visual J++ 6.0 中,從項(xiàng)目菜單選擇添加 COM 包裝程序,然后從 COM 對象列表中選擇“Microsoft XML 1.0”。該操作將把所需的 Java 包裝程序構(gòu)造到稱為“msxml”的新軟件包中。這些預(yù)先構(gòu)造的 Java 包裝程序也可以下載。類可以按如下方法使用:

import com.ms.com.*;
import msxml.*;
public class Class1
{
  public static void main (String[] args)
  {
    DOMDocument doc = new DOMDocument();
    doc.load(new Variant("file://d:/samples/ot.xml"));
    System.out.println("Loaded " + doc.getDocumentElement().getNodeName());
  }
}
代碼示例將從 sun religion 示例中加載 3.8MB 測試文件“ot.xml”。Variant 類用于包裝 Win32 VARIANT 基本類型。

因?yàn)樵诿看螜z索節(jié)點(diǎn)時(shí)實(shí)際上都獲得了新的包裝程序,因此不能在節(jié)點(diǎn)上使用指針比較。因此,不要使用下面的代碼,

IXMLDOMNode root1 = doc.getDocumentElement();
IXMLDOMNode root2 = doc.getDocumentElement();
if (root1 == root2)...
而要使用下面的代碼:

if (ComLib.isEqualUnknown(root1, root2)) ....
.class 包裝程序的總大小大約為 160KB。但是,為了與 W3C 規(guī)范完全符合,應(yīng)該只使用 IXMLDOM* 包裝程序。下面的類是舊的 IE 4.0 XML 接口,可以從 msxml 文件夾中刪除它們:

IXMLAttribute*, 
IXMLDocument*, XMLDocument* 
IXMLElement*, 
IXMLError*, 
IXMLElementCollection*, 
tagXMLEMEM_TYPE* 
_xml_error* 
這使大小減少為 147KB。同時(shí)還可以刪除下面的項(xiàng)目:

DOMFreeThreadedDocument
在 Java 應(yīng)用程序中從多個(gè)線程訪問 XML 文檔。 
XMLHttpRequest
用 XML DAV HTTP 擴(kuò)展與服務(wù)器通信。 
IXTLRuntime
定義 XSL 樣式表腳本對象。 
XMLDSOControl
綁定到 HTML 頁面中的 XML 數(shù)據(jù)。 
XMLDOMDocumentEvents
在分析過程中返回回調(diào)。 
這可以將大小減少到 116KB。要使它更小,請考慮 DOM 本身有兩層的事實(shí):核心層包括:

DOMDocument, IXMLDOMDocument 
IXMLDOMNode* 
IXMLDOMNodeList* 
IXMLDOMNamedNodeMap* 
IXMLDOMDocumentFragment* 
IXMLDOMImplementation 
IXMLDOMParseError 
和用戶可能需要保留的 DTD 信息:

IXMLDOMDocumentType 
IXMLDOMEntity 
IXMLDOMNotation 
XML 文檔中的所有節(jié)點(diǎn)類型都是 IXMLDOMNode,它提供全部功能,但是存在每種節(jié)點(diǎn)類型的更高級別的包裝程序。因此,如果修改 DOMDocument 包裝程序并將這些特定類型更改為使用 IXMLDOMNode,那么所有下面的接口都可以刪除:

IXMLDOMAttribute 
IXMLDOMCDATASection 
IXMLDOMCharacterData 
IXMLDOMComment 
IXMLDOMElement 
IXMLDOMProcessingInstruction 
IXMLDOMEntityReference 
IXMLDOMText 
刪除這些將使大小減少到 61KB。但是,對 IXMLDOMElement 來說,getAttribute 和 setAttribute 方法都是有用的。否則需要使用:

IXMLDOMNode.getAttributes().setNamedItem(...)




haogj 2006-03-05 20:34 發(fā)表評論
]]>
主站蜘蛛池模板: 一区二区免费国产在线观看| 免费久久精品国产片香蕉| 新最免费影视大全在线播放| 亚洲精品午夜在线观看| 亚洲精品一品区二品区三品区| 成人性生交大片免费看午夜a| 91精品导航在线网址免费| eeuss影院www天堂免费| 最新亚洲人成网站在线观看 | 国产无遮挡又黄又爽免费网站| 亚洲乱码国产乱码精华| 亚洲图片激情小说| 亚洲AV无码国产精品色午友在线| 亚洲一区二区三区在线播放| 性做久久久久免费观看| 成人免费视频一区二区三区| 欧洲乱码伦视频免费| 131美女爱做免费毛片| a国产成人免费视频| 久青草视频在线观看免费| 乱淫片免费影院观看| 国产亚洲精品成人久久网站| 亚洲精品精华液一区二区| 亚洲夂夂婷婷色拍WW47| 亚洲综合av一区二区三区| 亚洲日本在线电影| 亚洲中文字幕一区精品自拍| 亚洲一区AV无码少妇电影| 亚洲最大的成人网| 久久亚洲欧美国产精品| 亚洲AV性色在线观看| 色天使色婷婷在线影院亚洲 | 亚洲 综合 国产 欧洲 丝袜| 国产v片免费播放| 亚洲AV无码一区二区三区国产| 亚洲片一区二区三区| 在线观看国产区亚洲一区成人 | 国产精品亚洲精品爽爽| 久久亚洲精品无码av| 牛牛在线精品免费视频观看| 最好2018中文免费视频|