Delphi 對XML的支持---TXMLDocument類
Delphi7 支持對XML文檔的操做,能夠經過TXMLDocument類來實現對XML文檔的讀寫。能夠利用TXMLDocument把XML文檔讀到內存中,從而能夠進行編輯、保存操做。TXMLDocument類是經過DOM(文檔對象模型)接口來訪問XML文檔中的各個元素的。對於DOM接口的實現有多種方式,Delphi支持的方式有:1)微軟的MSXML SDK,這種方式是經過COM對象來實現;2) Apache 的Xerces的實現方式;3)另一種是開源OpenXML實現方式。對於不一樣的接口實現方式能夠經過設定TXMLDocument的DOMVender來進行控制。
支持XML的Delphi單元主要存在與…\Borland\Delphi7\Source\Xml目錄下,主要包括:XMLIntf,XMLDoc,xmldom,msxmldom,xercesxmldom,xdom,oxmldom等單元。
l XMLIntf――包括了Borland本身定義的XML文檔的接口;
l XMLDoc――是對XMLIntf中所定義接口的Borland實現;
l Xmldom――定義了DOM(文檔對象模型)接口,這裏對DOM接口進行了Borland的實現;
l Msxmldom――實現微軟對Xmldom中定義的接口的實現,主要調用微軟的COM對象來實現,對Xmldom中定義接口的封裝;
l Xercesxmldom――Borland經過Xerces XML DOM方式來實現對Xmldom中定義接口的封裝;
l Oxmldom――Borland經過使用OpenXML來實現對Xmldom中定義接口的封裝;
TXMLDocument類的屬性,請參考Borland的幫助文件;
讀寫XML文檔
l 讀取XML文檔
一般狀況下不經過直接使用TXMLDocument對象來進行XML文件的讀取,而是使用XMLDoc單元中提供的幾個有用的函數來讀取XML文檔,這些函數包括:
function LoadXMLDocument(const FileName: DOMString): IXMLDocument;
function LoadXMLData(const XMLData: DOMString): IXMLDocument; overload;
function LoadXMLData(const XMLData: string): IXMLDocument; overload;
function NewXMLDocument(Version: DOMString = '1.0'): IXMLDocument;
能夠看出這些函數所有返回的是IXMLDocument接口,獲得了IXMLDocument接口在進行文檔的操做;
這些函數都是經過建立TXMLDocument對象來實現對XML文檔的讀取的;其中NewXMLDocument僅僅建立一個IXMLDocument接口。
能夠這樣利用NewXMLDocument來讀取XML文檔:
XMLDoc := NewXMLDocument;
XMLDoc.LoadFromFile(FileName);
l 保存XML文檔
能夠經過下面的方式來保存XML文檔:
XMLDoc := NewXMLDocument;
iRoot := IXMLDoc.CreateNode('TestXMLDocument’);
XMLDoc.DocumentElement := iRoot;
…
XMLDoc.SaveToFile(FileName);
能夠看出經過接口來操做XML文檔是很是方便的;
選用不一樣類型的XML解析方式
上面已經提到有三種方式實現DOM,也就是能夠應用Borland提供的3種不一樣的XML解析器來對XML文檔進行解析;
l 三種解析器
1、微軟的解析器(MSXML SDK)
微軟解析器主要應用在Windows中,在安裝MSXML SDK的時候會安裝解析器,同時IE瀏覽器也提供瞭解析器,這個解析器是一個COM。
2、Apache的Xerces解析器
Borland本身實現了一個Xerces解析器,這個能夠經過調用xercesxmldom.dll模塊來實現;若是使用這個解析器可能須要同應用程序一塊兒進行分發xercesxmldom.dll,XercesLib.dll,CC3260MT.DLL三個DLL文件
3、OpenXML解析器
這個解析器的源代碼存在於xdom.pas單元中,這個能夠經過http://www.philo.de/xml/進行跟新下載,這個是一個德國人寫的XML解析器;
l 使用不一樣解析器的比較
對於三種方式的解析器比較以下:
1、微軟的解析器
微軟的解析器固然好了,可是也不能排除存在的意外狀況,在我我的的經驗中,至少咱們公司對於XML解析的方式,只有在IE6.0以上的版本纔可以正常的工做;
至於,Borland一樣是經過引入MSXML.DLL的接口來實現的,因此能夠推理出,一樣存在一樣的問題;這個經過研究TMSDOMImplementation(msxmldom單元中)的實現方式能夠獲得證實,實現的過程當中經過調用CoCreateInstance函數接口來實現解析的;
在發佈解析XML的代碼的時候可能就會存在因爲IE的本版的不一樣,須要把IE6.0一同發佈,比較麻煩;
2、Borland的Xerces解析器
這種方式的解析器是經過 LoadLibrary(PChar(LibName));函數,LibName的內容是xercesxmldom.dll(Windows平臺),libxercesxmldom.so.1(Linux平臺)。那麼就須要隨同應用程序一塊兒發佈的Dll,就包括了xercesxmldom.dll,XercesLib.dll,CC3260MT.DLL;
這個發佈相對於發佈不一樣版本的IE6.0來講要相對簡單一些;
3、OpenXML解析器
因爲存在xdom.pas單元,這個單元中包含了徹底的XML解析的源代碼,那麼應用這種方式,能夠避免軟件發佈的種種問題,這是因爲解析的代碼被靜態編譯在應用程序內部。惟一很差的地方就是應用程序的體積可能要大一些;
l 如何使用不一樣的解析器
咱們能夠寫一個函數來使用不一樣的解析器;
function NewDiffXmlDocument(DOMVender: string;
Version: DOMString = '1.0'): IXMLDocument;
var
XMLDoc : TXMLDocument;
begin
XMLDoc := TXMLDocument.Create(nil);
XMLDoc.DOMVendor := GetDOMVendor(DOMVender);
Result := XMLDoc;
Result.Active := True;
if Version <> '' then
Result.Version := Version;
end;
其中DOMVender若是用Borland提供的三種方式進行解析的話,分別取值是:
Microsoft――存在於msxmldom.pas單元中的SMSXML常量;
Xerces――存在於xercesxmldom .pas單元中的SXercesXML常量;
OpenXML――存在於oxmldom.pas單元中的SOpenXML常量;
這個是因爲在msxmldom,xercesxmldom,oxmldom三個單元的initailization部分,都經過調用RegisterDOMVendor函數,註冊了不一樣的解析器接口;
固然,Borland一樣提供了一種能夠靈活進行擴展的機制來擴展用戶本身的解析器,這個須要繼承,TDOMVendor類(存在於xmldom單元中)。實際上,Borland本身就是經過這種方式來實現不一樣方式解析器的;具體的實現過程能夠經過參考oxmldom單元中對xdom的封裝;
結論
Delphi做爲一個成功的開發工具,它自身實現的對XML的支持,確定比網絡上某些實現要穩定、高效的多,咱們沒有必要再進行另外的封裝什麼MSXML.DLL的COM接口。固然,能夠本身實現不一樣的XML解析器,也能夠應用已經存在的解析器。同時,能夠看出Delphi對於XML的支持也是很是完善的。
delphi操做xml學習筆記 之二 簡單讀寫
關鍵字: xml 簡單讀寫 dom
分類: 我的專區
密級: 公開
XML的二十個熱點問題
翻譯:Chen Zhihong
這些日子,幾乎每一個人都在談論XML (Extensible Markup Language),可是不多有人真正理解其含義。XML的推崇者認爲它可以解決全部HTML不能解決的問題,讓數據在不一樣的操做系統或應用之間進行靈活交換。確實,全部的觀察家們都贊成XML將引起一場內容發佈和知識交換的革命。誰先進入這個領域,誰就可以大獲其利。
這裏的20個有關XML的熱門問題可以讓你成爲一XML「專家」,或至少讓你可以在從此看準XML的發展方向。
1 什麼是XML? 11 OSD和CDF與XML的關係如何?
2 XML何以重要? 12 電子商務(e-commerce)和XML?
3 SGML、HTML和XML有什麼聯繫? 13 XML中的層疊樣式?
4 如何實現XML? 14 XML如何改進超連接?
5 什麼是文件類型定義(DTD)? 15 服務器上支持XML嗎?
6 什麼是格式完整和有效的文件? 16 誰應該學習XML?
7 如何在瀏覽器中閱讀XML? 17 有哪些編寫XML的工具可供我使用?
8 RDF和XML有何聯繫? 18 XML的國際化?
9 Netscape瀏覽器中如何實現XML? 19 XML的將來在哪裏?
10 Microsoft瀏覽器中如何實現XML? 20 哪裏能學到更多的XML知識?
1.什麼是XML?
XML表明擴展標識語言(Extensible Markup Language). 由萬維網聯盟(W3C)帶頭, XML在1998年2月10日成爲正式的規範.
XML開發者會告訴你XML不是一種語言,而是一個定義其餘語言的系統. 你可能已經據說過, 或使用過這些語言中的一種,--如Microsoft支持"推技術"的 Channel Definition format(CDF).
正從事於XML相關建議工做的W3C, 稱XML爲"表達數據中結構 的共同語法". 結構化的數據指的是其內容,意義或應用被標記的數據. 例如, HTML中<H1>標記指定文本爲某一字體和大小, XML的標記將明確肯定信息的種類: <BYLINE>標記能夠識別文檔的做者, <PRICE>標記能夠在一個存貨清單中包含某一項目的成本 .
經過將結構,內容和表現分離, 同一個XML源文檔只寫一次, 能夠用不一樣的方法表現出來: 在計算機屏幕上, 在手提電話顯示屏上, 在爲盲人服務的設備上翻譯成語音, 等等. 它能夠在可能開發的任何通信產品上工做. 一個XML文檔所以能夠比其書寫時的做者和顯示技術生存得更久.
因此, XML將不只限於Internet, 例如, 能夠服務於整個出版業, 特別是對於想製做可出如今多種媒體上的文檔的人. 一些使用Standard Generalized Markup Language (SGML)多年的大型文檔出版商將轉向XML. 還有, 獨立於平臺的XML是爲Web開發的, 這是它將最具影響的地方.
XML在Web的真正實力在於它是如何與文檔對象模型(Document Object Model,DOM)交互的. DOM定義了訪問XML文檔數據的接口.
程序員利用DOM能夠用標準的方法編寫動態的內容. 換句話說, 他們可使用它來使瀏覽器文檔樹中的一部分特定內容按照必定的方式表現, 例如, 當用戶將鼠標移至文字上時, 這些文字變成藍色. Netscape Navigator 和 Microsoft Internet Explorer瀏覽器都有各自的DOM, 可是他們都稱將在其下一版本的瀏覽器中支持W3C 的標準DOM.
2.XML何以重要?
Web領袖之間的說法是內容至上.但是不幸地是:內容常常和其表現緊密結合.請問你多少次在網頁中遇到一個小小的提示:"最好在800x600像素的分辨率上顯示"?
XML將幫助解決以上問題, 由於網站建設者不用再指明在哪裏顯示什麼, 而是指明文檔 的結構. 例如, 你能夠說明文檔的標題, 做者, 關聯文檔的清單, 等等. 而後, 任何一個有XML瀏覽器的設備均可以給出最適合它的文檔版本, 這樣的設備能夠是一個掌上型計算機, 置頂盒, 或高速的工做站.
可是, 也許XML的最佳特性是其內在的可擴展性. 公司和組織可以擴展XML來知足新的挑戰和應用. 一個基於XML的語言已經在使用--微軟的Channel Definition format (CDF)-- 還有更多將出現, 包括 Resource Definition format (RDF) 和 Open Software Description (OSD).
XML 也允諾成爲交換數據 和文檔的標準機制. 例如, XML可能成爲不一樣廠商的數據庫在Internet上交換信息的一種方法.如今準確地決定XML的方向還有一些早. 可是, 其各類可能性是使人敬畏的,這就是爲何圍繞着XML有如此多的激動的一個重要緣由.
3.SGML、HTML和XML有什麼聯繫?
SGML是在文字處理應用中表達數據的一個方法. 它已經出現十多年了, XML和HTML都是從SGML 發展而來的文檔形式. 所以, 它們都有一些共同點, 如類似的語法和標記的使用.可是HTML是SGML的一個應用, 而XML是SGML的一個子集. 區別是重要的. 基本上HTML不能用來定義新的應用, 而XML能夠. 例如,RDF和CDF都是使用XML定義的應用. XML和HTML更象表兄弟, 而不是親兄弟. 事實上, XML和SGML是兼容的 -- XML文檔能夠經過任何SGML製做或瀏覽工具閱讀. 可是, XML沒有SGML那麼複雜, 它是設計用於有限帶寬的網絡的, 如Internet. XML規範的合做者Tim Bray說, XML的設計出發點是取SGML的優勢, 去除複雜的部分, 使其保持輕巧, 能夠在Web上工做.
HTML,SGML和XML將繼續用於其合適的地方, 它們中的任何一個不會使其餘一個廢棄. HTML還是在Web上快速出版數據的最簡單的方法, 大部分短時間的數據, 如會議議程或廣告宣傳冊. 若是數據會長期使用, 而且須要更多的一些結構, Web建造者將願意使用XML. 不一樣於HTML和XML, SGML可能永遠不會在Internet上被普遍接受, 由於它歷來沒有爲某個網絡協議的需求而設計或優化過. 對於高端的, 複雜結構的出版應用, SGML將繼續適用.
4.如何實現XML?
XML將以幾個不一樣的方式應用. 一個是在人機之間交換數據, 如從Web服務器至用戶的瀏覽器. 另一個是在不一樣的應用之間交換數據, 或者是機器之間交換數據.
在這些狀況下, 你均可能須要三層架構: 後端數據庫, 針對數據的處理邏輯的中間層服務器, 以及數據進一步顯示和處理的客戶端. 數據庫能夠從多個數據來源接收信息, 可能已是XML格式的數據. 中間層而後收集數據並在最終的表現層上輸出和表現..
如今, 網頁有時候以這種方法傳送 --CNET的NEWS.COM從一個數據庫中發表數據.可是要得到一頁的新的視圖,如NEWS.COM的新的「打印機友好」選項, 服務器必須產生一個新的頁面. 一份適當格式化的XML文檔將容許客戶端的應用爲不一樣的媒體修改文檔的表現形式, 好比爲打印機.
5.什麼是DTD?
文檔類型定義(DTD)是一套關於標記符的語法規則.它告訴你能夠在文檔中使用哪些標記符,它們應該按什麼次序出現,哪些標記符能夠出現於其它標記符中,哪些標記符有屬性,等等.DTD原來是爲使用SGML開發的, 它能夠是XML文檔的一部分, 可是它一般是一份單獨的文檔或者一系列文檔 由於XML自己不是一種語言,而是定義語言的一個系統,它沒有象HTML同樣擁有一個通用的DTD.相反, 想使用XML進行數據交換的工業或組織能夠定義它們本身的DTD. 若是一個組織想用XML來標識僅在內部使用的文檔, 它能夠創造本身私有的DTD. 好比 華爾街雜誌交互版本擁有一個 DTD 來詳細說明每一版, 其中有關於頁, 文章, 概要, 標題下署名等等的信息.刊物目前使用SGML DTD,可是它也正在開發一個XML版本. 關於DTD並非沒有爭議的. 一些人感到它給商業業務增長了實實在在的價值, 而一些人感受它限制了創造性. 還有一些人認爲DTD有用, 可是還作得不夠. 微軟正嘗試用它的XML數據提議來解決上一個抱怨, 可是批評者說這些改進應該在DTD規範自己進行.
一些供應商, 包括微軟, 已經提議了替代DTD的一個方法, 稱爲schema. 他們已經將其以XML數據提交給了W3C. 就象DTD, Schema提供了文檔的規則, 並指出用什麼標記符, 標記符的屬性, 之間的聯繫, 等等.可是,不一樣於DTD, schema能夠定義數據類型. 例如, DTD可能有一個標記符 <PRICE>, 而標記符之間的內容能夠是數字或字符串. Schema 能夠規定只輸入數字.這個方法顯然有其優勢, 特別是用於應用,對象,或數據庫之間的數據傳輸. 惟一的問題是它將成爲DTD規範, 仍是XML的一個擴展.
6.什麼是結構良好和有效的文件?
基本上有兩類相關的XML文檔: 結構良好的和有效的. 結構良好的 XML文檔遵照XML語法的通常規則, 這些規則比HTML和SGML的更爲嚴格. XML的字符數據決不會弔在那裏, 沒有某種結束標識符, 或者是象<MYTAG></MYTAG> 成對出現的 結束標識符, 或者是一個特別的在右尖括弧前帶有一個斜槓的 空元素 標記, 好比 <MYTAG/>; XML 標識老是以左尖括弧或 & 開始; 元素類型和屬性名稱是大小寫區分的; 屬性須要引號; 等等.
有效的 XML 文檔遵照某個特定的DTD.確認XML文檔正確性的工做主要由製做出版工具承擔, 而XML瀏覽器爲讀取XML文檔, 只須要檢查其構造的良好性. 這樣, 製做工具中的解析器得要檢查構造良好性 和 有效性, 而瀏覽器僅要考慮尋找已經構造良好的XML.
7 如何在瀏覽器中閱讀XML?
閱讀XML文檔的工具通常稱爲XML解析器, 雖然其更正式的名稱是XML處理器. XML處理器將數據傳送到應用軟件, 以作製做, 出版, 查詢, 或顯示. XML不給應用軟件提供 應用程序接口 (API), 它只是把數據傳給應用軟件. XML處理器不解析非結構良好的數據. Netscape 和 Microsoft 都已經將XML解析器包含在其瀏覽器中, 或正計劃將其包含到瀏覽器中.
XML開發者團體提供免費的XML閱讀器和解析器, 來應用到應用軟件或XML製做軟件:
Textuality的 Lark, 來自XML標準的做者之一.
Microstar的 AElfred, 一個基於Java的解析器.
DataChannel的 DXP, 前身爲著名的NXP, 或已經增長了API的Norbert的 (Mikula) XML 解析器.
8 RDF和XML有何聯繫?
若是XML提供了表達語言的能力,那麼XML應用則是特定的語言.資源描述框架(Resource Description Framework,RDF) 是這樣的一個應用軟件:使用XML的語法進行數據建模.
RDF是一種描述和訪問數據方法. 這意味着RDF是關於數據的數據, 或者說元數據. 在Web中, 這些元數據將被用於創建標準的站點地圖, 更精確的搜索結果, 和分層次的主題索引. RDF也容許智能書籤, 當被索引的網頁變化時, 書籤隨之發生變化. 若是你跟蹤內容按期更新的站點, 好比CNET的 NEWS.COM, 將頗有用.對於網站建設者,創建可被搜索引擎引用的其網站內容的元數據並不困難. 咱們很快就會有商業化的軟件, 來自動產生給定站點的RDF文件.
XML元數據也將活躍數據描述和評估的市場. 有許多評級機構在網上出現, 他們評估一切數據, 從保護孩子安全的站點到最佳電影或葡萄酒站點. RDF可使用的等級的語法來描述評級機構.人們將選擇有他們感受最合適的詞彙表的評級機構,詞彙表指的是評級機構給不一樣類型內容評級使用的特別的一套術語 -- 從性和暴力到葡萄酒酸度.
9 Netscape瀏覽器中如何實現XML?
Netscape將在Communicator/Navigator 5.0中以一個代號爲Aurora的交付部件來支持XML元數據. Aurora利用RDF來得到Netscape所稱的"桌面信息全面集成."
Aurora在網絡、桌面和數據庫之間查找和管理信息.它將在桌面上以"窗口"菜單的界面出現,會聚指向當前項目, 研究主題或平常活動等資源的指針.RDF使Aurora的導航條指向不一樣數據類型(文字處理文檔、表格數據、電子郵件消息、數據庫內容)的本地文件, 也指向Internet 或Intranet 服務器上的資源(搜索和查詢的結果、書籤連接等).
Netscape 5.0 版瀏覽器中提供了一個讀取RDF的XML解析器,在產品最終交付前會以beta版出現.除了該RDF的實現, Netscape正計劃將一個通用的XML解析器包含在瀏覽器中, 而其瀏覽器能夠和其餘的XML應用軟件一塊兒工做, 好比化學標記語言(CML)和數學標記語言(MathML).
"咱們要使Navigator成爲一個XML平臺,"Netscape原理工程師R.V. Guha這樣說.Guha 原來開發過MCF (Meta Content format), MCF 後來加入了RDF規範.
10 Microsoft瀏覽器中如何實現XML?
微軟的 Internet Explorer 4.0 是第一個實現XML的網絡瀏覽器. 微軟提供了一對XML處理器:瀏覽器所攜帶的用C++寫的解析器, 和一個Web建造者能夠從中下載和加入他們本身的應用程序的Java解析器的源代碼. Java解析器是一個有效的 解析器, 就是說它根據一個DTD或Schema來進行檢查.爲了提升性能,瀏覽器所帶的C++版的解析器是一個非有效的解析器.
據微軟的產品經理Steve Sklepowich稱, 這兩個解析器都是"通用的", 由於它們不依靠特定的XML應用, 如CDF.因爲XML數據和其表現分離, 在一個瀏覽器自己實際顯示XML的能力須要樣式表,例如XSL.
同時, 微軟使用了它所稱的XML數據源對象(XML Data Source Object,XML DSO).它應用了動態HTML的數據捆綁能力, 將一端的XML數據和另外一端的HTML數據相連接.IE 4.0訪問XML文檔,從中查詢數據, 而後做爲HTML顯示出來.
微軟也使用了 XML對象模型來讓開發者與瀏覽器中的XML數據進行交互. 它的實現是經過將HTML做爲基於文檔對象模型(DOM)的對象顯現, 儘管HTML 和 DOM 並不是直接兼容. DOM 讓腳本和程序訪問結構化的XML數據.
Sklepowich說, 雖然目前在微軟, XML的重心在瀏覽器, XML將最終出如今"任何HTML已經出現了的地方".Bill Gates 已經公開宣佈微軟Office 將來的版本將支持 XML, 並且公司也計劃支持電子郵件包和製做XML工具的標準.
11 OSD和CDF與XML的關係如何?
CDF和OSD是微軟支持的兩個XML應用.經過其XML解析器,微軟的 Internet Explorer 4.0讀CDF文件來驅動和控制推頻道所帶來的頁.根據RDF所作的工做, CDF提議又遞交給W3C,以利用RDF的能力來顯示不一樣數據元素之間的聯繫.
Open Software Description 是用於描述軟件部件的詞彙表, 帶有語法如從屬, 版本和平臺. OSD 描述如何表現一個部件的特性, 以及如何將該部件安裝到計算機上. 它能夠用於下載一個完整的軟件包, 可是它主要設計用於不斷增長的更新. OSD 單獨工做或和CDF一塊兒工做, 來定義應用頻道. OSD建議由微軟和Marimba領導的一組銷售商於1997年8月提供給W3C.
12 電子商務(e-commerce)和XML?
CommerceNet是著名的非贏利性網上商務協會,它擁有500多個成員.數年來CommerceNet努力幫助e-commerce 產品和系統一塊兒工做. 其概念是容許信息在不一樣目錄之間, 從目錄到付款系統, 在付款系統之間交換. 已經發現XML能夠在兩個重要方面幫助實現以上概念: 內容定義和信息交換.
內容定義:CommerceNet 正在定義通用於多種商業事務的數據元素. 這個稱做商務核心(Commerce Core)的東西將定義如何給諸如公司名稱、地址、價格、條款和數量等事物做標識.
信息交換:開放,基於文本的XML用於服務器之間交換事務信息很理想.CommerceNet 提議用基於XML的通用商務語言(Common Business Language,CBL)來描述產品和服務目錄軟件, 關於商業規則和系統的元數據, 以及表格和消息的軟件. 許多CBL 取自已經存在的 Electronic Data Interchange (EDI) 辭典, EDI辭典識別公認的術語, 如發票和採購訂單. 可是CBL超越EDI的商業-到-商業的重點, 包含了零售事務和橫向的供應鏈 -- 從供應商到批發商到零售商.
這樣的一個CBL應用是爲使目錄互用的產品信息互換( Product Information Exchange,PIX)規範. CommerceNet設計PIX, 以幫助供應商和他們的分銷商更容易地交換產品數據. 長遠的目標是工業組織--而非 CommerceNet--來將CBL做爲特定的DTD的一個共同基礎使用. 一些着重於工業的初步嘗試已經宣佈了:
Internt開放支付(OBI): 一個在Internet上進行國際性的商業間購物的標準.OBI基於目前的Internet標準, 如SSL(安全性)、SET(信用卡交易)和X.509(數字認證). OBI的支持者有Commerce One、Connect、Intelisys、InterWorld、Microsoft、Netscape、Open Market、和Oracle.
開放貿易協議(OTP): 一個在Web上向消費者售物的一致的, 可共同操做的環境. 規則將包括從如何降價促銷, 付款選擇, 到產品運輸, 接收和問題解決. OTP由MasterCard International, DigiCash, CyberCash, Hewlett-Packard, IBM, AT&T Universal Card, Netscape, Royal Bank of Canada, 和一些 其餘金融機構和技術公司支持.
Internet內容交換標準(ICE): Vignette, Firefly Network, 和 一些其餘公司--包括微軟--正在開發一個叫做ICE的規範, 使可以在站點之間交換在線資產, 不管那是內容, 應用程序, 或是元數據. ICE將利用現有的標準, 包括 OPS/P3P (使我的數據可靠交換), CDF,OSD和RDF.
13 XML中的層疊樣式?
由於XML將內容和表現分離, Web建造者須要新的方法來控制設計, 顯示和輸出. style sheet 是問題的答案. 目前, 有三種可用於XML的 樣式表:
Cascading style Sheets (CSS)
Extensible style Language (XSL)
Document style Semantics and Specification Language (DSSSL).
若是5.0版的瀏覽器支持XML, XML對現有的CSS標準的支持將會處理大部分基本的風格和頁面問題. 可是CSS對於專業出版商可能不夠強大. 因此, 另外一端存在着DSSSL, 一個在使用SGML的高端出版商中流行的ISO (國際標準組織)標準. 然而, DSSSL是複雜的, 它處理的打印文檔管理在Web上不多有用.
如今剩下了XSL,特別爲XML而寫的樣式表.XSL目前上交給了W3C做爲一個建議標準,其中的XSL轉換部分(XSLT)已經於1999年11月成爲正式的規範. 它給了Web開發者和用戶較HTML更多的表現靈活性. 例如, HTML的<H2>標識符在全部瀏覽器上的表現是基本同樣的, 可是XSL讓開發者指定他們的頁面元素如何表現(儘管用戶能夠在我的設置中重載它).
XSL較CSS更強大, 由於它使Web建造者建立能夠動態改變其表現的文檔. 例如, 你能夠包含這樣的程序語句, "若是一個XML元素的屬性爲數值10, 顯示爲綠色, 不然爲黑色." 或者你能夠將"僅供內部使用"做爲屬性給一個段落標上, 這樣它在某些狀況下不會出現. XSL被設計用於腳本語言如javascript.
14 XML如何改進超連接?
XML超連接比基本的HTML風格的超連接多了一些新的特性, 包括無需手寫許多javascript代碼就能建立"聰明的"連接. 並且在XML, 連接自己成爲了對象, 能夠象其餘對象同樣被管理.原來的連接規範--XLL, 或XML連接語言--正被分爲兩個不一樣的規範: XPointer 和 XLink.
XPointer: 在HTML, 要連接到一個頁面的中間, 頁面做者必須在那兒加上定位標識符. 使用XPointer, 你能夠"取址到" (不是"鏈接到")其餘人的文本的任何部分. 顯而易見, 這樣將有助於工做於法律文件, 科學和學術論文, 甚至W3C規範!
XLink: 當用戶點擊一個HTML超連接時, 當前的網頁被鏈接到的文件替代. XLink令Web創建者給連接增長行爲. 例如, 如今, 你必須用一些javascript, 使在連接處彈出一個獨立的窗口, 可是XLink讓Web創建者對連接進行編碼來執行一系列動做, 包括彈出一個連接選擇的菜單.
另外一個應用能夠是彈出一個對話框, 多是一個提醒用戶它們正要更新數據庫的警告. 連接彈出菜單可能須要用戶點擊一個框來表示在進一步處理前他們接受義務. 如今, 實現這樣的功能要寫許多的腳本代碼.
XML也讓Web創建者建立相似Web環工做的Extended Link, Web環是經過"下一個/前一個"行進來導航的本身選擇出來的關於相同主題的網站組. 對於彈出菜單太長的相關連接站點表, Web創建者能夠建立一個連接表, 這個表在不一樣的站點, 頁面時會有變化. 用戶能夠點擊一個圖標來自動轉移到環中的下一個成員. 如今這樣的功能須要 CGI scripts, 而Extended Links 提供了一個標準的, 非私有的創建資源間聯繫的方法.
仍然有更多的問題須要解決, 特別是在行爲政策方面. 必須由一種方法來協調如下三方面的關係: 文檔做者對連接所建議的行爲, 用戶所喜愛的顯示連接信息的方式, 以及是否和什麼時候忽視用戶的意願的政策.
15 服務器上支持XML嗎?
XML被設計成供長久使用的, 高價值的文檔的儲存格式. XML不是隻讓你定義標識符, 它也容許你定義文檔的儲存結構. 一篇HTML文檔僅存在於一個文件中, 而一個XML文檔能夠由存放在不一樣地點的多個文件(稱爲實體)組成. 這提出了做爲文檔存儲庫的XML服務器的概念.
服務器軟件供應商已正在支持XML:
Enigma, Insight 4.0
這是一個提供給出版商處理大型文檔的專業電子出版軟件解決方案. 目前和Insight捆綁在一塊兒的Enigma SGML/XML style Sheet Editor, 也能夠做爲一個獨立產品提供.
Hynet Technologies, Digital Library System
Digital Library System (DLS) 將文檔和文檔部件做爲標準軟件對象進行管理, 容許引入在Adobe FrameMaker和Microsoft Word中建立的文檔, 或者SGML/XML文件.
Inso, DynaText Professional Publishing System
這是一個進行索引, 搜索和製做腳本的軟件, 它能夠工做於運行在Windows NT 3.51 或 4.0, 或 Sun Solaris 2.5上的Microsoft的 IIS和 Netscape的 Enterprise and FastTrack servers.
Open Market, Folio
Open Market的 Folio 4 信息管理和發送產品將XML文檔引入帶索引的數據庫, 以在IP網絡上傳遞內容, 或將內容送至CD-ROM. 在一月份, Open Market宣佈加強對XML的支持, 容許文檔以它們的自己格式進行索引和保證安全. 同時, Folio產品也將能夠和其它基於標準的製做, 解析和生成XML文檔的解決方案相互操做. 它的產品包括 Folio siteDirector (分發信息), Folio SecurePublish (事務管理軟件), 和 Folio Publisher (電子出版).
WebMethods, Web Automation Server
Web Automation Server 幫助公司將基於瀏覽器的應用軟件和其它應用軟件的數據相結合. 它是基於XML的服務器, 使用 WebMethods本身的在機器間進行Web數據交換的WIDL (Web Interface Definition Language). (該公司已經將WIDL做爲標準提議上交給 World Wide Web Consortium.)
16 誰應該學習XML?
全部的Web創建者須要足夠了解XML,以決定是否使用它.E-commerce站點和管理數據庫中大量文檔的站點是顯然的首選對象.經理可能不須要學習XML語法或如何創建DTD,他們仍要理解XML的潛力並加以利用.若是最終的目的只是讓人來讀信息, HTML能足夠知足標識信息的要求. 可是若是你想要爲自動處理數據做準備, 你必須考慮將XML歸入你的出版系統. 並不是每個工做在Web站點的HTML製做者必須成爲XML製做者, 可是某些員工應該精通於XML--特別當站點的工做對象是值得爲未來使用而管理的數據和文檔時.固然,XML的功能也意味着複雜性--一些Web創建者已經發現他們能夠在幾天內掌握HTML的基礎, 而他們可能須要花幾個星期來適應XML.只有你本身才能決定是否值得花這些時間.
17 有哪些編寫XML的工具可供我使用?
幸運的是, Web創建者不用徹底靠他們本身從頭開始建立XML了. 市場上已經有了建立, 管理和發送XML的工具, 而且一些公司也在進行開發.
Adobe: 在1998年中期, Adobe將介紹能夠輸出到XML的 FrameMaker 和 FrameMaker+SGML 的過渡版本. 這些產品的完整版本將可以輸入XML. Adobe有 一名錶明在 W3C的XML工做組, Adobe也參與了XLink, Cascading style Sheets和 RDF的工做, 因此咱們能夠期待這些技術將在Adobe將來的產品中出現.
Allaire: HomeSite 4.0 和 Cold Fusion 4.0 都預計在今年夏天出品, 它們將支持XML, 包括style sheets. HomeSite 3.0中已經提供了一個CDF附加軟件.
ArborText: 在SGML領域內長期工做的ArborText, 於一月份發佈了XML styler, 一個免費的基於Java的XSL編輯器. 它的圖形用戶界面可讓咱們勿需知道XML語法就能進行編輯. 未來, ArborText 會把XML styler集成到Adept中, Adept是公司給打印出版提供的XML製做工具.
DataChannel: 一個免費的, 基於Java的有效的解析器, 稱爲 DXP (DataChannel XML Parser; 基於 Norbert Mikula 著名的NXP). 能夠從該公司的Web站點得到. 它新發布的是免費的XML工具包, XML 開發環境, 它包括了一套部件, 幫助人們開始學習和應用XML.
Inso: 該公司提供它稱爲的"首個集成的, 端對端的, 建立, 轉換, 存儲, 管理, 索引, 查詢XML內容, 將其發佈到Web, CD-ROM和打印機上的出版解決方案." 其產品包括 DynaTag 4.0, DynaBase 3.0, DynaText 3.1, 和所附的工具 DynaWeb.
IntraNet Solutions: Intra.doc Management System的下一版本, IntraNet Solution的基於Web的文檔管理系統, 將會管理XML部件和文檔之間的關係, 提供和第三方XML製做工具的集成連接管理, 完善在瀏覽器中XML對象的使用, 並在Intra.doc存儲庫和XML編輯器之間提供一個交互的元數據模型.
Microsoft: 微軟但願在年末交付Office 9.0, 據報道, 它將有對XML的支持.
Microstar: ActiveSG/XML 是一套在Internet上設計和配置基於事務的XML/SGML系統的工具和技術. Microstar也提供了免費的Ælfred XML 解析器.
SoftQuad: HTML 編輯器 HotMetal Pro 將很快提供 Live Data Base Pages, 一個讓開發者將HTML數據拉入數據庫並以XML來返回的附加軟件.
Vignette: StoryServer 3.2 在Web上交付能使用XML的應用和內容. 它結合了關係型數據庫, 多媒體和XML內容建立的工具. StoryServer 是一個Web內容應用平臺, 供創建, 管理, 和交付基於服務的Web應用之用, 好比在線出版, 知識管理, 和電子商務系統. (注: CNET對Vignette有財政上的興趣.)
XPublish: XPublish是一個XML出版系統, 供Web站點開發和管理, 容許開發者以XML進行製做, 或用XML構件延展目前的HTML文檔, 而後將站點以HTML來發布, 以讓任何的標準Web瀏覽器能夠訪問. 它包含了一個Cascading style Sheets編輯器.
WebMethods: 該公司製做基於XML的Web Automation 軟件, 提供商業應用軟件和Web數據的快速集成和直接訪問. 它的 Web Interface Definition Language (WIDL) 將和HTML/XML和表格的全部交互自動化, 提供在標準Web協議上表現要求-回答交互方式的一個通用方法.
固然, 若是XML在Web上無處不在, 你能夠看到幾乎每一種基於Web的應用, 特別是HTML編輯器, 數據庫軟件, 和電子商務軟件, 會迅速加入對XML的各個級別的支持.
18 XML的國際化?
XML將使Web創建者建立真正的國際性站點變得比之前都容易. 由於, 好比 Java, 它由Unicode (ISO 10646)定義, Unicode是一個國際接受的標準, 用於描述世界上全部的字母, 字型, 字符和表意符, 它包括 ASCII ISO 拉丁字符, 日本, 韓國, 中國, 印度, 希臘, 阿拉伯和其它字符. 它甚至容許字符集的混合, 例如, 一篇以日文顯示的XML文檔能夠經過一個元音變音參照到一個德文詞彙.
開發者不須要學習任何腳本語言, 以使Unicode在XML文檔中生效, 文檔在用戶的瀏覽器中用合適的字符集顯示出來.
19 XML的將來在哪裏?
就圍繞着XML的全部活動, 很難預測六個月後它會是什麼樣. XML和XLL 規範的合做者Tim Bray說, "咱們已經制做了一個設計用於通用目的的工具, 大範圍的人們對它的關注和應用證實咱們是成功的."
在短時間內, XML將可能出如今元數據應用上,如RDF.下一個大的影響將隨着文檔對象模型規範的批准而到來.Bray聲稱"XML和DOM的結合確實是給Web帶來活力的神奇子彈."
XML也應該會幫助電子商務.XML將使電子商務供應商以共同的方法給產品和其相關信息(價格,尺寸,顏色,特性)進行標識, 使用戶在Web上對不一樣的商店進行比較.
同時, Netscape和Microsoft會繼續擴大對XML瀏覽器的支持, 包括有效的和構造良好的XML文檔, 更多的XML應用, 爲XML設計的style-sheet支持, 和XML超鏈接協議. 請關注這兩個公司以及其它軟件供應商在XML製做和出版工具上的進展.
20 哪裏能學到更多的XML知識?
XML是一個複雜的事物, 對於全部Web創建者都具備深入的含意. 若是你想學習更多的東西, 這裏是一些能夠查看的好地址:
萬維網聯盟(W3C):
XML規範.
關於XML規範的討論.
Extensible style Language (XSL) W3C註釋.
Document Object Model 規範.
參與W3C規範開發的XML開發者的郵件地址清單.
XML常見問題解答:
ArborText的 XML連接和資源.
微軟的XML 站點提供了XML如何在一個天氣預報和拍賣中工做的演示.
Textuality收集了XML規範合做者Tim Bray的關於XML的FAQ和到其它資源的一些連接.
由愛爾蘭Cork University College的Peter Flynn表明W3C的XML特別興趣組維護的XML FAQ.
XML信息頁面, 達拉斯Summer Institute of Linguistics 的Robin Cover建立的SGML/XML Web頁面的一部分.
組織、持續教育:
中國XML聯盟
圖形通訊協會的XML文件
SGML Open 是一個國際性的非盈利性協會, 它提倡基於SGML家族標準的結構化文檔和數據交換. 它的InterX.org旨在成爲"XML開發者和用戶的論壇和資源中心".
huihoo.com Copyright (2001,2002,2003,2004) Allright Reseved
看完了基礎知識,下面就實踐如下吧
本實例應用了MS的MSXML2_TLB,請自行查找下載
//用於讀寫XML的最簡單的單元
unit XMLPurserUnit;
interface
uses
SysUtils, Classes, Windows, ActiveX, MSXML2_TLB;
type
//本例子經過DOM方式演示XML文件的讀寫過程
TDOMXMLpurser=class
public
{ 建立並保存XML文檔,XMLDoc:=CoDOMDocument.Create沒有辦法將文檔類型對象填加
到XMLDoc中,由於它沒有引用相應的DTD}
procedure SavePropertiesToXML(Filename: string; Props: TStrings);
{ 解析已有的XML文檔 }
//適用於節點名稱不一樣的狀況
procedure LoadPropertiesFromXML(Filename: string; Props: TStrings);
//適用於節點相同的狀況
procedure LoadFromXML(Filename: string; Props: TStrings);
end;
implementation
const
XMLTag = 'xml';
XMLPrologAttrs = 'version="1.0" encoding="UTF-8"';
XMLComment = ' Sample XML document with data about movies'#13 +
'and when and where they are showing'#13 +
'Developed by Keith Wood, 28 May 1999 ';
MovieWatcherTag = 'movie-watcher';
MoviesTag = 'movies';
MovieTag = 'movie';
Id = 'id';
Rating = 'rating';
StarringTag = 'starring';
TitleTag = 'title';
//保存XML
procedure TDOMXMLpurser.SavePropertiesToXML(Filename: string; Props: TStrings);
var
XMLDoc: IXMLDOMDocument;
i:integer;
//----------------------------------------------------------------------------
procedure AddSimpleElement(Parent: IXMLDOMElement; Field: string;
AsCDATA: Boolean = False);
var
Internal: IXMLDOMElement;
begin
Internal := IXMLDOMElement(Parent.AppendChild(
XMLDoc.CreateElement(('Field.FieldName'))));
if AsCDATA then
Internal.AppendChild(XMLDoc.CreateCDATASection(Field))
else
Internal.AppendChild(XMLDoc.CreateTextNode(Field));
end;
procedure GenerateHeaders;
var
Title: IXMLDOMElement;
begin
XMLDoc.AppendChild(XMLDoc.CreateProcessingInstruction(XMLTag, XMLPrologAttrs));
XMLDoc.AppendChild(XMLDoc.CreateComment(XMLComment));
XMLDoc.AppendChild(XMLDoc.CreateElement(MovieWatcherTag));
Title := IXMLDOMElement(XMLDoc.DocumentElement.AppendChild(
XMLDoc.CreateElement(TitleTag)));
Title.AppendChild(XMLDoc.CreateTextNode('焦點新聞'));
end;
procedure GenerateStars(Starring: IXMLDOMElement);
begin
AddSimpleElement(Starring, '(StarField)');
end;
procedure GenerateMovies(moviename:string);
var
Movies, Movie: IXMLDOMElement;
begin
Movies := IXMLDOMElement(XMLDoc.DocumentElement.AppendChild(
XMLDoc.CreateElement(MoviesTag)));
Movie := IXMLDOMElement(Movies.AppendChild(
XMLDoc.CreateElement(MovieTag)));
Movie.SetAttribute(Id, '123');
Movie.SetAttribute(Rating, '456');
AddSimpleElement(Movie, '789');
AddSimpleElement(Movie, moviename);
AddSimpleElement(Movie, '"(DirectorField)"');
GenerateStars(IXMLDOMElement(Movie.AppendChild(
XMLDoc.CreateElement(StarringTag))));
AddSimpleElement(Movie, 'FieldByName(SynopsisField)', True);
end;
//----------------------------------------------------------------------------
begin
try
XMLDoc := CoDOMDocument.Create;
GenerateHeaders;
i:=0;
repeat
GenerateMovies(Props.Strings[i]);
inc(i);
until i>=Props.Count;
Props.Text := XMLDoc.XML;
XMLDoc.save(Filename); //u8-dos格式
//Props.SaveToFile(Filename); //dos格式
finally
{ Release the DOM }
XMLDoc := nil;
end;
end;
//加載無重複屬性的XML
procedure TDOMXMLpurser.LoadPropertiesFromXML(Filename: string; Props: TStrings);
var
XMLDoc: IXMLDOMDocument;
i: Integer;
procedure LoadSubProperties(Element: IXMLDOMNode; PropPrefix: string);
var
Index: Integer;
begin
if (Element.NodeType = NODE_TEXT) or (Element.NodeType = NODE_CDATA_SECTION) then
Props.Values[Copy(PropPrefix, 2, Length(PropPrefix) - 1)] := Element.NodeValue
else
for Index := 0 to Element.ChildNodes.Length - 1 do
LoadSubProperties(Element.ChildNodes[Index], PropPrefix + '.' + Element.NodeName);
end;
begin
XMLDoc := CoDOMDocument.Create;
Props.Clear;
try
if XMLDoc.Load(Filename) then
with XMLDoc.DocumentElement do
for i := 0 to ChildNodes.Length - 1 do
LoadSubProperties(ChildNodes[i], '');
finally
XMLDoc := nil;
end;
end;
//加載XML
procedure TDOMXMLpurser.LoadFromXML(Filename: string; Props: TStrings);
var
XMLDoc: IXMLDOMDocument;
i: Integer;
procedure LoadSubProperties(Element: IXMLDOMNode; PropPrefix: string);
var
Index: Integer;
begin
if (Element.NodeType = NODE_TEXT) or (Element.NodeType = NODE_CDATA_SECTION) then
Props.Add(Copy(PropPrefix, 2, Length(PropPrefix) - 1)+'='+ Element.NodeValue)
else
for Index := 0 to Element.ChildNodes.Length - 1 do
LoadSubProperties(Element.ChildNodes[Index], PropPrefix + '.' + Element.NodeName);
end;
begin
XMLDoc := CoDOMDocument.Create;
Props.Clear;
try
if XMLDoc.Load(Filename) then
with XMLDoc.DocumentElement do
for i := 0 to ChildNodes.Length - 1 do
LoadSubProperties(ChildNodes[i], '');
finally
XMLDoc := nil;
end;
end;
initialization
{ Initialise COM }
CoInitialize(nil);
finalization
{ Tidy up }
CoUninitialize();
end.
//調用XML讀寫
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw,XMLPurserUnit;
type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
FXMLpurser:TDOMXMLpurser;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FXMLpurser:=TDOMXMLpurser.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FXMLpurser.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
filename:string;
begin
memo1.Lines.Clear;
filename:=ExtractFilePath(application.ExeName)+'MailTemplate.xml';
FXMLpurser.LoadPropertiesFromXML(filename,memo1.Lines);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
filename:string;
begin
memo1.Lines.Clear;
filename:=ExtractFilePath(application.ExeName)+'MailTemplate.xml';
FXMLpurser.LoadFromXML(filename,memo1.Lines);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
FXMLpurser.SavePropertiesToXML(ExtractFilePath(application.ExeName)+'MailTemplate1.xml',memo1.Lines);
end;
end.
//unit1對應的form
object Form1: TForm1
Left = 192
Top = 107
Width = 696
Height = 480
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object WebBrowser1: TWebBrowser
Left = 8
Top = 8
Width = 321
Height = 361
TabOrder = 0
ControlData = {
4C0000002D2100004F2500000000000000000000000000000000000000000000
000000004C000000000000000000000001000000E0D057007335CF11AE690800
2B2E126208000000000000004C0000000114020000000000C000000000000046
8000000000000000000000000000000000000000000000000000000000000000
00000000000000000100000000000000000000000000000000000000}
end
object Memo1: TMemo
Left = 336
Top = 8
Width = 345
Height = 361
Lines.Strings = (
'星球大戰1'
'星球大戰2'
'星球大戰3'
'星球大戰前傳1'
'星球大戰前傳2'
'星球大戰前傳3')
ScrollBars = ssBoth
TabOrder = 1
end
object Button1: TButton
Left = 192
Top = 384
Width = 147
Height = 25
Caption = 'LoadPropertiesFromXML'
TabOrder = 2
OnClick = Button1Click
end
object Button2: TButton
Left = 344
Top = 384
Width = 83
Height = 25
Caption = 'LoadFromXML'
TabOrder = 3
OnClick = Button2Click
end
object Button3: TButton
Left = 432
Top = 384
Width = 121
Height = 25
Caption = 'SavePropertiesToXML'
TabOrder = 4
OnClick = Button3Click
end
end
//一個最簡單的XML文件 MailTemplate.xml
<?xml version="1.0"?>
<mailTemplate>
<smtp>
<host>mail.ncisystems.com</host>
<port/>
<user>keith</user>
<from>kbwood@thingies.com</from>
</smtp>
<database>
<alias>mailtemp</alias>
<user/>
<password/>
</database>
<settings>
<pauseTime>2000</pauseTime>
<template>MailMessage.xml</template>
<testing>Y</testing>
</settings>
</mailTemplate>
delphi操做xml學習筆記 之三 進階必讀
關鍵字: xpath
分類: 我的專區
密級: 公開
學會簡單讀寫xml以後,我想大多數應用都不會停留在這一步,若是想進一步操做,就要熟悉xpath,XML 路徑語言。它是添加,刪除,查詢等進一步操做xml所必需知道的。
關於xpath 1.0的詳細介紹,參見 http://www.opendl.com/openxml/w3/TR/xpath/xpath-gb.html
XPath 2.0 簡介,參見http://www.microsoft.com/china/MSDN/library/data/xml/ThingstoKnowandAvoidWhenQueryingXMLDocumentswithXpath.mspx
要點必讀:
2.5 縮簡句法
這是一些使用縮簡句法的地址路徑例子:
para 選擇上下文節點的 para 元素孩子
* 選擇上下文節點的全部的元素孩子
text() 選擇上下文節點的全部的正文節點孩子
@name 選擇上下文節點的 name 屬性
@* 選擇上下文節點的全部的屬性
para[1] 選擇上下文節點的第一個 para 孩子
para[last()] 選擇上下文節點的最後一個 para 孩子
*/para 選擇上下文節點的全部的 para 孫子
/doc/chapter[5]/section[2] 選擇doc的第五個 chapter 的第二個 section
chapter//para 選擇上下文節點的 chapter 元素孩子的全部 para 元素子孫
//para 選擇文檔根的全部的 para 子孫,也就是選擇上下文節點所在的文檔中全部的 para 元素
//olist/item 選擇上下文節點所在的文檔中全部的以 olist 爲父的 item 元素
. 選擇上下文節點
.//para 選擇上下文節點的 para 元素子孫
.. 選擇上下文節點的父
../@lang 選擇上下文節點的父的 lang 屬性
para[@type="warning"] 選擇的上下文節點的全部的有屬性 type 且值爲 warning 的 para 孩子
para[@type="warning"][5] 選擇的上下文節點的全部的有屬性 type 且值爲 warning 的 para 孩子中的第五個
para[5][@type="warning"] 選擇的上下文節點的第五個 para 孩子若是該節點有屬性 type 且值爲 warning 的話
chapter[title="Introduction"] 選擇上下文節點的 chapter 孩子若是它有一個或多個 title 孩子且字串值爲 Introduction
chpater[title] 選擇的上下文節點中有一個或一個以上 title 孩子的 chpater 孩子
employee[@secretary and @assistant] 選擇上下文節點的全部既有 secretary 屬性又有 assistant 屬性的 employee 孩子
最重要的縮寫是 child:: 能從地點步進省略掉。實際效果上,child 是缺省軸。例如,地址路徑 div/para 是 child::div/child::para 的縮寫。
屬性也有縮寫形式: attribute:: 能被縮寫成 @。例如,地址路徑 para[@type="warning"] 爲 child::para[attribute::type="warning"] 的縮寫,也就是選擇有 type 屬性且屬性值爲 warning 的 para 孩子。
// 是 /descendant-or-self::node()/ 的縮寫。例如,//para 是 /descendant-or-self::node()/child::para 的縮寫,所以選擇文檔中全部的 para 元素(即便 para 元素是文檔元素,也會被 //para 所選擇,由於文檔元素是根節點的孩子); div//para 是 div/descendant-or-self::node()/child::para 的縮寫,所以將選擇 div 孩子的全部 para 子孫。
注意:
地址路徑 //para[1] 與地址路徑 /descendant::para[1] 的含意不同,後者選擇第一個 para 元素子孫,前者選擇是他們的父的第一 para 孩子的全部的子孫 para 元素。
地點路進 . 是 self::node() 的縮寫。這與 // 一塊兒使用特別有用。例如,地址路徑 .//para 是 self::node()/descendant-or-self::node()/child::para 的縮寫,所以將選擇上下文節點的全部的 para 子孫元素。
一樣,地址路徑 .. 是 parent::node() 的縮寫。例如,../title 是 parent::node()/child::title 的縮寫所以這將選擇上下文節點的父的 title 孩子。
delphi操做xml學習筆記 之四 簡單增刪查改
關鍵字: AppendChild insertBefore removeChild replaceChild
分類: 我的專區
密級: 公開
xml基礎操做實例,由於剛開始學,若是有不對的地方,請批評指正,代碼以下:
unit XMLOptionUnit;
//==============================================================================
//本實例演示
//1,XML 建立,打開,關閉操做
//2,XML 填加,添加到指定位置,刪除,修改(替換),查找等操做
//做者:cactus123456@hotmail.com
//日期:2005.9.23
//版本:1.0
//==============================================================================
interface
uses
SysUtils,ActiveX,MSXML2_TLB;
type
RecUser=Record
U_Id :widestring;
U_Name :widestring;
U_Sex :widestring;
U_Birth :widestring;
U_Tel :widestring;
U_Addr :widestring;
U_PostCode :widestring;
U_Email :widestring;
end;
type
TXMLOption=class
private
FActive :boolean;
FFilename: string;
FXMLDoc :IXMLDOMDocument;
//填加一個子節點
procedure AddSimpleElement(Parent: IXMLDOMElement; Field,Value: string);
public
procedure CreateBlank(Filename: string);
procedure OpenXml(Filename: string);
procedure CloseXml;
procedure AppendUser(muser:RecUser);
procedure InsertUser(uid:string;muser:RecUser);
procedure RemoveUser(uid:string);
procedure ReplaceUser(uid:string;newuser:RecUser);
function FindUser(userid:widestring):boolean;
function GetNodeLength(node:widestring):integer;
end;
implementation
const
XMLTag = 'xml';
XMLPrologAttrs = 'version="1.0" encoding="UTF-8"';
XMLComment = '簡單XML文檔操做用戶實例'#13 +
'用戶結構爲序號,姓名,性別,出生年月日,電話,住址,郵編,電郵'#13 +
'做者 cactus123456@hotmail.com, 2005.9.21';
UserWatcherTag = 'user-watcher';
XMLComment2 = '建立文檔時間:';
UsersTag = 'users';
U_Id = 'id';
U_Name = 'name';
U_Sex = 'sex';
U_Birth = 'birth';
U_Tel = 'tel';
U_Addr = 'addr';
U_PostCode = 'postcode';
U_Email = 'email';
//建立一個空XML,若是這個Filename文件已經存在,則覆蓋
procedure TXMLOption.CreateBlank(Filename: string);
begin
FActive:=false;
FFilename:='';
try
FXMLDoc := CoDOMDocument.Create;
FXMLDoc.AppendChild(FXMLDoc.CreateProcessingInstruction(XMLTag, XMLPrologAttrs));
FXMLDoc.AppendChild(FXMLDoc.CreateComment(XMLComment));
FXMLDoc.AppendChild(FXMLDoc.CreateElement(UserWatcherTag));
FXMLDoc.AppendChild(FXMLDoc.CreateComment(XMLComment2+datetimetostr(now)));
FXMLDoc.save(Filename);
FFilename:=Filename;
FActive:=true;
except
FXMLDoc:=nil;
end;
end;
//打開一個存在的Filename XML文檔
procedure TXMLOption.OpenXml(Filename: string);
begin
if not Assigned(FXMLDoc) then
begin
FXMLDoc := CoDOMDocument.Create;
if FXMLDoc.Load(Filename) then FActive:=true
else FActive:=false;
if FActive then FFilename:=Filename
else FFilename:='';
end;
end;
//關閉一個打開的XML文檔
procedure TXMLOption.CloseXml;
begin
if Assigned(FXMLDoc) then FXMLDoc:=nil;
FFilename:='';
FActive:=false;
end;
procedure TXMLOption.AddSimpleElement(Parent: IXMLDOMElement; Field,Value: string);
var
Internal: IXMLDOMElement;
begin
Internal:=IXMLDOMElement(Parent.AppendChild(FXMLDoc.CreateElement(Field)));
Internal.AppendChild(FXMLDoc.CreateTextNode(Value));
end;
//填加一個節點到後面
procedure TXMLOption.AppendUser(muser:RecUser);
var
xuser:IXMLDOMElement;
xroot:IXMLDOMElement;
begin
if FActive then
begin
xroot:=FXMLDoc.documentElement;
xuser :=IXMLDOMElement(xroot.AppendChild(FXMLDoc.CreateElement(UsersTag)));
AddSimpleElement(xuser,U_Id,muser.U_Id);
AddSimpleElement(xuser,U_Name,muser.U_Name);
AddSimpleElement(xuser,U_Sex,muser.U_Sex);
AddSimpleElement(xuser,U_Birth,muser.U_Birth);
AddSimpleElement(xuser,U_Tel,muser.U_Tel);
AddSimpleElement(xuser,U_Addr,muser.U_Addr);
AddSimpleElement(xuser,U_PostCode,muser.U_PostCode);
AddSimpleElement(xuser,U_Email,muser.U_Email);
FXMLDoc.save(FFilename);
end;
end;
procedure TXMLOption.InsertUser(uid:string;muser:RecUser);
var
xfind:IXMLDOMNode;
xuser:IXMLDOMElement;
xroot:IXMLDOMElement;
xpath:string;
begin
if not FActive then exit;
xpath:=UsersTag+'['+U_Id+'="'+uid+'"]';
xfind:=FXMLDoc.documentElement.selectSingleNode(xpath);
//若是沒有找到, xfind=nil 則在文件的末尾插入
//若是找到,xfind<>nil 則在找到的紀錄前面插入
xroot:=FXMLDoc.documentElement;
xuser :=IXMLDOMElement(xroot.insertBefore(FXMLDoc.CreateElement(UsersTag),xfind));
AddSimpleElement(xuser,U_Id,muser.U_Id);
AddSimpleElement(xuser,U_Name,muser.U_Name);
AddSimpleElement(xuser,U_Sex,muser.U_Sex);
AddSimpleElement(xuser,U_Birth,muser.U_Birth);
AddSimpleElement(xuser,U_Tel,muser.U_Tel);
AddSimpleElement(xuser,U_Addr,muser.U_Addr);
AddSimpleElement(xuser,U_PostCode,muser.U_PostCode);
AddSimpleElement(xuser,U_Email,muser.U_Email);
FXMLDoc.save(FFilename);
end;
procedure TXMLOption.RemoveUser(uid:string);
var
xfind:IXMLDOMNode;
xroot:IXMLDOMElement;
xpath:string;
begin
if not FActive then exit;
xpath:=UsersTag+'['+U_Id+'="'+uid+'"]';
xfind:=FXMLDoc.documentElement.selectSingleNode(xpath);
if xfind<>nil then
begin
xroot:=FXMLDoc.documentElement;
xroot.removeChild(xfind);
FXMLDoc.save(FFilename);
end;
end;
procedure TXMLOption.ReplaceUser(uid:string;newuser:RecUser);
var
xfind,newnode:IXMLDOMNode;
xroot:IXMLDOMElement;
xpath:string;
begin
if not FActive then exit;
xpath:=UsersTag+'['+U_Id+'="'+uid+'"]';
xfind:=FXMLDoc.documentElement.selectSingleNode(xpath);
//若是沒有找到,則不作替換
if xfind<>nil then
begin
newnode:=xfind.cloneNode(true);
newnode.selectSingleNode(U_Id).text:=newuser.U_Id;
newnode.selectSingleNode(U_Name).text:=newuser.U_Name;
newnode.selectSingleNode(U_Sex).text:=newuser.U_Sex;
newnode.selectSingleNode(U_Birth).text:=newuser.U_Birth;
newnode.selectSingleNode(U_Tel).text:=newuser.U_Tel;
newnode.selectSingleNode(U_Addr).text:=newuser.U_Addr;
newnode.selectSingleNode(U_PostCode).text:=newuser.U_PostCode;
newnode.selectSingleNode(U_Email).text:=newuser.U_Email;
xroot:=FXMLDoc.documentElement;
xroot.replaceChild(newnode,xfind);
FXMLDoc.save(FFilename);
end;
end;
function TXMLOption.FindUser(userid:widestring):boolean;
var
xuser:IXMLDOMNode;
xpath:string;
begin
result:=false;
if not FActive then exit;
//關於xpath語法說明,參見www.w3.org/TR/xpath
xpath:=UsersTag+'['+U_Id+'="'+userid+'"]';
xuser:=FXMLDoc.documentElement.selectSingleNode(xpath);
if xuser<>nil then result:=true;
end;
function TXMLOption.GetNodeLength(node:widestring):integer;
var
xNode:IXMLDOMNodeList;
xroot:IXMLDOMElement;
xpath:widestring;
begin
result:=0;
xpath:=node;
try
xroot:=FXMLDoc.documentElement;
xNode:=xroot.selectNodes(xpath);
result:=xNode.length;
except
end;
end;
initialization
{ Initialise COM }
CoInitialize(nil);
finalization
{ Tidy up }
CoUninitialize();
end.
調用上面單元的實例的代碼,unit單元:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,XMLOptionUnit, OleCtrls, SHDocVw;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button3: TButton;
Button4: TButton;
Button5: TButton;
WebBrowser1: TWebBrowser;
Label1: TLabel;
Button6: TButton;
Button7: TButton;
Button8: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
private
{ Private declarations }
FXMLOption:TXMLOption;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
FXMLOption:=TXMLOption.Create;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FXMLOption.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FXMLOption.CreateBlank(edit1.Text);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
auser:RecUser;
begin
auser.U_Id:=edit2.Text;
auser.U_Name:='tom';
auser.U_Sex:='男';
auser.U_Birth:='1979-8-7';
auser.U_Tel:='1236547890';
auser.U_Addr:='tom 大街 8 號';
auser.U_PostCode:='100018';
auser.U_Email:='tom@888.com';
FXMLOption.AppendUser(auser);
WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
FXMLOption.OpenXml(edit1.Text);
WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
FXMLOption.CloseXml;
WebBrowser1.Navigate('about:blank');
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
if FXMLOption.FindUser(edit2.text) then label1.Caption:='true'
else label1.Caption:='false';
end;
procedure TForm1.Button6Click(Sender: TObject);
var
auser:RecUser;
begin
auser.U_Id:=edit2.Text;
auser.U_Name:='peter';
auser.U_Sex:='女';
auser.U_Birth:='1980-8-7';
auser.U_Tel:='36-3654-7890';
auser.U_Addr:='peter 大街 8 號';
auser.U_PostCode:='100018';
auser.U_Email:='peter@888.com';
FXMLOption.InsertUser(edit2.text,auser);
WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text);
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
FXMLOption.RemoveUser(edit2.text);
WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text);
end;
procedure TForm1.Button8Click(Sender: TObject);
var
auser:RecUser;
begin
auser.U_Id:=edit2.Text;
auser.U_Name:='張三';
auser.U_Sex:='男';
auser.U_Birth:='1970-8-7';
auser.U_Tel:='001654-7890';
auser.U_Addr:='張三 大街 8 號';
auser.U_PostCode:='100018';
auser.U_Email:='zhangsan@888.com';
FXMLOption.ReplaceUser(edit2.Text,auser);
WebBrowser1.Navigate(ExtractFilePath(application.ExeName)+edit1.Text);
end;
end.javascript