锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 1. 浠嬬粛 1錛塂OM(JAXP Crimson瑙f瀽鍣? 2錛塖AX SAX澶勭悊鐨勪紭鐐歸潪甯哥被浼間簬嫻佸獟浣撶殑浼樼偣銆傚垎鏋愯兘澶熺珛鍗沖紑濮嬶紝鑰屼笉鏄瓑寰呮墍鏈夌殑鏁版嵁琚鐞嗐傝屼笖錛岀敱浜庡簲鐢ㄧ▼搴忓彧鏄湪璇誨彇鏁版嵁鏃舵鏌ユ暟鎹紝鍥犳涓嶉渶瑕佸皢鏁版嵁瀛樺偍鍦ㄥ唴瀛樹腑銆傝繖瀵逛簬澶у瀷鏂囨。鏉ヨ鏄釜宸ㄥぇ鐨勪紭鐐廣備簨瀹炰笂錛屽簲鐢ㄧ▼搴忕敋鑷充笉蹇呰В鏋愭暣涓枃妗o紱瀹冨彲浠ュ湪鏌愪釜鏉′歡寰楀埌婊¤凍鏃跺仠姝㈣В鏋愩備竴鑸潵璇達紝SAX榪樻瘮瀹冪殑鏇夸唬鑰匘OM蹇澶氥? 3錛塉DOM http://www.jdom.org/ JDOM鐨勭洰鐨勬槸鎴愪負Java鐗瑰畾鏂囨。妯″瀷錛屽畠綆鍖栦笌XML鐨勪氦浜掑茍涓旀瘮浣跨敤DOM瀹炵幇鏇村揩銆傜敱浜庢槸絎竴涓狫ava鐗瑰畾妯″瀷錛孞DOM涓鐩村緱鍒板ぇ鍔涙帹騫垮拰淇冭繘銆傛鍦ㄨ冭檻閫氳繃“Java瑙勮寖璇鋒眰JSR-102”灝嗗畠鏈緇堢敤浣?#8220;Java鏍囧噯鎵╁睍”銆備粠2000騫村垵灝卞凡緇忓紑濮嬩簡JDOM寮鍙戙? 銆銆JDOM涓嶥OM涓昏鏈変袱鏂歸潰涓嶅悓銆傞鍏堬紝JDOM浠呬嬌鐢ㄥ叿浣撶被鑰屼笉浣跨敤鎺ュ彛銆傝繖鍦ㄦ煇浜涙柟闈㈢畝鍖栦簡API錛屼絾鏄篃闄愬埗浜嗙伒媧繪с傜浜岋紝API澶ч噺浣跨敤浜咰ollections綾伙紝綆鍖栦簡閭d簺宸茬粡鐔熸倝榪欎簺綾葷殑Java寮鍙戣呯殑浣跨敤銆? 銆銆JDOM鏂囨。澹版槑鍏剁洰鐨勬槸“浣跨敤20%(鎴栨洿灝?鐨勭簿鍔涜В鍐?0%(鎴栨洿澶?Java/XML闂”(鏍規嵁瀛︿範鏇茬嚎鍋囧畾涓?0%)銆侸DOM瀵逛簬澶у鏁癑ava/XML搴旂敤紼嬪簭鏉ヨ褰撶劧鏄湁鐢ㄧ殑錛屽茍涓斿ぇ澶氭暟寮鍙戣呭彂鐜癆PI姣擠OM瀹規槗鐞嗚В寰楀銆侸DOM榪樺寘鎷紼嬪簭琛屼負鐨勭浉褰撳箍娉涙鏌ヤ互闃叉鐢ㄦ埛鍋氫換浣曞湪XML涓棤鎰忎箟鐨勪簨銆傜劧鑰岋紝瀹冧粛闇瑕佹偍鍏呭垎鐞嗚ВXML浠ヤ究鍋氫竴浜涜秴鍑哄熀鏈殑宸ヤ綔(鎴栬呯敋鑷崇悊瑙f煇浜涙儏鍐典笅鐨勯敊璇?銆傝繖涔熻鏄瘮瀛︿範DOM鎴朖DOM鎺ュ彛閮芥洿鏈夋剰涔夌殑宸ヤ綔銆? 銆銆JDOM鑷韓涓嶅寘鍚В鏋愬櫒銆傚畠閫氬父浣跨敤SAX2瑙f瀽鍣ㄦ潵瑙f瀽鍜岄獙璇佽緭鍏ML鏂囨。(灝界瀹冭繕鍙互灝嗕互鍓嶆瀯閫犵殑DOM琛ㄧず浣滀負杈撳叆)銆傚畠鍖呭惈涓浜涜漿鎹㈠櫒浠ュ皢JDOM琛ㄧず杈撳嚭鎴怱AX2浜嬩歡嫻併丏OM妯″瀷鎴朮ML鏂囨湰鏂囨。銆侸DOM鏄湪Apache璁稿彲璇佸彉浣撲笅鍙戝竷鐨勫紑鏀炬簮鐮併?/p>
4錛塂OM4J http://dom4j.sourceforge.net/ 銆銆涓烘敮鎸佹墍鏈夎繖浜涘姛鑳斤紝DOM4J浣跨敤鎺ュ彛鍜屾娊璞″熀鏈被鏂規硶銆侱OM4J澶ч噺浣跨敤浜咥PI涓殑Collections綾伙紝浣嗘槸鍦ㄨ澶氭儏鍐典笅錛屽畠榪樻彁渚涗竴浜涙浛浠f柟娉曚互鍏佽鏇村ソ鐨勬ц兘鎴栨洿鐩存帴鐨勭紪鐮佹柟娉曘傜洿鎺ュソ澶勬槸錛岃櫧鐒禗OM4J浠樺嚭浜嗘洿澶嶆潅鐨凙PI鐨勪唬浠鳳紝浣嗘槸瀹冩彁渚涗簡姣擩DOM澶у緱澶氱殑鐏墊椿鎬с? 銆銆鍦ㄦ坊鍔犵伒媧繪с乆Path闆嗘垚鍜屽澶ф枃妗e鐞嗙殑鐩爣鏃訛紝DOM4J鐨勭洰鏍囦笌JDOM鏄竴鏍風殑錛氶拡瀵笿ava寮鍙戣呯殑鏄撶敤鎬у拰鐩磋鎿嶄綔銆傚畠榪樿嚧鍔涗簬鎴愪負姣擩DOM鏇村畬鏁寸殑瑙e喅鏂規錛屽疄鐜板湪鏈川涓婂鐞嗘墍鏈塉ava/XML闂鐨勭洰鏍囥傚湪瀹屾垚璇ョ洰鏍囨椂錛屽畠姣擩DOM鏇村皯寮鴻皟闃叉涓嶆紜殑搴旂敤紼嬪簭琛屼負銆? 銆銆DOM4J鏄竴涓潪甯擱潪甯鎬紭縐鐨凧ava XML API錛屽叿鏈夋ц兘浼樺紓銆佸姛鑳藉己澶у拰鏋佺鏄撶敤浣跨敤鐨勭壒鐐癸紝鍚屾椂瀹冧篃鏄竴涓紑鏀炬簮浠g爜鐨勮蔣浠躲傚浠婁綘鍙互鐪嬪埌瓚婃潵瓚婂鐨凧ava杞歡閮藉湪浣跨敤DOM4J鏉ヨ鍐橷ML錛岀壒鍒煎緱涓鎻愮殑鏄繛Sun鐨凧AXM涔熷湪鐢―OM4J銆? 2.. 姣旇緝 1錛塂OM4J鎬ц兘鏈濂斤紝榪濻un鐨凧AXM涔熷湪鐢―OM4J銆傜洰鍓嶈澶氬紑婧愰」鐩腑澶ч噺閲囩敤DOM4J錛屼緥濡傚ぇ鍚嶉紟榧庣殑Hibernate涔熺敤DOM4J鏉ヨ鍙朮ML閰嶇疆鏂囦歡銆傚鏋滀笉鑰冭檻鍙Щ妞嶆э紝閭e氨閲囩敤DOM4J. 2錛塉DOM鍜孌OM鍦ㄦц兘嫻嬭瘯鏃惰〃鐜頒笉浣籌紝鍦ㄦ祴璇?0M鏂囨。鏃跺唴瀛樻孩鍑恒傚湪灝忔枃妗f儏鍐典笅榪樺煎緱鑰冭檻浣跨敤DOM鍜孞DOM銆傝櫧鐒禞DOM鐨勫紑鍙戣呭凡緇忚鏄庝粬浠湡鏈涘湪姝e紡鍙戣鐗堝墠涓撴敞鎬ц兘闂錛屼絾鏄粠鎬ц兘瑙傜偣鏉ョ湅錛屽畠紜疄娌℃湁鍊煎緱鎺ㄨ崘涔嬪銆傚彟澶栵紝DOM浠嶆槸涓涓潪甯稿ソ鐨勯夋嫨銆侱OM瀹炵幇騫挎硾搴旂敤浜庡縐嶇紪紼嬭璦銆傚畠榪樻槸璁稿鍏跺畠涓嶺ML鐩稿叧鐨勬爣鍑嗙殑鍩虹錛屽洜涓哄畠姝e紡鑾峰緱W3C鎺ㄨ崘(涓庡熀浜庨潪鏍囧噯鐨凧ava妯″瀷鐩稿)錛屾墍浠ュ湪鏌愪簺綾誨瀷鐨勯」鐩腑鍙兘涔熼渶瑕佸畠(濡傚湪JavaScript涓嬌鐢―OM)銆?/p>
3錛塖AX琛ㄧ幇杈冨ソ錛岃繖瑕佷緷璧栦簬瀹冪壒瀹氱殑瑙f瀽鏂瑰紡錛嶄簨浠墮┍鍔ㄣ備竴涓猄AX媯嫻嬪嵆灝嗗埌鏉ョ殑XML嫻侊紝浣嗗茍娌℃湁杞藉叆鍒板唴瀛?褰撶劧褰揦ML嫻佽璇誨叆鏃訛紝浼氭湁閮ㄥ垎鏂囨。鏆傛椂闅愯棌鍦ㄥ唴瀛樹腑)銆?/p>
3. 鍥涚xml鎿嶄綔鏂瑰紡鐨勫熀鏈嬌鐢ㄦ柟娉?/p>
xml鏂囦歡錛?/p>
<?xml version="1.0" encoding="utf-8" ?> 1錛塂OM import Java.io.*; public class MyXMLReader{ 銆銆long lasting =System.currentTimeMillis(); 2錛塖AX import org.xml.sax.*; public class MyXMLReader extends DefaultHandler { 銆Java.util.Stack tags = new Java.util.Stack(); 銆public static void main(String args[]) { 銆銆System.out.println("榪愯鏃墮棿錛? + (System.currentTimeMillis() - lasting) + "姣");} 銆銆public void startElement(String uri,String localName,String qName,Attributes attrs) { 3錛?JDOM import Java.io.*; public class MyXMLReader { 銆public static void main(String arge[]) { } 4錛塂OM4J import Java.io.*; public class MyXMLReader { 銆public static void main(String arge[]) { 濡傛灉瑕佸憡璇夊埆浜轟拱涓鍔犱粦鐗涘ザ錛屾偍浼氭庝箞璇達紵“璇峰幓涔頒竴鍔犱粦鐗涘ザ鍥炴潵” 榪樻槸 “浠庡墠闂ㄥ嚭鍘伙紝鍚戝乏杞紝璧頒笁涓鍖哄悜鍙寵漿錛屽啀璧板崐涓鍖哄悜鍙寵漿榪涘叆鍟嗗簵銆傝蛋鍚戝洓鍙烽氶亾錛屾部閫氶亾璧頒簲綾沖悜宸︼紝鎷夸竴鐡朵竴鍔犱粦瑁呯殑鐗涘ザ鐒跺悗鍒版敹閾跺彴浠樻銆傚啀娌垮師璺洖瀹躲?#8221; 綆鐩村お鍙瑧浜嗐傚彧瑕佸湪 “璇峰幓涔頒竴鍔犱粦鐗涘ザ鍥炴潵” 鐨勫熀紜涓婄◢鍔犳寚紺猴紝澶氭暟鎴愪漢閮借兘鑷繁涔板洖鐗涘ザ鏉ャ? 鏌ヨ璇█鍜岃綆楁満鎼滅儲涓庢綾諱技銆傜洿鎺ヨ “鎵句竴涓?Cryptonomicon 鐨勫壇鏈?#8221; 瑕佹瘮緙栧啓鎼滅儲鏌愪釜鏁版嵁搴撶殑璇︾粏閫昏緫瀹規槗寰楀銆傜敱浜庢悳绱㈡搷浣滅殑閫昏緫闈炲父鐩鎬技錛屽彲浠ュ彂鏄庝竴縐嶉氱敤璇█璁╂偍浣跨敤 “鎵懼埌 Neal Stephenson 鐨勬墍鏈夎憲浣?#8221; 榪欐牱鐨勫懡浠わ紝鐒跺悗緙栧啓瀵圭壒瀹氭暟鎹瓨鍌ㄦ墽琛屾綾繪煡璇㈢殑寮曟搸銆? 鍦ㄤ紬澶氭煡璇㈣璦涔嬩腑錛岀粨鏋勫寲鏌ヨ璇█錛圫QL錛夋槸涓縐嶉拡瀵規煡璇㈢壒瀹氱被鍨嬬殑鍏崇郴搴撹岃璁″拰浼樺寲鐨勮璦銆傚叾浠栦笉閭d箞甯歌鐨勬煡璇㈣璦榪樻湁瀵硅薄鏌ヨ璇█錛圤QL錛夊拰 XQuery銆備絾鏈枃鐨勪富棰樻槸 XPath錛屼竴縐嶄負鏌ヨ XML 鏂囨。鑰岃璁$殑鏌ヨ璇█銆傛瘮濡傦紝涓嬮潰榪欎釜綆鍗曠殑 XPath 鏌ヨ鍙互鍦ㄦ枃妗d腑鎵懼埌浣滆呬負 Neal Stephenson 鐨勬墍鏈夊浘涔︾殑鏍囬錛?/p>
浣滀負瀵圭収錛屾煡璇㈠悓鏍蜂俊鎭殑綰?DOM 鎼滅儲浠g爜濡?娓呭崟 1 鎵紺猴細 涓嶈鎮ㄦ槸鍚︾浉淇★紝娓呭崟 1 涓殑 DOM 鏄劇劧涓嶅綆鍗曠殑 XPath 琛ㄨ揪寮忛氱敤鎴栬呭仴澹傛偍鎰挎剰緙栧啓銆佽皟璇曞拰緇存姢鍝竴涓紵鎴戞兂絳旀寰堟槑鏄俱? 浣嗘槸铏界劧鏈夊緢寮虹殑琛ㄨ揪鑳藉姏錛孹Path 騫朵笉鏄?Java 璇█錛屼簨瀹炰笂 XPath 涓嶆槸涓縐嶅畬鏁寸殑緙栫▼璇█銆傛湁寰堝涓滆タ鐢?XPath 琛ㄨ揪涓嶅嚭鏉ワ紝鐢氳嚦鏈変簺鏌ヨ涔熸棤娉曡〃杈俱傛瘮鏂硅錛孹Path 涓嶈兘鏌ユ壘鍥介檯鏍囧噯鍥句功緙栫爜錛圛SBN錛夋楠岀爜涓嶅尮閰嶇殑鎵鏈夊浘涔︼紝鎴栬呮壘鍑哄澶栧笎鎴鋒暟鎹簱鏄劇ず嬈犲笎鐨勬墍鏈変綔鑰呫傚垢榪愮殑鏄紝鍙互鎶?XPath 緇撳悎鍒?Java 紼嬪簭涓紝榪欐牱灝辮兘鍙戞尌涓よ呯殑浼樺娍浜嗭細Java 鍋?Java 鎵鎿呴暱鐨勶紝XPath 鍋?XPath 鎵鎿呴暱鐨勩? 鐩村埌鏈榪戯紝Java 紼嬪簭鎵ц XPath 鏌ヨ鎵闇瑕佺殑搴旂敤紼嬪簭緙栫▼鎺ュ彛錛圓PI錛夎繕鍥犲艦褰㈣壊鑹茬殑 XPath 寮曟搸鑰屽悇涓嶇浉鍚屻俋alan 鏈変竴縐?API錛孲axon 浣跨敤鍙︿竴縐嶏紝鍏朵粬寮曟搸鍒欎嬌鐢ㄥ叾浠栫殑 API銆傝繖鎰忓懗鐫浠g爜寰寰鎶婃偍闄愬埗鍒頒竴縐嶄駭鍝佷笂銆傜悊鎯蟲儏鍐典笅錛屾渶濂借兘澶熻瘯楠屽叿鏈変笉鍚屾ц兘鐗圭偣鐨勫悇縐嶅紩鎿庯紝鑰屼笉浼氬甫鏉ヤ笉閫傚綋鐨勯夯鐑︽垨鑰呴噸鏂扮紪鍐欎唬鐮併? 浜庢槸錛孞ava 5 鎺ㄥ嚭浜? 鎴戝皢涓句緥璇存槑濡備綍浣跨敤瀹冦傜劧鍚庡啀璁ㄨ涓浜涚粏鑺傞棶棰樸傚亣璁捐鏌ヨ涓涓浘涔﹀垪琛紝瀵繪壘 Neal Stephenson 鐨勮憲浣溿傚叿浣撴潵璇達紝榪欎釜鍥句功鍒楄〃鐨勫艦寮忓 娓呭崟 2 鎵紺猴細
鏌ユ壘鎵鏈夊浘涔︾殑 XPath 鏌ヨ闈炲父綆鍗曪細 鐜板湪鎴戞彁渚涗竴涓畝鍗曠殑紼嬪簭錛屽畠浠?Java 璇█涓墽琛岃繖涓煡璇紝鐒跺悗鎶婃壘鍒扮殑鎵鏈夊浘涔︾殑鏍囬鎵撳嵃鍑烘潵銆傞鍏堬紝闇瑕佸皢鏂囨。鍔犺澆鍒頒竴涓?DOM 鍒扮洰鍓嶄負姝紝榪欎粎浠呮槸鏍囧噯鐨?JAXP 鍜?DOM錛屾病鏈変粈涔堟柊椴滅殑銆? 鎺ヤ笅鏉ュ垱寤? 鐒跺悗浣跨敤榪欎釜宸ュ巶鍒涘緩
濡傛灉 XPath 琛ㄨ揪寮忓彧浣跨敤涓嬈★紝鍙互璺寵繃緙栬瘧姝ラ鐩存帴瀵? 鏈鍚庯紝璁$畻 XPath 琛ㄨ揪寮忓緱鍒扮粨鏋溿傝〃杈懼紡鏄拡瀵圭壒瀹氱殑涓婁笅鏂囪妭鐐硅綆楃殑錛屽湪榪欎釜渚嬪瓙涓槸鏁翠釜鏂囨。銆傝繕蹇呴』鎸囧畾榪斿洖綾誨瀷銆傝繖閲岃姹傝繑鍥炰竴涓妭鐐歸泦錛? 鍙互灝嗙粨鏋滃己鍒惰漿鍖栨垚 DOM
娓呭崟 4
鎶婁笂榪扮墖孌電粍鍚堝埌浜嗕竴涓▼搴忎腑銆傝繕瑕佹敞鎰忥紝榪欎簺鏂規硶鍙兘鎶涘嚭涓浜涙鏌ュ紓甯革紝榪欎簺寮傚父蹇呴』鍦? 姣忓綋娣峰悎浣跨敤璇稿 XPath 鍜?Java 榪欐牱涓ょ涓嶅悓鐨勮璦鏃訛紝蹇呭畾浼氭湁鏌愪簺灝嗕袱鑰呯矘鍚堝湪涓璧風殑鏄庢樉鎺ョ紳銆傚茍闈炰竴鍒囬兘寰堝悎鎷嶃俋Path 鍜?Java 璇█娌℃湁鍚屾牱鐨勭被鍨嬬郴緇熴俋Path 1.0 鍙湁鍥涚鍩烘湰鏁版嵁綾誨瀷錛?/p>
褰撶劧錛孞ava 璇█鏈夋洿澶氱殑鏁版嵁綾誨瀷錛屽寘鎷敤鎴峰畾涔夌殑瀵硅薄綾誨瀷銆?/p>
澶氭暟 XPath 琛ㄨ揪寮忥紝鐗瑰埆鏄綅緗礬寰勶紝閮借繑鍥炶妭鐐歸泦銆備絾鏄繕鏈夊叾浠栧彲鑳姐傛瘮濡傦紝XPath 琛ㄨ揪寮?
鍓嶉潰涓鐩村亣璁炬偍浣跨敤鐨勬槸 XPath 1.0銆俋Path 2 澶уぇ鎵╁睍鍜屼慨鏀逛簡綾誨瀷緋葷粺銆侸ava XPath API 鏀寔 XPath 2 鎵闇鐨勪富瑕佷慨鏀規槸涓鴻繑鍥?XPath 2 鏂版暟鎹被鍨嬪鍔犲父閲忋? 鍦?Java 涓綆?XPath 琛ㄨ揪寮忔椂錛岀浜屼釜鍙傛暟鎸囧畾闇瑕佺殑榪斿洖綾誨瀷銆傛湁浜旂鍙兘錛岄兘鍦? 鏈鍚庝竴涓? 濡傛灉涓嶈兘瀹屾垚瑕佹眰鐨勮漿鎹紝 鑻?XML 鏂囨。涓殑鍏冪礌鍦ㄥ悕縐扮┖闂翠腑錛屾煡璇㈣鏂囨。鐨?XPath 琛ㄨ揪寮忓繀欏諱嬌鐢ㄧ浉鍚岀殑鍚嶇О絀洪棿銆俋Path 琛ㄨ揪寮忎笉涓瀹氳浣跨敤鐩稿悓鐨勫墠緙錛屽彧闇瑕佸悕縐扮┖闂?URI 鐩稿悓鍗沖彲銆備簨瀹炰笂錛屽鏋?XML 鏂囨。浣跨敤榛樿鍚嶇О絀洪棿錛岄偅涔堝敖綆$洰鏍囨枃妗f病鏈変嬌鐢ㄥ墠緙錛孹Path 琛ㄨ揪寮忎篃蹇呴』浣跨敤鍓嶇紑銆? 浣嗘槸錛孞ava 紼嬪簭涓嶆槸 XML 鏂囨。錛屽洜姝や笉鑳界敤涓鑸殑鍚嶇О絀洪棿瑙f瀽銆傚繀欏繪彁渚涗竴涓璞″皢鍓嶇紑鏄犲皠鍒板悕縐扮┖闂?URI銆傝瀵硅薄鏄? 鏌ユ壘 Neal Stephenson 鍏ㄩ儴钁椾綔鏍囬鐨?XPath 琛ㄨ揪寮忓氨瑕佹敼涓? 浣跨敤鏄犲皠瀛樺偍緇戝畾鍜屽鍔?setter 鏂規硶瀹炵幇鍚嶇О絀洪棿涓婁笅鏂囩殑閲嶇敤涔熶笉闅俱? 鍒涘緩 鏈夋椂鍊欙紝鍦?Java 璇█涓畾涔夌敤浜?XPath 琛ㄨ揪寮忕殑鎵╁睍鍑芥暟寰堟湁鐢ㄣ傝繖浜涘嚱鏁板彲浠ユ墽琛岀敤綰?XPath 寰堥毦鎴栬呮棤娉曟墽琛岀殑浠誨姟銆備笉榪囧繀欏繪槸鐪熸鐨勫嚱鏁幫紝鑰屼笉鏄殢鎰忕殑鏂規硶銆傚氨鏄涓嶈兘鏈夊壇浣滅敤銆傦紙XPath 鍑芥暟鍙互鎸夌収浠繪剰鐨勯『搴忔眰鍊間換鎰忓嬈°傦級 閫氳繃 Java XPath API 璁塊棶鐨勬墿灞曞嚱鏁板繀欏誨疄鐜? 璇ユ柟娉曞繀欏昏繑鍥?Java 璇█鑳藉杞崲鍒?XPath 鐨勪簲縐嶇被鍨嬩箣涓錛? 姣斿錛?a >娓呭崟 8 鏄劇ず浜嗕竴涓墿灞曞嚱鏁幫紝瀹冩鏌?ISBN 鐨勬牎楠屽拰騫惰繑鍥? 涓嬩竴姝ヨ榪欎釜鎵╁睍鍑芥暟鑳藉鍦?Java 紼嬪簭涓嬌鐢ㄣ備負姝わ紝闇瑕佸湪緙栬瘧琛ㄨ揪寮忎箣鍓嶅悜 XPath 瀵硅薄瀹夎 鐢變簬鎵╁睍鍑芥暟蹇呴』鏈夊悕縐扮┖闂達紝鎵浠ヨ綆楀寘鍚墿灞曞嚱鏁扮殑琛ㄨ揪寮忔椂蹇呴』浣跨敤 鐢?SQL 鍜?XPath 榪欐牱鐨勫0鏄庢ц璦緙栧啓鏌ヨ錛岃姣斾嬌鐢?Java 鍜?C 榪欐牱鐨勫懡浠ゅ紡璇█瀹規槗寰楀銆備絾鏄紝鐢?Java 鍜?C 榪欐牱鐨勫浘鐏靛畬鏁磋璦緙栧啓澶嶆潅鐨勯昏緫錛屽張姣?SQL 鍜?XPath 榪欐牱鐨勫0鏄庢ц璦瀹規槗寰楀銆傛墍騫哥殑鏄紝閫氳繃浣跨敤 Java Database Connectivity (JDBC) 鍜?
DOM鏄敤涓庡鉤鍙板拰璇█鏃犲叧鐨勬柟寮忚〃紺篨ML鏂囨。鐨勫畼鏂筗3C鏍囧噯銆侱OM鏄互灞傛緇撴瀯緇勭粐鐨勮妭鐐規垨淇℃伅鐗囨柇鐨勯泦鍚堛傝繖涓眰嬈$粨鏋勫厑璁稿紑鍙戜漢鍛樺湪鏍戜腑瀵繪壘鐗瑰畾淇℃伅銆傚垎鏋愯緇撴瀯閫氬父闇瑕佸姞杞芥暣涓枃妗e拰鏋勯犲眰嬈$粨鏋勶紝鐒跺悗鎵嶈兘鍋氫換浣曞伐浣溿傜敱浜庡畠鏄熀浜庝俊鎭眰嬈$殑錛屽洜鑰孌OM琚涓烘槸鍩轟簬鏍戞垨鍩轟簬瀵硅薄鐨勩侱OM浠ュ強騫夸箟鐨勫熀浜庢爲鐨勫鐞嗗叿鏈夊嚑涓紭鐐廣傞鍏堬紝鐢變簬鏍戝湪鍐呭瓨涓槸鎸佷箙鐨勶紝鍥犳鍙互淇敼瀹冧互渚垮簲鐢ㄧ▼搴忚兘瀵規暟鎹拰緇撴瀯浣滃嚭鏇存敼銆傚畠榪樺彲浠ュ湪浠諱綍鏃跺欏湪鏍戜腑涓婁笅瀵艱埅錛岃屼笉鏄儚SAX閭f牱鏄竴嬈℃х殑澶勭悊銆侱OM浣跨敤璧鋒潵涔熻綆鍗曞緱澶氥?/p>
銆銆閫夋嫨DOM榪樻槸閫夋嫨SAX錛?瀵逛簬闇瑕佽嚜宸辯紪鍐欎唬鐮佹潵澶勭悊XML鏂囨。鐨勫紑鍙戜漢鍛樻潵璇達紝 閫夋嫨DOM榪樻槸SAX瑙f瀽妯″瀷鏄竴涓潪甯擱噸瑕佺殑璁捐鍐崇瓥銆?DOM閲囩敤寤虹珛鏍戝艦緇撴瀯鐨勬柟寮忚闂甔ML鏂囨。錛岃孲AX閲囩敤鐨勪簨浠舵ā鍨嬨?
銆銆DOM瑙f瀽鍣ㄦ妸XML鏂囨。杞寲涓轟竴涓寘鍚叾鍐呭鐨勬爲錛屽茍鍙互瀵規爲榪涜閬嶅巻銆傜敤DOM瑙f瀽妯″瀷鐨勪紭鐐規槸緙栫▼瀹規槗錛屽紑鍙戜漢鍛樺彧闇瑕佽皟鐢ㄥ緩鏍戠殑鎸囦護錛岀劧鍚庡埄鐢╪avigation APIs璁塊棶鎵闇鐨勬爲鑺傜偣鏉ュ畬鎴愪換鍔°傚彲浠ュ緢瀹規槗鐨勬坊鍔犲拰淇敼鏍戜腑鐨勫厓绱犮傜劧鑰岀敱浜庝嬌鐢―OM瑙f瀽鍣ㄧ殑鏃跺欓渶瑕佸鐞嗘暣涓猉ML鏂囨。錛屾墍浠ュ鎬ц兘鍜屽唴瀛樼殑瑕佹眰姣旇緝楂橈紝灝ゅ叾鏄亣鍒板緢澶х殑XML鏂囦歡鐨勬椂鍊欍傜敱浜庡畠鐨勯亶鍘嗚兘鍔涳紝DOM瑙f瀽鍣ㄥ父鐢ㄤ簬XML鏂囨。闇瑕侀綣佺殑鏀瑰彉鐨勬湇鍔′腑銆?
銆銆SAX瑙f瀽鍣ㄩ噰鐢ㄤ簡鍩轟簬浜嬩歡鐨勬ā鍨嬶紝瀹冨湪瑙f瀽XML鏂囨。鐨勬椂鍊欏彲浠ヨЕ鍙戜竴緋誨垪鐨勪簨浠訛紝褰撳彂鐜扮粰瀹氱殑tag鐨勬椂鍊欙紝瀹冨彲浠ユ縺媧諱竴涓洖璋冩柟娉曪紝鍛婅瘔璇ユ柟娉曞埗瀹氱殑鏍囩宸茬粡鎵懼埌銆係AX瀵瑰唴瀛樼殑瑕佹眰閫氬父浼氭瘮杈冧綆錛屽洜涓哄畠璁╁紑鍙戜漢鍛樿嚜宸辨潵鍐沖畾鎵瑕佸鐞嗙殑tag銆傜壒鍒槸褰撳紑鍙戜漢鍛樺彧闇瑕佸鐞嗘枃妗d腑鎵鍖呭惈鐨勯儴鍒嗘暟鎹椂錛孲AX榪欑鎵╁睍鑳藉姏寰楀埌浜嗘洿濂界殑浣撶幇銆備絾鐢⊿AX瑙f瀽鍣ㄧ殑鏃跺欑紪鐮佸伐浣滀細姣旇緝鍥伴毦錛岃屼笖寰堥毦鍚屾椂璁塊棶鍚屼竴涓枃妗d腑鐨勫澶勪笉鍚屾暟鎹?
铏界劧DOM4J浠h〃浜嗗畬鍏ㄧ嫭绔嬬殑寮鍙戠粨鏋滐紝浣嗘渶鍒濓紝瀹冩槸JDOM鐨勪竴縐嶆櫤鑳藉垎鏀傚畠鍚堝茍浜嗚澶氳秴鍑哄熀鏈琗ML鏂囨。琛ㄧず鐨勫姛鑳斤紝鍖呮嫭闆嗘垚鐨刋Path鏀寔銆乆ML Schema鏀寔浠ュ強鐢ㄤ簬澶ф枃妗f垨嫻佸寲鏂囨。鐨勫熀浜庝簨浠剁殑澶勭悊銆傚畠榪樻彁渚涗簡鏋勫緩鏂囨。琛ㄧず鐨勯夐」錛屽畠閫氳繃DOM4J API鍜屾爣鍑咲OM鎺ュ彛鍏鋒湁騫惰璁塊棶鍔熻兘銆備粠2000涓嬪崐騫村紑濮嬶紝瀹冨氨涓鐩村浜庡紑鍙戜箣涓?
<Result>
<VALUE>
<NO DATE="2005">A1</NO>
<ADDR>GZ</ADDR>
</VALUE>
<VALUE>
<NO DATE="2004">A2</NO>
<ADDR>XG</ADDR>
</VALUE>
</Result>
import Java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
銆public static void main(String arge[]){
銆銆try{
銆銆銆File f=new File("data_10k.xml");
銆銆銆DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
銆銆銆DocumentBuilder builder=factory.newDocumentBuilder();
銆銆銆Document doc = builder.parse(f);
銆銆銆NodeList nl = doc.getElementsByTagName("VALUE");
銆銆銆for (int i=0;i錛渘l.getLength();i++){
銆銆銆銆System.out.print("杞︾墝鍙風爜:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
銆銆銆銆System.out.println("杞︿富鍦板潃:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
銆 銆}
銆銆}catch(Exception e){
銆銆銆e.printStackTrace();
}
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
銆public MyXMLReader() {
銆銆super();
}
銆銆long lasting = System.currentTimeMillis();
銆銆try {
銆銆銆SAXParserFactory sf = SAXParserFactory.newInstance();
銆銆銆SAXParser sp = sf.newSAXParser();
銆銆銆MyXMLReader reader = new MyXMLReader();
銆銆銆sp.parse(new InputSource("data_10k.xml"), reader);
銆銆} catch (Exception e) {
銆銆銆e.printStackTrace();
銆銆}
銆銆public void characters(char ch[], int start, int length) throws SAXException {
銆銆String tag = (String) tags.peek();
銆銆if (tag.equals("NO")) {
銆銆銆System.out.print("杞︾墝鍙風爜錛? + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
銆銆System.out.println("鍦板潃:" + new String(ch, start, length));
}
}
銆銆tags.push(qName);}
}
import Java.util.*;
import org.jdom.*;
import org.jdom.input.*;
銆銆long lasting = System.currentTimeMillis();
銆銆try {
銆銆銆SAXBuilder builder = new SAXBuilder();
銆銆銆Document doc = builder.build(new File("data_10k.xml"));
銆銆銆Element foo = doc.getRootElement();
銆銆銆List allChildren = foo.getChildren();
銆銆銆for(int i=0;i錛渁llChildren.size();i++) {
銆銆銆銆System.out.print("杞︾墝鍙風爜:" + ((Element)allChildren.get(i)).getChild("NO").getText());
銆銆銆銆System.out.println("杞︿富鍦板潃:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
銆銆銆}
銆銆} catch (Exception e) {
銆銆銆e.printStackTrace();
}
import Java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
銆銆long lasting = System.currentTimeMillis();
銆銆try {
銆銆銆File f = new File("data_10k.xml");
銆銆銆SAXReader reader = new SAXReader();
銆銆銆Document doc = reader.read(f);
銆銆銆Element root = doc.getRootElement();
銆銆銆Element foo;
銆銆銆for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
銆銆銆銆foo = (Element) i.next();
銆銆銆銆System.out.print("杞︾墝鍙風爜:" + foo.elementText("NO"));
銆銆銆銆System.out.println("杞︿富鍦板潃:" + foo.elementText("ADDR"));
銆銆銆}
銆銆} catch (Exception e) {
銆銆銆e.printStackTrace();
}
}
]]>
]]>
]]>
//book[author="Neal Stephenson"]/title
娓呭崟 1. 鎵懼埌 Neal Stephenson 鎵鏈夎憲浣?title 鍏冪礌鐨?DOM 浠g爜
ArrayList result = new ArrayList();
NodeList books = doc.getElementsByTagName("book");
for (int i = 0; i < books.getLength(); i++) {
Element book = (Element) books.item(i);
NodeList authors = book.getElementsByTagName("author");
boolean stephenson = false;
for (int j = 0; j < authors.getLength(); j++) {
Element author = (Element) authors.item(j);
NodeList children = author.getChildNodes();
StringBuffer sb = new StringBuffer();
for (int k = 0; k < children.getLength(); k++) {
Node child = children.item(k);
// really should to do this recursively
if (child.getNodeType() == Node.TEXT_NODE) {
sb.append(child.getNodeValue());
}
}
if (sb.toString().equals("Neal Stephenson")) {
stephenson = true;
break;
}
}
if (stephenson) {
NodeList titles = book.getElementsByTagName("title");
for (int j = 0; j < titles.getLength(); j++) {
result.add(titles.item(j));
}
}
}
javax.xml.xpath
鍖咃紝鎻愪緵涓涓紩鎿庡拰瀵硅薄妯″瀷鐙珛鐨?XPath 搴撱傝繖涓寘涔熷彲鐢ㄤ簬 Java 1.3 鍙婁互鍚庣殑鐗堟湰錛屼絾闇瑕佸崟鐙畨瑁?Java API for XML Processing (JAXP) 1.3銆俋alan 2.7 鍜?Saxon 8 浠ュ強鍏朵粬浜у搧鍖呭惈浜嗚繖涓簱鐨勫疄鐜般?
鍥為〉棣?/font>
娓呭崟 2. 鍖呭惈鍥句功淇℃伅鐨?XML 鏂囨。
<inventory>
<book year="2000">
<title>Snow Crash</title>
<author>Neal Stephenson</author>
<publisher>Spectra</publisher>
<isbn>0553380958</isbn>
<price>14.95</price>
</book>
<book year="2005">
<title>Burning Tower</title>
<author>Larry Niven</author>
<author>Jerry Pournelle</author>
<publisher>Pocket</publisher>
<isbn>0743416910</isbn>
<price>5.99</price>
<book>
<book year="1995">
<title>Zodiac</title>
<author>Neal Stephenson<author>
<publisher>Spectra</publisher>
<isbn>0553573862</isbn>
<price>7.50</price>
<book>
<!-- more books... -->
</inventory>
鎶借薄宸ュ巶
XPathFactory
鏄竴涓娊璞″伐鍘傘傛娊璞″伐鍘傝璁℃ā寮忎嬌寰楄繖涓縐?API 鑳藉鏀寔涓嶅悓鐨勫璞℃ā鍨嬶紝濡?DOM銆丣DOM 鍜?XOM銆備負浜嗛夋嫨涓嶅悓鐨勬ā鍨嬶紝闇瑕佸悜 XPathFactory.newInstance()
鏂規硶浼犻掓爣璇嗗璞℃ā鍨嬬殑緇熶竴璧勬簮鏍囪瘑絎︼紙URI錛夈傛瘮濡?http://xom.nu/ 鍙互閫夋嫨 XOM銆備絾瀹為檯涓婏紝鍒扮洰鍓嶄負姝?DOM 鏄 API 鏀寔鐨勬儫涓瀵硅薄妯″瀷銆?//book[author="Neal Stephenson"]
銆備負浜嗘壘鍑鴻繖浜涘浘涔︾殑鏍囬錛屽彧瑕佸鍔犱竴姝ワ紝琛ㄨ揪寮忓氨鍙樻垚浜?//book[author="Neal Stephenson"]/title
銆傛渶鍚庯紝鐪熸闇瑕佺殑鏄?title
鍏冪礌鐨勬枃鏈妭鐐瑰瀛愩傝繖灝辮姹傚啀澧炲姞涓姝ワ紝瀹屾暣鐨勮〃杈懼紡灝辨槸 //book[author="Neal Stephenson"]/title/text()
銆?Document
瀵硅薄涓備負浜嗙畝鍖栬搗瑙侊紝鍋囪璇ユ枃妗e湪褰撳墠宸ヤ綔鐩綍鐨?books.xml 鏂囦歡涓備笅闈㈢殑綆鍗曚唬鐮佺墖孌佃В鏋愭枃妗e茍寤虹珛瀵瑰簲鐨?Document
瀵硅薄錛?
娓呭崟 3. 鐢?JAXP 瑙f瀽鏂囨。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("books.xml");
XPathFactory
錛?/p>
XPathFactory factory = XPathFactory.newInstance();
XPath
瀵硅薄錛?
XPath xpath = factory.newXPath();
XPath
瀵硅薄緙栬瘧 XPath 琛ㄨ揪寮忥細
PathExpression expr = xpath.compile("http://book[author='Neal Stephenson']/title/text()");
鐩存帴姹傚?/b>
XPath
瀵硅薄璋冪敤 evaluate()
鏂規硶銆備絾鏄紝濡傛灉鍚屼竴涓〃杈懼紡瑕侀噸澶嶄嬌鐢ㄥ嬈★紝緙栬瘧鍙兘鏇村揩涓浜涖?
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList
錛岀劧鍚庨亶鍘嗗垪琛ㄥ緱鍒版墍鏈夌殑鏍囬錛?
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
throws
瀛愬彞涓0鏄庯紝浣嗘槸鎴戝湪涓婇潰鎶婂畠浠帺鐩栬搗鏉ヤ簡錛?
娓呭崟 4. 鐢ㄥ浐瀹氱殑 XPath 琛ㄨ揪寮忔煡璇?XML 鏂囨。鐨勫畬鏁寸▼搴?/b>
import Java.io.IOException;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
import javax.xml.xpath.*;
public class XPathExample {
public static void main(String[] args)
throws ParserConfigurationException, SAXException,
IOException, XPathExpressionException {
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true); // never forget this!
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("books.xml");
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr
= xpath.compile("http://book[author='Neal Stephenson']/title/text()");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
}
}
count(//book)
榪斿洖鏂囨。涓殑鍥句功鏁伴噺銆俋Path 琛ㄨ揪寮?count(//book[@author="Neal Stephenson"]) > 10
榪斿洖涓涓竷灝斿鹼細濡傛灉鏂囨。涓?Neal Stephenson 鐨勮憲浣滆秴榪?10 鏈垯榪斿洖 true錛屽惁鍒欒繑鍥?false銆?evaluate()
鏂規硶琚0鏄庝負榪斿洖 Object
銆傚疄闄呰繑鍥炰粈涔堜緷璧栦簬 XPath 琛ㄨ揪寮忕殑緇撴灉浠ュ強瑕佹眰鐨勭被鍨嬨備竴鑸潵璇達紝XPath 鐨?/p>
Java.lang.Double
Java.lang.String
Java.lang.Boolean
org.w3c.dom.NodeList
XPath 2
javax.xml.xpath.XPathConstants
綾諱腑鍛藉悕浜嗗父閲忥細
XPathConstants.NODESET
XPathConstants.BOOLEAN
XPathConstants.NUMBER
XPathConstants.STRING
XPathConstants.NODE
XPathConstants.NODE
瀹為檯涓婃病鏈夊尮閰嶇殑 XPath 綾誨瀷銆傚彧鏈夌煡閬?XPath 琛ㄨ揪寮忓彧榪斿洖涓涓妭鐐規垨鑰呭彧闇瑕佷竴涓妭鐐規椂鎵嶄嬌鐢ㄥ畠銆傚鏋?XPath 琛ㄨ揪寮忚繑鍥炰簡澶氫釜鑺傜偣騫朵笖鎸囧畾浜?XPathConstants.NODE
錛屽垯 evaluate()
鎸夌収鏂囨。欏哄簭榪斿洖絎竴涓妭鐐廣傚鏋?XPath 琛ㄨ揪寮忛夋嫨浜嗕竴涓┖闆嗗茍鎸囧畾浜?XPathConstants.NODE
錛屽垯 evaluate()
榪斿洖 null銆?evaluate()
灝嗘姏鍑?XPathException
銆?
javax.xml.namespace.NamespaceContext
鎺ュ彛鐨勫疄渚嬨傛瘮濡傦紝鍋囪鍥句功鏂囨。鏀懼湪 http://www.example.com/books 鍚嶇О絀洪棿涓紝濡?娓呭崟 5 鎵紺猴細
娓呭崟 5. 浣跨敤榛樿鍚嶇О絀洪棿鐨?XML 鏂囨。
<inventory xmlns="http://www.example.com/books">
<book year="2000">
<title>Snow Crash</title>
<author>Neal Stephenson</author>
<publisher>Spectra</publisher>
<isbn>0553380958</isbn>
<price>14.95<price>
</book>
<!-- more books... -->
<inventory>
//pre:book[pre:author="Neal Stephenson"]/pre:title/text()
銆備絾鏄紝蹇呴』灝嗗墠緙 pre
鏄犲皠鍒?URI http://www.example.com/books銆?code>NamespaceContext 鎺ュ彛鍦?Java 杞歡寮鍙戝伐鍏風錛圝DK錛夋垨 JAXP 涓病鏈夐粯璁ゅ疄鐜頒技涔庢湁鐐圭錛屼絾紜疄濡傛銆備笉榪囷紝鑷繁瀹炵幇涔熶笉闅俱?a >娓呭崟 6 瀵逛竴涓悕縐扮┖闂寸粰鍑轟簡綆鍗曠殑瀹炵幇銆傝繕闇瑕佹槧灝?xml
鍓嶇紑銆?
娓呭崟 6. 緇戝畾涓涓悕縐扮┖闂村拰榛樿鍚嶇О絀洪棿鐨勭畝鍗曚笂涓嬫枃
import Java.util.Iterator;
import javax.xml.*;
import javax.xml.namespace.NamespaceContext;
public class PersonalNamespaceContext implements NamespaceContext {
public String getNamespaceURI(String prefix) {
if (prefix == null) throw new NullPointerException("Null prefix");
else if ("pre".equals(prefix)) return "http://www.example.org/books";
else if ("xml".equals(prefix)) return XMLConstants.XML_NS_URI;
return XMLConstants.NULL_NS_URI;
}
// This method isn't necessary for XPath processing.
public String getPrefix(String uri) {
throw new UnsupportedOperationException();
}
// This method isn't necessary for XPath processing either.
public Iterator getPrefixes(String uri) {
throw new UnsupportedOperationException();
}
}
NamespaceContext
瀵硅薄鍚庯紝鍦ㄧ紪璇戣〃杈懼紡涔嬪墠灝嗗叾瀹夎鍒?XPath
瀵硅薄涓娿備互鍚庡氨鍙互鍍忎互鍓嶄竴鏍鋒槸鐢ㄨ繖浜涘墠緙鏌ヨ浜嗐傛瘮濡傦細
娓呭崟 7. 浣跨敤鍚嶇О絀洪棿鐨?XPath 鏌ヨ
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
xpath.setNamespaceContext(new PersonalNamespaceContext());
XPathExpression expr
= xpath.compile("http://pre:book[pre:author='Neal Stephenson']/pre:title/text()");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());
}
javax.xml.xpath.XPathFunction
鎺ュ彛銆傝繖涓帴鍙e彧澹版槑浜嗕竴涓柟娉?evaluate錛?
public Object evaluate(List args) throws XPathFunctionException
String
Double
Boolean
Nodelist
Node
Boolean
銆傝繖涓牎楠屽拰鐨勫熀鏈鍒欐槸鍓嶄節浣嶆暟鐨勬瘡涓浣嶄箻涓婂畠鐨勪綅緗紙鍗崇涓浣嶆暟涔樹笂 1錛岀浜屼綅鏁頒箻涓?2錛屼緷嬈$被鎺級銆傚皢榪欎簺鏁板姞璧鋒潵鐒跺悗鍙栭櫎浠?11 鐨勪綑鏁般傚鏋滀綑鏁版槸 10錛岄偅涔堟渶鍚庝竴浣嶆暟灝辨槸 X銆?
娓呭崟 8. 媯鏌?ISBN 鐨?XPath 鎵╁睍鍑芥暟
import Java.util.List;
import javax.xml.xpath.*;
import org.w3c.dom.*;
public class ISBNValidator implements XPathFunction {
// This class could easily be implemented as a Singleton.
public Object evaluate(List args) throws XPathFunctionException {
if (args.size() != 1) {
throw new XPathFunctionException("Wrong number of arguments to valid-isbn()");
}
String isbn;
Object o = args.get(0);
// perform conversions
if (o instanceof String) isbn = (String) args.get(0);
else if (o instanceof Boolean) isbn = o.toString();
else if (o instanceof Double) isbn = o.toString();
else if (o instanceof NodeList) {
NodeList list = (NodeList) o;
Node node = list.item(0);
// getTextContent is available in Java 5 and DOM 3.
// In Java 1.4 and DOM 2, you'd need to recursively
// accumulate the content.
isbn= node.getTextContent();
}
else {
throw new XPathFunctionException("Could not convert argument type");
}
char[] data = isbn.toCharArray();
if (data.length != 10) return Boolean.FALSE;
int checksum = 0;
for (int i = 0; i < 9; i++) {
checksum += (i+1) * (data[i]-'0');
}
int checkdigit = checksum % 11;
if (checkdigit + '0' == data[9] || (data[9] == 'X' && checkdigit == 10)) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
}
javax.xml.xpath.XPathFunctionResolver
銆傚嚱鏁版眰瑙e櫒灝嗗嚱鏁扮殑 XPath 鍚嶇О鍜屽悕縐扮┖闂?URI 鏄犲皠鍒板疄鐜拌鍑芥暟鐨?Java 綾匯?a >娓呭崟 9 鏄竴涓畝鍗曠殑鍑芥暟姹傝В鍣紝灝嗘墿灞曞嚱鏁?valid-isbn
鍜屽悕縐扮┖闂?http://www.example.org/books 鏄犲皠鍒?娓呭崟 8 涓殑綾匯傛瘮濡傦紝XPath 琛ㄨ揪寮?//book[not(pre:valid-isbn(isbn))]
鍙互鎵懼埌 ISBN 鏍¢獙鍜屼笉鍖歸厤鐨勬墍鏈夊浘涔︺?
娓呭崟 9. 璇嗗埆 valid-isbn 鎵╁睍鍑芥暟鐨勪笂涓嬫枃
iimport javax.xml.namespace.QName;
import javax.xml.xpath.*;
public class ISBNFunctionContext implements XPathFunctionResolver {
private static final QName name
= new QName("http://www.example.org/books", "valid-isbn");
public XPathFunction resolveFunction(QName name, int arity) {
if (name.equals(ISBNFunctionContext.name) && arity == 1) {
return new ISBNValidator();
}
return null;
}
}
NamespaceResolver
錛屽嵆渚挎煡璇㈢殑鏂囨。娌℃湁浣跨敤浠諱綍鍚嶇О絀洪棿銆傜敱浜?XPathFunctionResolver
銆?code>XPathFunction 鍜?NamespaceResolver
閮芥槸鎺ュ彛錛屽鏋滄柟渚跨殑璇濆彲浠ュ皢瀹冧滑鏀懼湪鎵鏈夌殑綾諱腑銆?
javax.xml.xpath
涔嬬被鐨?API 鍙互灝嗕袱鑰呯粨鍚堣搗鏉ャ傞殢鐫涓栫晫涓婅秺鏉ヨ秺澶氱殑鏁版嵁杞悜 XML錛?code>javax.xml.xpath 灝嗕笌 Java.sql
涓鏍峰彉寰楄秺鏉ヨ秺閲嶈銆?/p>
]]>
榪欐槸鏍囧噯鐨刋ML鏂囨。鐨勯琛屼唬鐮侊紝鍥犱負XSLT鏈韓涔熸槸XML鏂囨。銆?br />encoding灞炴х敤鏉ュ畾涔夋枃妗d嬌鐢ㄧ殑緙栫爜褰㈠紡錛宨so-8859-1涓昏鏀寔瑗挎鍜屽寳緹庣殑璇█緙栫爜銆?br />濡傛灉浣犳兂浣跨敤綆浣撲腑鏂囷紝閭d箞灝卞簲璇ュ啓鎴愶細
<?xml version="1.0" encoding="GB2312"?>
鎺ヤ笅鍘葷殑浠g爜鏄?
<xsl:stylesheet xmlns:xsl="
榪欐槸鏍囧噯鐨刋SLT鏂囦歡棣栬浠g爜銆倄sl:stylesheet浠g爜鐨勬剰鎬濇槸灝嗘枃妗d綔涓轟竴涓牱寮忚〃鏉?stylesheet)澶勭悊銆?br />xmlns:xsl灞炴ф槸涓涓悕瀛楃┖闂村0鏄庯紝鍜孹ML涓殑鍚嶅瓧絀洪棿浣跨敤鏂規硶涓鏍鳳紝鐢ㄦ潵闃叉鍏冪礌鍚嶇О閲嶅鍜屾販涔便?br />鍏朵腑鍓嶇紑xsl鐨勬剰鎬濇槸鏂囨。涓嬌鐢ㄧ殑鍏冪礌閬靛畧W3C鐨刋SLT瑙勮寖銆?br />鏈鍚庣殑version灞炴ц鏄庢牱寮忚〃鍙噰鐢╔SLT 1.0鐨勬爣鍑嗗姛鑳斤紝榪欎篃鏄洰鍓嶄粎鏈夌殑鏍囧噯銆?/p>
<xsl:template match="/"> 涓涓?lt;xsl:template>鍏冪礌瀹氫箟涓涓ā鏉胯鍒欍傚睘鎬atch="/"璇存槑XML婧愭枃妗d腑錛岃繖涓ā鏉胯鍒欎綔鐢ㄧ殑璧風偣銆?/"鏄竴縐峏Path璇硶錛屾垜浠湪鍚庨潰灝嗚緇嗚榪幫紝榪欓噷鐨?/"浠h〃XML緇撴瀯鏍戠殑鏍?root)銆?/p>
鎺ヤ笅鍘葷殑浠g爜鏄? <html> <head> <title>First XSLT Example</title> </head> <body> <p><xsl:value-of select="greeting"/></p> </body> </html> 璇存槑錛氬綋妯℃澘瑙勫垯琚Е鍙戯紝妯℃澘鐨勫唴瀹瑰氨浼氭帶鍒惰緭鍑虹殑緇撴灉銆備緥瀛愪腑錛屾ā鏉垮ぇ閮ㄥ垎鍐呭鐢盚TML鍏?br />绱犲拰鏂囨湰鏋勬垚銆傚彧鏈?lt;xsl:value-of>鍏冪礌鏄疿SLT璇硶錛岃繖閲?lt;xsl:value-of>鐨勪綔鐢ㄦ槸鎷瘋礉鍘熸枃妗d腑鐨?br />涓涓妭鐐圭殑鍊煎埌杈撳嚭鏂囨。銆傝宻elect灞炴у垯璇︾粏鎸囧畾瑕佸鐞嗙殑鑺傜偣鍚嶇О銆傝繖鏄疿Path璇硶錛?greeting" 鎻愮ず錛氱敱浜嶺ML鏂囨。鏄弗鏍肩殑灞傜駭緇撴瀯(鐢↖E5鏌ョ湅XML鏂囦歡錛屼細鐪嬭XML鏂囨。綾諱技澶氱駭鍏寵仈鑿滃崟)錛?br />鎵浠ユ垜浠艦璞$殑縐癤ML鏂囨。涓烘枃妗f爲錛屽叾涓瘡涓瀵瑰厓绱犵О浣滄爲鐨勪竴涓妭鐐廣傛牴鍏冪礌灝辨槸鏍硅妭鐐廣?/p>
鏈鍚庡叧闂墍鏈夊厓绱狅細 </xsl:template> </xsl:stylesheet>
鎶宸?/span>
1
/XPath: string end-with
鐨勬剰鎬濆氨鏄鎵炬牴鑺傜偣鍚嶄負greeting鐨勫厓绱狅紝騫剁敤妯℃澘鏉ュ鐞嗚繖涓妭鐐廣傚叿浣撶殑灝辨槸鎵懼埌<greeting>
鍏冪礌錛岀劧鍚庡皢鍏冪礌鐨勫?hello world"鎸夋ā鏉挎牱寮忔嫹璐濆埌杈撳嚭鏂囦歡銆?
]]>
銆銆
XmlNode.InnerText
涓?/span>
.InnerXml
鐨勫尯鍒槸錛氬墠鑰呭皢鍐呭涓殑
<
鍜?/span>
>
鍒嗗埆鍙樻垚
<
鍜?/span>
>
錛屽洜姝わ紝甯屾湜灝嗕袱孌?/span>
XmlDocument
鍚堝茍鐨勭▼搴忓彧鑳戒嬌鐢?/span>
XmlDocumentFragment.InnerXml = XmlNode.OuterXml
鎶宸?/span>
2
<xsl:for-each select="root/data[substring-after(@name,'.')= 'Text' and string-length(value)>0]">
鎶宸?/span>
3
銆銆涓涓?/span>
XML
鏂囨。鍦?/span>
Load
鏃跺鏋滃け璐ワ紝灝辨槸鏍規湰涓嶅悎娉曪紱鏄惁絎﹀悎鏌愪釜
Schema
錛?/span>
XSD
錛夌殑瑕佹眰鍒欐槸鏈夋晥鎬?/span>
(valid)
媯鏌ワ紝鏂規硶鏄嬌鐢?/span>
XmlValidatingReader
瀵硅薄鐨?/span>
Schemas
鍜?/span>
ValidationType
灞炴с?/span>
鎶宸?/span>
4
銆銆
XmlDataDocument
綾繪槸浠?/span>
XmlDocument
媧劇敓鍑烘潵鐨勶紝鏈閲嶈鐨勬槸澧炲姞浜嗕竴涓?/span>
DataSet
灞炴с備笉榪囪繖涓被涓嶆槸
System.Xml
鎻愪緵鐨勶紝鑰屾槸
System.Data
鎻愪緵鐨勩傚浜庢繪槸瑕佽窡鏁版嵁搴撴墦浜ら亾鐨勫簲鐢ㄧ▼搴忔潵璇達紝鍙嶆鏄寮曠敤
System.Data
鐨勶紝涓嶅鍏ㄩ儴鐢?/span>
XmlDataDocument
銆?/span>
鎶宸?/span>
5
銆銆濡備綍灝?/span>
XmlDataDocument
瀵硅薄涓殑
DataSet
鏇存柊淇濆瓨鍒版暟鎹簱涓紵
DataSet
鏈韓鏈変竴涓?/span>
AcceptChanges
鏂規硶錛屾墍浠ュ彧闇瑕侊細
xmlDataDoc.DataSet.AcceptChanges();
]]>