windy‘s j2ee1.4 tutorial (chinese) --Understanding XML(010)
2007-12-23 12:28:47 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁绘劦鍓欓崝銈囩磽瀹ュ拑韬€殿喖顭烽幃銏ゅ礂鐏忔牗瀚介梺璇查叄濞佳勭珶婵犲伣锝夘敊閸撗咃紲闂佺粯鍔﹂崜娆撳礉閵堝洨纾界€广儱鎷戦煬顒傗偓娈垮枛椤兘骞冮姀銈呯閻忓繑鐗楃€氫粙姊虹拠鏌ュ弰婵炰匠鍕彾濠电姴浼i敐澶樻晩闁告挆鍜冪床闂備胶绮崝锕傚礈濞嗘挸绀夐柕鍫濇川绾剧晫鈧箍鍎遍幏鎴︾叕椤掑倵鍋撳▓鍨灈妞ゎ厾鍏橀獮鍐閵堝懐顦ч柣蹇撶箲閻楁鈧矮绮欏铏规嫚閺屻儱寮板┑鐐板尃閸曨厾褰炬繝鐢靛Т娴硷綁鏁愭径妯绘櫓闂佸憡鎸嗛崪鍐簥闂傚倷鑳剁划顖炲礉閿曞倸绀堟繛鍡樻尭缁€澶愭煏閸繃宸濈痪鍓ф櫕閳ь剙绠嶉崕閬嶅箯閹达妇鍙曟い鎺戝€甸崑鎾斥枔閸喗鐏堝銈庡幘閸忔﹢鐛崘顔碱潊闁靛牆鎳愰ˇ褔鏌h箛鎾剁闁绘顨堥埀顒佺煯缁瑥顫忛搹瑙勫珰闁哄被鍎卞鏉库攽閻愭澘灏冮柛鏇ㄥ幘瑜扮偓绻濋悽闈浶㈠ù纭风秮閺佹劖寰勫Ο缁樻珦闂備礁鎲¢幐鍡涘椽閸愵亜绨ラ梻鍌氬€烽懗鍓佸垝椤栫偛绀夐柨鏇炲€哥粈鍫熺箾閸℃ɑ灏紒鈧径鎰厪闁割偅绻冨婵堢棯閸撗勬珪闁逞屽墮缁犲秹宕曢柆宥呯闁硅揪濡囬崣鏇熴亜閹烘垵鈧敻宕戦幘鏂ユ灁闁割煈鍠楅悘鍫濐渻閵堝骸骞橀柛蹇旓耿閻涱噣宕橀纰辨綂闂侀潧鐗嗛幊鎰八囪閺岋綀绠涢幘鍓侇唹闂佺粯顨嗛〃鍫ュ焵椤掍胶鐓紒顔界懃椤繘鎼圭憴鍕彴闂佸搫琚崕鍗烆嚕閺夊簱鏀介柣鎰緲鐏忓啴鏌涢弴銊ュ箻鐟滄壆鍋撶换婵嬫偨闂堟刀銏犆圭涵椋庣М闁轰焦鍔栧鍕熺紒妯荤彟闂傚倷绀侀幉锟犲箰閸℃稑妞介柛鎰典簻缁ㄣ儵姊婚崒姘偓鐑芥嚄閸撲礁鍨濇い鏍仜缁€澶愭煥閺囩偛鈧摜绮堥崼鐔虹闁糕剝蓱鐏忣厾绱掗埀顒佸緞閹邦厾鍘梺鍓插亝缁诲啫顔忓┑鍫㈡/闁告挆鍕彧闂侀€炲苯澧紒鐘茬Ч瀹曟洟鏌嗗鍛唵闂佺鎻俊鍥矗閺囩喆浜滈柟鐑樺灥閳ь剛鏁诲畷鎴﹀箻閺傘儲鐏侀梺鍓茬厛閸犳鎮橀崼婵愭富闁靛牆楠搁獮姗€鏌涜箛鏃撹€块柣娑卞櫍瀹曟﹢顢欑喊杈ㄧ秱闂備線娼ч悧鍡涘箠閹板叓鍥樄闁哄矉缍€缁犳盯骞橀崜渚囧敼闂備胶绮〃鍡涖€冮崼銉ョ劦妞ゆ帊鑳堕悡顖滅磼椤旂晫鎳冩い顐㈢箻閹煎湱鎲撮崟顐ゅ酱闂備礁鎼悮顐﹀磿閸楃儐鍤曢柡澶婄氨閺€浠嬫煟閹邦厽绶查悘蹇撳暣閺屾盯寮撮妸銉ョ閻熸粍澹嗛崑鎾舵崲濠靛鍋ㄩ梻鍫熷垁閵忕妴鍦兜妞嬪海袦闂佽桨鐒﹂崝鏍ь嚗閸曨倠鐔虹磼濡崵褰熼梻鍌氬€风粈渚€骞夐敓鐘茬闁糕剝绋戝浠嬫煕閹板吀绨荤紒銊e劦濮婂宕掑顑藉亾瀹勬噴褰掑炊椤掑鏅梺鍝勭▉閸樺ジ宕归崒鐐茬婵烇綆鍓欐俊鑲╃磼閳ь剟宕橀鐣屽弳濠电娀娼уΛ娆撍夊⿰鍫熺厽闁挎洖鍊烽幉鐐叏婵犲偆鐓肩€规洘甯掗埢搴ㄥ箳閹存繂鑵愬┑锛勫亼閸婃垿宕硅ぐ鎺撴櫇闁靛牆顦悡婵堚偓骞垮劚椤︻垶宕¢幎鑺ョ厪闊洦娲栧暩濡炪倖鏌ㄩˇ闈涱潖濞差亜绠归柣鎰絻婵爼姊洪崨濠冨鞍闁荤啿鏅犻獮鍐潨閳ь剟鐛惔銊﹀殟闁靛/鍐ㄧ闂傚倷绀侀幉锟犲礉閹达箑绀夐幖娣灪濞呯娀鏌¢崶鈺佇ョ痪鎯с偢閺屽秷顧侀柛鎾跺枎閻e嘲顫滈埀顒勫春閻愭潙绶為柛婵勫劤濞夊潡姊婚崒姘g湅闁稿瀚叅闁靛牆鎮胯ぐ鎺撳€婚柛鎾崇仢濞差參寮崘顔肩劦妞ゆ帒瀚粻鎺撶節閻㈤潧孝闁挎洏鍊濋幃褑绠涘☉娆忎患濠电偛妯婃禍婵嬫偂濞戙垺鍊堕柣鎰邦杺閸ゆ瑥鈹戦垾鐐藉仮闁哄苯绉堕幉鎾礋椤愩倓绱濋柣搴ゎ潐濞叉牕鐣烽鍕厺閹兼番鍊楅悿鈧梺瑙勫劤椤曨厼危濡ゅ啰纾介柛灞捐壘閳ь剚鎮傚畷鎰版倻閼恒儮鎸冮悗骞垮劚椤︻垳绮堟径鎰閺夊牆澧介崚浼存煕閵婏妇绠栭柕鍥у瀵粙顢曢~顓犳崟濠碘剝顨呴幊妯侯潖濞差亜宸濆┑鐘插暙椤︹晠姊洪幖鐐插濠㈢懓妫涢崚鎺撶節濮橆剛顔呴梺鍏间航閸庨亶鍩€椤掑倹鏆柡灞诲妼閳规垿宕卞▎蹇撴瘓缂傚倷闄嶉崝蹇撐涢崟顖涚畳闂備胶绮灙鐎规洜鏁婚幃楣冩倻濡寮挎繝鐢靛Т閸燁垶濡靛┑鍥︾箚妞ゆ劑鍨归弳娆撴煃閽樺妲搁柍璇查叄楠炲洭顢橀悙鈺佷壕闁绘垼濮ら埛鎴︽偣閸ャ劌绲绘い鎺嬪灲閺岋綁顢樿濞呭秶鈧娲╃换婵嬬嵁鎼淬劍鍤嶉柕澶堝劙缁勪繆閻愵亜鈧牕煤瀹ュ纾婚柟鎯х亪閸嬫挾鎲撮崟顒傤槬闂佺粯鐗曢妶鎼佸Υ娴h倽鏃€鎷呴崫銉х嵁闂佽鍑界紞鍡涘磻閸涘瓨鍋熸い鎰ㄦ噰閺€浠嬫煟濡澧柛鐔风箻閺屾盯鏁愭惔锛勪化閻庡灚婢橀敃顏勭暦濠婂棭妲烽梺绋款儐閹稿墽鍒掗鐐╂婵☆垳绮幃娆戠磽娴e搫校闁绘搫绻濆璇测槈閵忕姈銊︺亜閺冨倸甯舵い顐熸櫊濮婃椽鎸婃径濠冩闂佸摜濮甸悧鐘差嚕婵犳碍鏅插璺猴攻椤ユ繈姊洪崷顓€鍦偓娑掓櫊瀹曚即骞囬悧鍫氭嫼闂佺厧顫曢崐鏇㈠几鎼达絿纾界€广儱鎷戦煬顒傗偓娈垮枦椤曆囧煡婢舵劕鐓戦柍瑙勫劤娴滈箖鏌ㄩ弴鐐测偓鍝ョ不閿濆棛绡€闂傚牊绋掑婵喢瑰⿰搴濈凹濞e洤锕幃娆擃敂閸曘劌浜鹃柕鍫濐槸缁€鍫熺箾閸℃ɑ灏伴柛瀣儔閺屾盯鍩勯崘顏佹灁闂侀€炲苯澧俊顐㈠暙閻e嘲顫滈埀顒勩€佸▎鎾冲簥濠㈣鍨板ú銈囩不閸︻厾纾兼い鏃傚帶鐢劑鏌涚€n偅宕岄柟宕囧█椤㈡鍩€椤掑嫬鍚规い鎺戝€荤壕浠嬫煕鐏炴崘澹橀柍褜鍓熼ˉ鎾斥枎閵忋倖鏅搁柣妯垮皺閻涖儱鈹戞幊閸婃洟骞婃惔锝囦笉濞寸厧鐡ㄩ悡娆撴⒒閸屾凹鍤熼柛鏂跨Ч閺屾稓鈧急鍕彋闂佸搫鐭夌紞渚€鐛€n喗鏅查柛鈾€鏅滈ˉ澶岀磽娴i缚妾搁柛妯绘倐瀹曟垿骞樼紒妯锋嫽婵炶揪缍€濞咃絿鏁☉銏$厱闁哄啠鍋撴繛鍙夌矌閸掓帡寮崼鐕佹濠电偟顥愬▍鏇㈡儎椤栨氨鏆︽慨妞诲亾妞ゃ垺鐟╁畷妤呭礂婢惰宀稿缁樼瑹閳ь剟鍩€椤掑倸浠滈柤娲诲灡閺呭爼顢涢悙瀵稿帾闂佹悶鍎滈崘鍙ョ磾婵°倗濮烽崑鐐垫暜閿熺姷宓侀悗锝庝簴閺€浠嬫煙闁缚绨界痪鎯ь煼濮婅櫣鎷犻崣澶婃敪濡炪値鍋勯ˇ鐢哥嵁閹邦収妲归幖杈剧悼閻掑吋绻涢幘鏉戠劰闁稿鎹囬弻娑㈠煛閸愩劋妲愬Δ鐘靛仜椤戝寮崒鐐村癄濠㈣泛顦伴惈蹇涙⒒閸屾瑧顦︽繝鈧潏鈺佸灊妞ゆ牗绮嶉弳婊堟煃閸濆嫬鈧悂顢氶柆宥嗙厓鐟滄粓宕滃☉姘潟闁规儳鐡ㄦ刊鎾煟閻斿憡绶插┑顔哄灲閹嘲饪伴崟顐闂佺ǹ顑囬崰鏍х暦濮樿泛绠抽柟瀛樻⒐閻庡姊虹憴鍕姢闁汇倕娲獮妤呭即閻愨晜鏂€闂佺粯鍔栧ḿ娆撴倶閿曞倹鐓熸い鎾楀啯鐏堥梺瀹狀唺缁瑩銆侀弮鍫濋唶闁绘柨鎼獮宥夋⒑閼姐倕鏋戦柣鐔村劤閳ь剚鍑归崜姘跺箞閵娾晛鐐婇柕濠忕导缁ㄥ姊洪棃娑辨濠碘€虫川缁鎮欑€涙ê寮挎繝鐢靛Т閸燁垶濡靛┑瀣厸閻忕偠濮ら崵鍥煙椤旂晫鎳囬柟宕囧Х閹瑰嫭绗熼娆戠>濠电姷鏁告慨顓㈠箯閸愵喖纾兼慨姗嗗墰閵堫噣姊绘担鍛婃儓闁活剙銈稿畷浼村冀椤撶偟顔愰悷婊呭鐢晠寮崘顔界叆婵犻潧妫欓崳浠嬫煥濞戞瑦宕屾慨濠勭帛閹峰懘鎮烽柇锕€娈濈紓鍌欐祰椤曆呪偓姘緲閻g兘骞嬪┑鍐╊潔闂侀潧绻掓慨鐑藉储閹绢喗鈷戦柣鐔煎亰閸ょ喎鈹戦鍛籍鐎规洘鍨块獮妯肩磼濡粯鐝抽梺鍦帶閻°劑鏁嬫繛瀛樼矌閸嬫捇濡甸崟顖氱閻庣數纭舵慨鍥р攽閻愬弶鍣归柨鏇ㄤ邯瀵鏁嶉崟顏呭媰闂佷紮绲介惈妤呮晲閸℃瑧顔曠紒鐐緲瑜板鏌囬娑辨闁绘劘灏欑粻鍐裁归悪鍛暤闁圭ǹ锕ュ鍕節閸涱厼缂氶梻鍌氬€搁崐鎼佸磹閻戣姤鍊块柨鏇炲€归崕鎴犳喐閻楀牆绗掔痪鎯х秺閺岋繝宕堕妷銉т患缂備胶濮锋繛鈧柡宀€鍠栭弻鍥晝閳ь剟寮搁悢鎼炰簻妞ゆ劧绲剧粈瀣煛瀹€鈧崰鏍嵁閸℃凹妲鹃梺鍦櫕婵挳鍩為幋锔绘晬婵炴垶鐟ラ崬澶愭⒑閸濆嫭婀伴柣鈺婂灦閻涱喖顫滈埀顒€顕i崼鏇炵闁绘ḿ鍋i崑锟犳⒒閸屾瑧顦﹂柟璇х節楠炴劗绮欑捄銊︽濡炪倖甯掔€氀囧焵椤掍焦顥堢€规洘锕㈤、娆撳床婢诡垰娲﹂悡鏇㈡煃閳轰礁鏋ゆ繛鍫熋湁闁绘ǹ娅曢崐鎰叏婵犲啯銇濋柟绛圭節婵″爼宕ㄩ鐣屾И闂傚倷绀侀幖顐﹀箠韫囨稒鍎庢い鏍仜缁犳牕螖閿濆懎鏆為柛濠傤煼閺岋箑螣閻氬绀嗛梺闈浤涢崟顐g€惧┑鐘灱閸╂牠宕濋弴鐘差棜濠电姵纰嶉悡娆撴煕閹炬鎳庣粭锟犳⒑閸濆嫭鍣洪柣鎿勭節閻涱噣寮介銏犵亰闂佽崵鍠愬姗€鍩涙径鎰拺閻犲洩灏欑粻鎵磼婢跺本鍤€妞ゎ偄绻橀幖褰掑捶椤撶媴绱叉繝纰樻閸ㄧ敻顢氳濡嫬顓奸崨顏呮杸闂佺粯鍔栬ぐ鍐棯瑜旈弻銊╁即濡櫣浠炬繛锝呮搐閿曨亪骞冮悾宀€鐭欓悹渚厛濡茶淇婇悙顏勨偓鏍偋濡も偓椤繈濡搁埡鍌氫痪闂侀€炲苯澧存慨濠傤煼瀹曟帒顫濋钘変壕闁归棿鐒﹂崑瀣攽閻樻彃顏柣顓熺懇閺岀喖鏌囬敃鈧弸锕€鈹戦钘夆枙闁哄被鍊曢湁閻庯綆鍋呴悵鏍磼閻愵剙绀冩俊顐㈠濠€渚€姊洪幐搴g畵闁绘锕棢濠㈣埖鍔栭悡鐔兼煙閻愵剚缍戝┑顔肩墦閺岀喐绗熼崹顔碱瀳闁句紮绲跨槐鎺斺偓锝庝簽娴犮垺銇勯鈧鍛村煘閹达箑鐏抽柛鎰皺妤犲洭姊洪崨濠冣拹闁荤啿鏅犻幃浼搭敊閸㈠鍠栧畷妤呮偂鎼达絽閰遍梻鍌欐祰閸嬫劙鍩涢崼銉ョ闁挎洍鍋撻崡鍗灻归悡搴f憼闁抽攱甯掗湁闁挎繂姣ヨぐ鎺戞辈闂侇剙绉甸悡娆戠棯閺夊灝鑸瑰ù婊勫閳ь剝顫夊ú姗€宕濋弽顐e床婵犻潧鏌婇幒鏃傜煓闁圭ǹ楠搁弸鐘绘倵濞堝灝鏋﹂柛鈺傜墵楠炲棝寮崼婵堫啋闁诲孩绋掕摫婵犮垺鍨甸埞鎴︽晬閸曨偂鏉梺绋匡攻閻楁洟锝炶箛鏃傜瘈婵﹩鍎甸妷鈺傚€甸柨婵嗙凹閹查箖鏌涢悢閿嬪殗闁哄本娲樺鍕槈濠婂拋妲瑰┑鐐茬摠缁秶鍒掑澶娢﹂柛鏇ㄥ灠缁犲鎮规ウ鎸庛€冪紒顔挎硾閳规垿鍩勯崘銊хシ濡炪値鍘鹃崗妯侯嚕婵犳碍鏅插璺侯儐濞呮粓姊洪幖鐐插妧闁告劑鍔庨鍝勨攽鎺抽崐妤佹叏閻戣棄纾婚柣鎰仛閺嗘粓鏌ㄩ悢鍝勑ョ€规挷绶氶幃妤呮晲鎼粹剝鐏堢紓渚囧亜缁夊綊寮诲鍫闂佸憡鎸鹃崰鏍嵁閸愩剮鏃€鎷呴搹鍦婵犳鍠楅敃鈺呭储閹间礁绠繛宸簼閻撶喖鏌i弬鎸庢喐闁瑰啿鍟撮幃妤€顫濋悡搴$睄閻庤娲樺ú鏍亙闂佸憡渚楅崰姘跺储閸楃偐鏀介柍钘夋閻忋儵鏌曢崱蹇撲壕闂備胶枪椤戝棝骞戦崶顒€绠栭柕蹇嬪€曠粻鐢告煙閻戞ê鐏╅梻鍐e亾婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繘鏌i幋锝嗩棄闁哄绶氶弻娑樷槈濮楀牊鏁鹃梺鍛婄懃缁绘﹢寮婚敐澶婄闁挎繂妫Λ鍕⒑閸濆嫷鍎庣紒鑸靛哺瀵鈽夊Ο閿嬵潔濠殿喗顨呴悧濠囧极妤e啯鈷戦柛娑橈功閹冲啰绱掔紒妯虹伌濠碉紕鏁诲畷鐔碱敍濮橀硸鍟嬮梻浣告啞椤ㄥ牓宕戦悢鍝ヮ浄闁兼祴鏅濈壕濂告煟閹伴潧澧柛鏂诲€栭妵鍕敇閻樻彃骞嬮悗娈垮枛椤兘骞冮姀銈嗗亗閹艰揪缍嗗Σ鍫曟煟閻斿摜鐭婄紒缁樺浮瀵偊顢欑亸鏍潔闂侀潧楠忕槐鏇㈠储閹剧粯鈷掑ù锝呮憸娴犮垺銇勯幋婵囧殗闁诡喗锕㈤弫鍐磼濞戞艾甯鹃梻浣规偠閸庢粓宕橀崣銉х>濠德板€楁慨鐑藉磻閻愬灚鏆滈柍銉ョ-閺嗭箓鏌涘Δ鍐ㄥ壉婵炴挸顭烽弻鐔碱敍閸℃婀版い銉磿缁辨捇宕掑顑藉亾閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛闂佽姤蓱缁诲牆顫忓ú顏嶆晢闁逞屽墰缁棃骞橀鐓庡殤婵炶揪绲跨涵鍫曞绩娴犲鐓熸俊顖涘閻濐亪鏌i妸锕€鐏╅柍褜鍓濋~澶愬箰妞嬪孩顐芥慨妯挎硾閽冪喐绻涢幋娆忕仼闁绘帗妞介弻娑㈠箛閸忓摜鎸夋繝娈垮枛濞差厼顫忛搹鍦煓闁告牑鈧啿顫犻梻浣呵圭换鎴︽晝閵忕媭鍤曢悹鍥ㄧゴ濡插牊淇婇鐐存暠闁哄倵鍋撻梻鍌欒兌绾爼宕滃┑瀣ㄢ偓鍐疀閺傛鍤ら梺閫炲苯澧ǎ鍥э躬閹瑩顢旈崟銊ヤ壕闁哄诞灞剧稁閻熸粎澧楃敮鎺旂矆婢舵劖鐓涢柛銉e劚閻忊晠鏌i幘杈捐€块柡宀€鍠愬ḿ蹇斻偅閸愨晩鈧秹姊虹粙鍖″伐妞ゎ厾鍏樺璇测槈閵忕姈銊╂煏韫囧﹤澧查柣婵囩墵閺屸€愁吋韫囨洜鐦堝┑顔硷功缁垶骞忛崨鏉戝窛濠电姴鍊瑰▓姗€姊绘担鍛婅础閺嬵亝銇勯鐘插幋妤犵偛鍟撮幃婊堟嚍閵夛附鐝曢梻浣风串缁茶姤寰勯崶顒€缁╅柧蹇e亞缁♀偓闂佹眹鍨藉ḿ褍鐡繝鐢靛仩椤曟粎绮婚幘宕囨殾闁汇垻枪缁€鍐┿亜閺冨倹娅曢柛妯绘崌濮婃椽宕ㄦ繝鍕暤闁诲孩鍑归崜鐔奉嚕閹惰姤鍋勯柛蹇氬亹閸欏棗鈹戦悙鏉戠仸闁荤啙鍥ㄥ剹闁圭儤鎸婚崣蹇撯攽閻樺弶宸濈紒鍙樺嵆閺屾洟宕堕妸銉ヮ潚濡ょ姷鍋炵敮锟犵嵁鐎n亖鍫柛鎰ㄦ櫇閳ь剚濞婂濠氬磼濞嗘埈妲梺纭咁嚋缁绘繈骞冮悜钘壩ㄩ柨鏃傜帛椤旀棃姊鸿ぐ鎺擄紵缂佲偓娓氣偓閹€斥攽鐎n偆鍘甸梺缁樺姦閸撴岸鎮橀柆宥嗙厱妞ゆ劦鍋傞柇顖炴煛鐏炲墽娲存い銏℃礋婵″爼宕ㄩ鍙ョ按闂傚倷绀侀幉陇鎽梺璇″枛閸婂灝顕f繝姘櫜闁割偁鍨婚弶鎼佹⒑閸濆嫭宸濋柛瀣耿楠炲顦版惔锝囷紲缂傚倷闄嶉崹褰掔嵁閺嶎厽鐓熼柡宥庡亜鐢爼鏌i敐鍥у幋妤犵偛顑夐弫鍐焵椤掑倻涓嶅┑鐘崇閸嬶綁鏌涢妷顔荤盎闁汇劍妞介弻锝夊Χ閸屾矮澹曟繝鐢靛Х閺佹悂宕戦悩璇茬妞ゅ繐妫楃欢銈吤归悩宸剰缂佺姷鍠栭弻銊╂偄閸濆嫅銏㈢棯閹规劦娼愰柕鍥у瀵粙顢曢~顓熷媰闂備焦濞婇弨閬嶅垂瑜版帗鍎夋い蹇撶墱閺佸洭鏌i幇顓熺稇婵炲拑绲剧换娑氣偓娑欋缚閻﹦绱撳鍜冭含妤犵偛鍟伴幑鍕偘閳╁喚娼旈梻浣告惈鐠囩偤宕橀妸鎰礋濮婄粯鎷呴搹骞库偓濠囨煛閸屾瑧绐旂€规洘鍨块獮姗€骞囨担鐟扮槣闂備線娼ч悧鍡椢涘Δ鍐當闁圭儤顨嗛悡鏇㈡煟閺囨氨顦﹀ù婊€鍗抽弻鐔碱敍濮橆剚娈柣鎾卞€栭妵鍕疀閹炬潙娅ч梺鍛娒幉锛勬崲濞戞瑦缍囬柛鎾楀啫鐓傛繝鐢靛Л閸嬫捇寮堕崼娑樺婵炲懐濮甸妵鍕疀閹捐泛顤€闂佺粯鎸搁崯鎾箖瀹勬壋鏋庨煫鍥ㄦ惄娴犲ジ姊虹拠鑼闁瑰憡濞婂濠氭偄绾拌鲸鏅╅梺浼欑到閺堫剟宕虫导瀛樺€垫繛鍫濈仢閺嬫盯鏌i弽褋鍋㈤柣娑卞枤閳ь剨缍嗛崰妤呭磻閹版澘绾ч柛顐亞閸樻盯鏌℃担鍛婂枠婵﹤顭峰畷鎺戭潩椤戣棄浜惧瀣捣閻棗霉閿濆浜ら柤鏉挎健瀵爼宕煎☉妯侯瀷婵炲濮靛畝绋款潖缂佹ɑ濯村〒姘煎灡閺侇垱绻濆▓鍨灁闁稿﹥顨婂畷姘跺箳閹炬潙鍔呴梺闈浨归崕鎶剿囬锔解拺闁革富鍘奸崝瀣亜閵娿儲鍣介柣姘劤椤撳吋寰勭€n剙骞堟俊鐐€栭崝鎴﹀磹閺囥垹鍑犻幖绮瑰煑瑜版帗鍋愰柣鎴烇供娴犫晝绱撴担浠嬪摵闁圭ǹ顭烽獮蹇涘川閺夋垹顦梺鍦帛鐢帗绔熷鍡曠箚闁绘劦浜滈埀顒佺墪鐓ゆ俊顖濆吹缁犳儳鈹戦悩鍙夋悙闁哄绶氶弻娑㈠箛闂堟稒鐏堢紒鐐劤閸氬鎹㈠☉銏犵闁绘劘娉涢ˉ婵單旈悩闈涗粶闁绘鎸搁~蹇曠磼濡顎撻梺鍛婄☉閿曘儵宕曢幘鏂ユ斀闁绘劘灏欏﹢鎾煕閵娿劍顥夐柣锝呭槻閳规垿宕卞▎鎰暦闂備礁鎲″ú锕傚礈濞嗘挸鐒垫い鎺嗗亾闁绘牕銈稿濠氭晲閸涘倻鍠栭幊鏍煛娴d警鍋ч梻鍌欒兌缁垶骞愮拠瑁佹椽鎮㈤悡搴ゆ憰闂佺粯鏌ㄩ崥瀣吹鐎n偁浜滈柟鍝勬娴滅偓绻濈喊澶岀?闁告鍥ㄧ畳婵犵數濮撮敃銈団偓姘煎墴瀹曟繈濡舵径瀣帗闁荤喐鐟ョ€氼剟鎮橀幘顔界厸濞达絽鎽滄晥閻庤娲滈崰鏍€侀弴銏犵労闁告劏鏅濈粣鏃堟⒒閸屾艾鈧兘鎳楅懜鐢典粴闂備焦瀵уú蹇涘磿閻㈢ǹ绠栫憸鏃堝箖閳哄懏鍤戞い鎺嶇劍椤旀洘绻濋悽闈涒枅婵炰匠鍥舵晞闁糕剝绋戦悿鐐節闂堟侗鍎愰柣鎾冲暟閹茬ǹ饪伴崼婵堫槶闂佺粯姊婚崢褔鎮橀幎鑺ョ叆闁哄洨鍋涢埀顒佹倐閺屻劑濡堕崱鏇犵畾闂侀潧鐗嗛崐鍛婄妤e啯鈷戠紓浣姑粭鎺楁煟韫囨柨鍝哄┑锛勬暬瀹曠喖顢涘槌栧敽闁诲骸绠嶉崕閬嶆偋閸℃稑鍌ㄩ柨娑樺绾捐棄霉閿濆懏鎯堢€涙繃绻濋埛鈧崒婊呯厯闂佺硶鏂侀崑鎾愁渻閵堝棗鍧婇柛瀣崌閺屾稑螣閼姐倗鐓夐悗瑙勬礃閸ㄥ潡鐛鈧顒勫Ψ閿旇姤婢戦梻鍌欒兌缁垱鐏欐繛瀛樼矤閸撴稓鍒掗敐澶婄睄闁割偆鍠撻崢閬嶆煟鎼搭垳绉甸柛瀣笒閳绘捇寮崼鐔哄帗闁荤喐鐟ョ€氼剟鎮樼€涙ǜ浜滈柕蹇ョ磿閹冲懏绻涢幋鐘虫毈闁诡喗绮撻幃鍓т沪閽樺鍞ㄥ┑鐘垫暩婵兘寮幖浣哥;婵炴垯鍨圭粻顖炴煙鐎电ǹ孝缂佽翰鍊濋弻娑⑩€﹂幋婵囨疇闂佹寧绻傞ˇ顖滅不濞戙垺鐓涘璺哄绾埖銇勯弬鍖¤含婵﹥妞介幃鐑藉级閹稿孩鐦g紓浣稿⒔閾忓酣宕i崘銊ф殾濞村吋娼欑粻濠氭偣閸ヮ亜鐨烘い鏂挎濮婅櫣绱掑Ο鍓佺窗缂備緡鍣崹璺虹暦閻㈢ǹ绠i柨鏃傛櫕閸樺墽绱撴担鍓插創婵炲娲樼粋鎺戔槈濞嗘劕寮块梺鎸庣箓濡鎱ㄥ鍡樺弿濠电姴鍋嗛悡鑲┾偓瑙勬礃鐢帡锝炲┑瀣垫晞闁芥ê顦竟鏇㈡⒑缂佹ê鐏卞┑顔哄€濆畷鐢稿礋椤栨稓鍘鹃梺鍛婄缚閸庢煡寮抽埡浼卞綊鎮╁畷鍥舵殹缂備胶绮换鍫ュ箖娴犲顥堟繛鎴烆殘閹规洘淇婇悙顏勨偓鏍洪敃鍌氱煑闁告劑鍔庨弳锔戒繆閵堝倸浜鹃柧浼欑到閵嗘帒顫濋悡搴d哗濠电偛鐗勯崝宀勨€旈崘顔嘉ч柛鈩冾殔椤洭姊虹粙鍖℃敾闁绘绮撻崺鈧い鎺嶈兌椤e弶鎱ㄥΟ绋垮闁糕斁鍋撳銈嗗笒閸婂綊宕甸埀顒佺節閵忋垺鍤€闁挎洦浜滈悾閿嬪閺夋垵鍞ㄩ悷婊冾樀瀵悂寮崼鐔哄帾婵犵數濮寸换鎰般€呴鍌滅<闁抽敮鍋撻柛瀣崌濮婄粯鎷呴崷顓熻弴闂佹悶鍔忓Λ鍕幓閼愁垼妲奸梺缁橆殔濞撮妲愰幘瀛樺闁告繂瀚竟鏇炩攽閻橆喖鐏畝锝堟硶閸掓帡寮崼鐔蜂画闂備緡鍙忕粻鎴濃枔閵娾晜鈷戦柛婵嗗椤箓鏌涙惔銈勫惈缂侇喖顭烽幃浠嬪川婵犲嫬骞嶉梻浣虹帛閸ㄨ泛鐜荤捄銊т笉婵せ鍋撻柡灞剧洴閹瑩宕归锝嗙槗闂備礁鎼惌澶岀礊娓氣偓楠炲啴鍩¢崨顔尖偓缁樻叏濡も偓濡棃宕Δ鍛拺閻犲洩灏欑粻鎵磼鐠囪尙澧︾€规洘绻傞悾婵嬪礋閸偅娅撻梻濠庡亜濞诧妇绮欓幋婵囨殰闂佽崵鍠愮划宀勊囬棃娑氭殾闁硅揪绠戠粻濠氭煠閹间焦娑ч柡瀣€垮娲川婵犲啫顦╅梺鍛婃尰閻熝囧窗婵犲偆鍚嬮柛娑变簼閺傗偓闂備礁鐤囧Λ鍕涘Δ浣侯洸婵犻潧鐗忕壕濂告偣閸ャ劌绲婚柍褜鍓欏ḿ锟犲极閹扮増鍊烽柛鎾茶兌閺夌ǹ鈹戦悙鏉戠仸闁荤噦绠撳畷鏇㈩敂閸啿鎷洪梻鍌氱墐閺呮盯鎯佸⿰鍫熺厱婵せ鍋撶紒鐘崇墵瀵偄顓奸崨顏勭墯闂佸憡鍔х徊楣冨棘閳ь剟姊绘担鍝ユ瀮婵☆偄瀚灋婵°倕鎳忛崐鍫曟煟濡偐甯涢柣鎾寸懅閻ヮ亪寮堕崹顔垮煘婵炲瓨绮堥崡鎶藉蓟閵娿儮鏀介柛顐g箑缁泛顪冮妶鍡樺碍闁靛牏枪閻g兘宕奸弴鐐靛幐闂佸憡鍔樺▔鏇㈡⒒椤栨稓绡€闁汇垽娼ф禒鈺呮煙濞茶绨界紒杈╁仦缁楃喖鍩€椤掑啯锛傞梻浣筋潐瀹曟﹢顢氳缁牊寰勭仦绋夸壕妤犵偛鐏濋崝姘亜閿斿灝宓嗛柟顔光偓鏂ユ瀻闁瑰濮烽敍婊堟煟鎼搭垳绉靛ù婊呭仦缁傛帡濮€閵堝棛鍘搁梺绯曞墲缁嬫劙骞夋ィ鍐╃厸鐎光偓鐎n剛袦闂佽桨鐒﹂崝娆忕暦閹偊妲诲Δ鐘靛仜椤戝懓鐏冮梺缁橈耿濞佳勭濠婂嫨浜滈柟瀛樼箥濡偓閻庢鍣崑濠傜暦濮椻偓椤㈡瑩鎳栭埡浣感曞┑锛勫亼閸婃牜鏁幒妤€纾圭紓浣贯缚閳绘梻鈧箍鍎遍幊澶愬绩娴犲鐓熸俊顖濇閿涘秵銇勯敐鍡欏弨闁哄本绋撻埀顒婄到婢у海绮旈鈧弻锛勪沪閸撗勫垱婵犵绱曢崗姗€鐛€n亖鏀介柛鈩兩戦宥呪攽鎺抽崐妤佹叏閺夋嚚娲敇閵忕姷鐣哄┑掳鍊曢崯顖炲窗閸℃稒鐓曢柡鍥ュ妼婢ь喚鐥弶璺ㄐょ紒杈ㄦ尰閹峰懘宕滈崣澹囨⒑閻熺増鍟炲┑鐐诧躬瀹曡銈i崘銊х潉闂佸壊鍋呯换鍕囬妸銉富闁靛牆妫欓悡銉︿繆閹绘帞澧fい锕€缍婇弻锛勪沪閸撗勫垱闂佺硶鏅涚€氭澘鐣峰Δ鍛亼闁逞屽墯缁傚秹顢旈崟搴㈢洴瀹曠喖顢曢銏″€梻浣规偠閸庮噣寮插┑瀣櫖婵犻潧娲ㄧ粻楣冨级閸繂鈷旈柛鎺撴緲椤潡鎮风敮顔垮惈閻庤娲樺ú鐔肩嵁閸ヮ剚鍋嬮柛顐犲灩楠炲牓姊绘笟鈧ḿ褎鐏欓梺绋块叄娴滃爼濡撮崒姘辨殾闁搞儮鏅濋敍婊冾渻閵堝棙鈷掗柍宄扮墦瀹曟洝绠涢弬璁崇盎闂佽鍎抽崯鍧楀箖閹寸姭鍋撻崹顐g凡閻庢凹鍣i崺鈧い鎺戯功缁夐潧霉濠婂嫮澧电€规洘鍨块獮妯肩磼濡厧寮抽梺璇插嚱缁插宕濈€n剝濮冲┑鐘崇閳锋垿鏌i悢鍝勵暭闁诡垰鐗忕槐鎺撳緞婵犲嫬鐓熼柦妯荤箞閺屻劑寮崼鐔告闂佺ǹ顑嗛幐鎼佸煝閹捐鍨傛い鏃傛櫕娴滎亪姊绘担绛嬪殭缂佺粯鍨归幑銏ゅ醇閵夈儲妲梺缁樺姇閹碱偆绮婚敐澶嬬叆闁哄洦顨呮禍楣冩⒑缂佹ɑ鎯堢紒缁樼箞瀵鈽夐姀鐘靛姶闂佸憡鍔楅崑鎾绘偩閸忚偐绠鹃悗鐢登归宀勬煕閵娿劍纭炬い顐㈢箰鐓ゆい蹇撳缁愭稒绻濋悽闈浶㈡繛瀵稿厴瀹曟繈宕奸弴鐔叉嫼闂佸憡绋戦敃銉﹀緞閸曨垱鐓曟繛鍡楃箻椤庢鎮¢妶澶嬬厱婵炴垶锕妤冪磼鐠囧弶顥㈤柡灞炬礋瀹曠厧鈹戦崼銏╁敽闂備礁鎲$敮濠囧础閹惰棄钃熸繛鎴欏灪閸嬪棗霉閿濆懏鎲稿ù鐘虫倐閹鎲撮崟顒傤槰闂佸憡姊归悷銉╂偩閻ゎ垬浜归柟鐑樼箖閺呮繈姊洪幐搴g畵闁瑰啿瀛╃€靛吋鎯旈姀銏㈢槇缂佸墽澧楄摫妞ゎ偄锕弻娑㈠Ω閿曗偓閳绘洜鈧娲忛崹濂杆囧畷鍥╃<闁稿本姘ㄦ牎闂侀潧鐗炵紞浣哥暦濮椻偓閸┾剝鎷呴幓鎺嶅闂佸壊鐓堥崑鍛村矗韫囨柧绻嗘い鏍ㄧ矊鐢泛霉濠婂牏鐣洪柟顔筋殔椤繈鎮欓鈧锟�

核心提示:声明:《本文是j2ee1.4 tutorial的中文翻译,由于本人水平有限,windy‘s j2ee1.4 tutorial (chinese) --Understanding XML(010),其中还包含有很多的错误,还希望各位大虾帮助改正,,,翻译正在进行中,我会陆续发表最新的部分
声明:《本文是j2ee1.4 tutorial的中文翻译,由于本人水平有限,其中还包含有很多的错误,还希望各位大虾帮助改正,翻译正在进行中,我会陆续发表最新的部分,望大家能给与支持!》
产生xml数据
这部分将带着你一步步的走进创建XML文档的过程。沿着这个方向,你将获得对XML组件的体验。
编写一个简单的XML文件
你将从编写一个幻灯演示的XML文件开始。在这个练习中,你将使用你的文本编辑器来产生数据,这样可以使你舒适的了解XML文件的基本格式。
产生文件
使用一个标准的文本编辑器,产生一个文件sideSample.xml
编写声明
下一步,写一个声明,它能使处理程序将这个文件识别为XML文件。这个声明开始与字符“<?”,这个符号是标准的XML的处理指令标识符。
<?xml version='1.0' encoding='utf-8'?>
这行识别这个文档为XML文档,它使用了1。0版本的XML规范,文档使用的字符编码识8位Unicode字符编码方案。
因为这个文档没有被指定为“独立的”,所以分析器会假定它可能包含对其他文档的引用。
增加一个注释
注释可以被分析器忽略。一个程序实际上是看不到它的,除非你激活分析其中指定的设定。向文件中增加一个粗体的文本。
<?xml version='1.0' encoding='utf-8'?>
<!-- A SAMPLE set of slides -->
定义根元素
在声明后,每个XML文件都要确切的定义一个根元素。文件中任何其他的元素被包含在根元素中。向文件输入下面粗体的文本。
<?xml version='1.0' encoding='utf-8'?>
<!-- A SAMPLE set of slides -->
<slideshow>
</slideshow>
注意:XML元素的名称是大小写敏感的。结束标志必须匹配开识标志。
向一个元素中增加属性
一个幻灯显示含有很多相关联的数据条目,这些数据条目不需要任何的结构。所以可以自然的将他们定义成slideshow的属性。增加粗体文本到文件中来建立属性。
...
<slideshow
title="Sample Slide Show"
date="Date of publication"
author="Yours Truly"
>
</slideshow>
但你产生一个标记名称或一个属性的时候,你能使用连号(“-”),下滑线(“_”),冒号(“:”)和句号(“.”)加上字符和数字。与Html不同的是,XML属性值总是在双引号中,多个属性之间不能被都好分隔。
注意: 冒号需要被小心使用或完全的不使用,因为他们在定义命名空间使会使用到。
增加嵌套的元素
XML允许层次结构的数据,也就是说一个元素能够包含其他的元素。增加下面的粗体文本来定义一个幻灯元素,在幻灯元素包含一个<title>元素。
<slideshow
...
>
<!-- TITLE SLIDE -->
<slide type="all">
<title>Wake up to WonderWidgets!</title>
</slide>
</slideshow>
在这里, slide元素里包含一个type属性。这个属性的意义是这个幻灯片能够为一个主要的技术或主要的执行人打上标记。
更重要的是,尽管这个例子举例说明了属性与元素之间的不同。Title元素是观众能够看到的,所以它是一个元素。另一方面,不需要被观众看到的类型就成为属性。可以从另一个方面来想这个区别:元素是一个容器,像一个瓶子。属性就是这个容器的特点。
增加HTML样式的文本
既然XML允许你定义任意想要的标记,那么你完全可以定义一个类似HTML的标记集。实际上,XHTML标准就做这些工作。你将看到多关于SAX的说明。目前,下面的粗体文本定义了一个使用HTML样式的幻灯。
...
<!-- TITLE SLIDE -->
<slide type="all">
<title>Wake up to WonderWidgets!</title>
</slide>
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets</em> are great</item>
<item>Who <em>buys</em> WonderWidgets</item>
</slide>
</slideshow>
注意:一个title元素和XHTML中的元素会发生冲突,因为他们有同样的名字。我们将讨论产生冲突的机制。
增加一个空元素
在HTML和XML之间的一个主要的不同时所有的XML必须是格式良好的,也就是说,每一个标记必须有结束标记。使用一个结束标记会让你感觉非常的舒服。到现在为止,增加下面的粗体文本来增加一个空元素。
...
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets</em> are great</item>
<item/>
<item>Who <em>buys</em> WonderWidgets</item>
</slide>
</slideshow>
注意:任何元素可能是空元素。
注意:另外一个格式良好的因素是正确的嵌套。所以<b><i>some_text</i></b> 是格式良好的。而下面的就不是<b><i>some_text</b></i>.
完成的产品
下面是XML文件完成的版本:
<?xml version='1.0' encoding='utf-8'?>
<!-- A SAMPLE set of slides -->
<slideshow
title="Sample Slide Show"
date="Date of publication"
author="Yours Truly"
>
<!-- TITLE SLIDE -->
<slide type="all">
<title>Wake up to WonderWidgets!</title>
</slide>
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets</em> are great</item>
<item/>
<item>Who <em>buys</em> WonderWidgets</item>
</slide
</slideshow>
编写处理指令
有时在XML数据中包含处理指令是非常有意义的。在这个练习中,你将增加一个处理指令到你的slideSample.xml文件中。
和你在处理指令这章看到的一样,处理指令的格式是<?target data?>,其中“target”是目标应用程序,“data”是指令或信息。增加下面的粗体文本到文件中,这段文本为一个虚构的幻灯演示增加了一个处理指令。这个指令的功能是询问用户要显示哪一个片断(技术、执行级或所有)。
<slideshow
...
>
<!-- PROCESSING INSTRUCTION -->
<?my.presentation.Program QUERY="exec, tech, all"?>
<!-- TITLE SLIDE -->
注意:
1. “data”部分(处理指令部分)能够包含空格或可以为空。但是在<?和target标记之间不能有任何的空格。
2. “data”部分在第一个空格后开始。
3. 用完全的独一无二的包路径来限定“target”,这样排除了和处理同样数据的其他场序冲突的可能性。
4. 为了易读性,在应用程序名称后包含一个“:”是一个不错的注意,像下面那样:
<?my.presentation.Program: QUERY="..."?>
冒号使得target名成为一种“标签”。然而,当w3c规范允许冒号出现在target名称中时,一些IE5版本会认为这是一个错误。在本指南中,我们会避免在target名称中使用冒号。
保存这个文件为slideSample02.xml。
错误的介绍
分析其可能产生三种错误:致命错误、错误和警告。在本练习中,你将对XML文件做一些小的修改来产生一个致命的错误。
一个简单的方法可以用来产生一个致命的错误,移除空元素“item”后面的“”,这样就产生一个没有结束标记的标记了。这是就会产生一个致命错误,因为没有结束标记的标记不是格式良好的。按照下面去做:
1. 拷贝slideSample02.xml到slideSampleBad1.xml
2. 编辑slideSampleBad1.xml并且像下面那样移除字符
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets</em> are great</item>
<item/>
<item>Who <em>buys</em> WonderWidgets</item>
</slide>
变成:
...
<item>Why <em>WonderWidgets</em> are great</item>
<item>
<item>Who <em>buys</em> WonderWidgets</item>
...
现在你就有了一个可以产生错误的文件。XML分析器被用来产生这个错误。
取代和插入文本
在这部分,你将学到:
1. 处理特殊字符(“<”,“&”等)
2. 处理XML样式语法的文本。
处理特殊字符
在XML中,一个实体是一个XML结构(或文本),它拥有一个名称。通过名字引用实体导致实体被插入文档取代这个实体引用。为了产生一个实体引用,实体名称被“&”记号标记,如下:
&entityName;
当你学习怎样编写一个DTD的时候,你将看到你能够定义自己的实体。这样,你可以将你的实体扩张到所有的文本。尽管到现在为止,我们只是将焦点放在预定义实体。
Table 2-1 Predefined Entities
Character Reference
& &
< <
> >
" "
' '
字符引用
一个字符应用,像“ 包含一个井号标记。其中的数字是一个单一字符的Unicode的整数值,例如“A”的值是65,147代表的字符是左引号,148代表右引号。
在一个XML文档中使用一个实体引用
假设你想在你的XML文档中插入一行:
Market Size < predicted
直接将这行插入XML文件中的问题是:当分析器看到左尖括号(<),它就开始查找标识名。为了避开这个问题,你可以用< 代替<
将下面的粗体文本加入文件slideSample.xml。保存一个备份,名字叫slideSample03.xml
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
...
</slide>
<slide type="exec">
<title>Financial Forecast</title>
<item>Market Size < predicted</item>
<item>Anticipated Penetration</item>
<item>EXPected Revenues</item>
<item>Profit Margin </item>
</slide>
</slideshow>
当你使用一个XML分析器得到数据是,你将期望如下的输出:
Market Size < predicted
你看到一个左尖括号(“<”)代替了“<”,因为XML分析器会自动将实体代替实体引用。
以XML样式语法处理文本
当你正在操作一大块XML或HTML(其中可能包括很多的特殊字符)时,用实体引用代替每一个特殊符号是很不方便的。对于这种情况,你可以使用CDATA。
一个CDATA就好像HTML中的<pre>…</pre>一样,在它里面的数据不会被当作XML编译。一个CDATA开始与<![CDATA[,结束于]]>。
增加下面的粗体文本到slideSample.xml中,并保存一个副本,名称为:slideSample04.xml
...
<slide type="tech">
<title>How it Works</title>
<item>First we fozzle the frobmorten</item>
<item>Then we framboze the staten</item>
<item>Finally, we frenzle the fuznaten</item>
<item><![CDATA[Diagram:
frobmorten <--------------- fuznaten
<3> ^
<1> <1> = fozzle
V <2> = framboze
Staten--------------------+ <3> = frenzle
<2>
]]></item>
</slide>
</slideshow>
当你回显CDATA部分的数据时,你会发现显示出来的和你写进取得没有区别。因为分析器不会将这里面的数据当作XML来处理,所以,他们不会产生致命的错误。
产生一个类型定义文档(Document Type Definition)
在XML声明之后,文档序能够包含一个DTD,这个DTD让你指定文档中包含的标识的种类。除了告诉一个合法的分析器标识合法性和标识的布局外,它还告诉合法的或不合法的分析器哪里是文本,使得分析器决定是否空格时重要的还是可以被忽略的。
基本DTD定义
为了开始学习DTD的定义,让我们通过告诉分析器哪里的文本是被期望出现的和哪里的文本会造成错误。
我们通过产生一个文件,名称为slideshow.dtd来开始。进入一个声明和一个注释来分析这个文件。像下面所显示的那样:
<?xml version='1.0' encoding='utf-8'?>
<!--
DTD for a simple "slide show".
-->
下一步,增加下面粗体文本到文件:
<!-- DTD for a simple "slide show". -->
<!ELEMENT slideshow (slide+)>
像你看到的那样,这个DTD标识开始于<!,后面跟随着标是名称(ELEMENT)。在这个标识名称后识被定义的元素名称。后面的园括弧里面的内容代表着一个或一个以上的slide元素出现在slideshow里都是合法的。
如果没有和面的加号,那么这个定义代表slideshow只能包含一个slide元素。下面列出了所有的限定符号。
Table 2-2 DTD Element Qualifiers
Qualifier Name Meaning
? Question Mark Optional (zero or one)
* Asterisk Zero or more
+ Plus Sign One or more
你能够包含更多的元素通过使用逗号和在每一个元素上使用限定符。你也能够使用嵌套来组织多个条目。例如,在定义一个image元素后,你能够声明每个image元素必须与一个title元素匹配,通过指定((image, title)+)。在这里,加号是应用于image/title对,表明一个或多个指定条目对可能出现。
定义文本和嵌套元素
现在,你可以告诉分析器在那里不要出现文本。让我们看看怎样告诉它。增加下面的粗体文本到文件。
<!ELEMENT slideshow (slide+)>
<!ELEMENT slide (title, item*)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT item (#PCDATA item)* >
你增加的第一行意思是一个slide由一个title组成或由一个title和多个item组成。下一行的意思是一个title完全的由分析字符数据(PCDATA)组成。在PCDATA前面增加“#”表明后面跟随得是一个特殊单词而不是一个元素名称。
最好一行引入了垂直条(),它表明“或”的条件。所以最后一行代表item或是PCDATA或是item。最好的星号表明发生0次或多次。这个规范的结果被认为是一个“混合内容模型”,因为任意数量的item元素可以出现在文本中。
保存这个DTD为slideSample1a.dtd。
DTD的限制
如果你能指定一个item或者可以包含文本或者可以包含文本和更多的item,那将会更好。但是,DTD规范让这种转变很困难。例如,你可以试着定义一个item,如下:
<!ELEMENT item (#PCDATA (#PCDATA, item+)) >
这样做当然是符合上面的条件的,但是一旦分析器看到#PCDATA和垂直杠,它就需要后面的定义来符合这个混合内容模型。这个规范不允许这样定义,所以你会得到一个错误:Illegal mixed content model for ‘item’. Found (…, 上面的十六进制28是定义的邮件括号。
两次定义这个item元素也不行。一个像下面一样的规范:
<!ELEMENT item (#PCDATA) >
<!ELEMENT item (#PCDATA, item+) >
会产生一个“duplicate definition”警告,事实上,第二个定义会被忽略掉。所以我们能做到最好就是定义一个混合文档模型(允许item可以在文本中散布)了。
除了上面提到的混合文档模型的限制,我们也没有办法来限定文档的种类。它应该仅仅包含数字嘛?是一个日期型或是一个货币型嘛?在DTD中,我们没法实现这种限定。
最后,注意,DTD是层次不敏感的。title元素应用的定义等价于一个silde title和一个item title。当我们扩展DTD,是DTD除了允许文本外,我们还允许HTML风格的标签时,那么一个item title的size和一个slide title的size的必须区分开来。例如,你几乎只有一种方法区分他们,那就是赋予他们不同的名字,如“item_title”。所有的这些限制是概要规范标准的开发背景。
在DTD中指定元素值
比指定一个加括弧的元素列表更好的方式是:元素的定义可以使用一些指定的值:ANY或EMPTY。ANY规范的意思是元素可以包含任何定义的元素或PCDATA。这样一个规范通常针对一个通用目的的XML文档的根元素的使用,例如你可以使用一个字符处理器产生它。
EMPTY规范的意思是元素不包含内容。所以一个E-MAIL的DTD中的<flag/>可以这样使用:
<!ELEMENT flag EMPTY>
引用DTD
在这个例子中,DTD定义是一个单独的文件。也就是说你不得不在XML文档中引用它。一回你将会看到,在文档的范围内,你也可以包含DTD的一部分。这些定义构成了DTD的本地子集。
为了引用DTD文件,你只需要增加下面组体的文本到你的slideSample.xml文件中,并且以slideSample05.xml文件名保存它。
<!-- A SAMPLE set of slides -->
<!DOCTYPE slideshow SYSTEM "slideshow.dtd">
<slideshow
DTD标记开始于“<!”。在这个例子中,这个标记名“DOCTYPE”的意思是这个文档是“slideshow”,“slideshow”得意思是这个文档由slideshow元素和所有包含在slideshow内的内容组成。
<slideshow>
...
</slideshow>
这个标识定义slideshow元素为文档的根元素。一个XML文档有且仅有一个根元素。在这个地方,根元素被指定。换句话说,这个标识将文档内容识别为一个slideshow。
这个DOCTYPE标识在XML定义者后,跟元素之前出现。SYSTEM识别符指定DTD文件的位置。因为它没有以一个前缀(如:http:/或file:/)开始,这个路径是相对于XML文档的。还记得setDocumentLocator这个方法吗?分析器就使用它的信息来找到DTD文件。正像
你的应用程序将找到一个和你的XML文档相关联的文件。一个PUBLIC识别符通过使用一个唯一的名称也能够被用来指定一个DTD文件。但是分析器将不得不解决它。
DOCTYPE规范也能够包含DTD定义。这样的定义将包含在方括号中,如下:
<!DOCTYPE slideshow SYSTEM "slideshow1.dtd" [
...local subset definitions here...
]>
在稍后定义文档中使用的实体时,你将利用这个便利。
文档和数据
以前,你学习XML是因为你听说过XML,一方面是XML数据,另一方面是XML操作是舒适的、结构中部依赖于文本的。
在这个例子文件中,slideshow元素是一个数据元素的例子?它没涉及文本而仅仅包含了子元素。另一方面,Item元素可以被称为文档元素,因为它的定义包含了文本和子元素。
当你浏览完本指南时,你将发现怎样扩展title元素的定义,是它能包含HTML风格的元素。
在DTD中定义属性和实体
到目前为止,你已经定义的DTD可以非常好的使用。他告诉你那里需要文本,那里不需要,这些是分析器特别关注的。但是为了在一个合法分析器中使用,DTD需要为不同的元素指定合法的属性。你将在这部分完成这项工作。在这部分以后,你将定义一个内部的实体和一个外部的实体(通过将它引用进XML文件)。
在DTD中定义属性
让我们通过为幻灯片中的元素定义属性开始这部分。
增加下面粗体的文本到文件中。
<!ELEMENT slideshow (slide+)>
<!ATTLIST slideshow
title CDATA #REQUIRED
date CDATA #IMPLIED
author CDATA "unknown"
>
<!ELEMENT slide (title, item*)>
DTD标记ATTLIST是定义属性的开始标记。紧跟ATTLIST后面的名称指定属性定义的对象。在这个例子中,定义对象是slideshow元素(注意,DTD是缺乏层次的)
每一个属性是由三个空格分开的一系列值构成的。逗号和其他的分隔符是不允许出现的,所以像上面那样格式化定义是有帮助的和易读的。每一行的第一个元素是属性名称:title,date或author。第二个元素表明数据类型:CDATA是字符数据类型。Table 2-3介绍了所有的合法使用的属性类型。
Table 2-3 Attribute Types
Attribute Type Specifies...
(value1 value2 ...) A list of values separated by vertical bars. (Example below)
CDATA "Unparsed character data". (For normal people, a text string.)
ID A name that no other ID attribute shares.
IDREF A reference to an ID defined elsewhere in the document.
IDREFS A space-separated list containing one or more ID references.
ENTITY The name of an entity defined in the DTD.
ENTITIES A space-separated list of entities.
NMTOKEN A valid XML name composed of letters, numbers, hyphens, underscores, and colons.
NMTOKENS A space-separated list of names.
NOTATION The name of a DTD-specified notation, which describes a non-XML data format, such as those used for image files.*
这是一个很快就会过时的规范,在这章里,它将会被讨论。
当属性类型有加括弧的可选列表构成时,这个属性必须使用指定之中的一个。例如,增加粗体文本到文件中:
<!ELEMENT slide (title, item*)>
<!ATTLIST slide
type (tech exec all) #IMPLIED
>
<!ELEMENT title (#PCDATA)>
<!ELEMENT item (#PCDATA item)* >
这个规范的意思是slide元素的type属性必须被赋予“tech”,“exec”或“all”三个属性值。其他的值都不被接受。
属性中最后的一个实体规范决定属性的默认值。. Table 2-4中显示了可能的选择值。
Table 2-4 Attribute-Specification Parameters
Specification Specifies...
#REQUIRED The attribute value must be specified in the document.
#IMPLIED The value need not be specified in the document. If it isn't, the application will have a default value it uses.
"defaultValue" The default value to use, if a value is not specified in the document.
#FIXED "fixedValue" The value to use. If the document specifies any value at all, it must be the same.
最后,保存一个DTD的副本到slideshowlb.dtd文件。
在DTD中定义实体
到目前为止,你已经接触到了预定义的实体,像&。你已经接触到了一个属性能够引用一个实体。现在到让你学习定义自己的实体的时候了。
增加下面粗体的文本到你的XML文件中:
<!DOCTYPE slideshow SYSTEM "slideshow.dtd" [
<!ENTITY product "WonderWidget">
<!ENTITY products "WonderWidgets">
]>
ENTITY标记名称意思是说你正在定义一个实体。后面跟着实体的名称和它的定义。在这个例子中,你正在定义一个实体,名称是“product”,它的实体值将取代文本中的实体名。
最后的部分是取代字符串,无论在文档中的什么位置引用实体名,它将取代实体名称。这个取代字符串使用引号定义。
现在,你已经定义了实体,下一步是引用他们。在粗体的文本上作一些改变:
<slideshow
title="WonderWidget&product; Slide Show"
...
<!-- TITLE SLIDE -->
<slide type="all">
<title>Wake up to WonderWidgets&products;!</title>
</slide>
<!-- OVERVIEW -->
<slide type="all">
<title>Overview</title>
<item>Why <em>WonderWidgets&products;</em> are
great</item>
<item/>
<item>Who <em>buys</em> WonderWidgets&products;</item>
</slide>
值得注意的是,在这里,你的实体的引用使用的是和预定义使用的语法相同(&entityName;),这个实体可以在属性中和元素内容中被引用。
当你从分析器中得到这个文件的回馈,你会看到:
Wake up to WonderWidgets!
注意,这个product名称已经被实体的引用值代替。
保存这个文件的一个拷贝到slideSample06.xml
额外的有用的实体
这里有几个实体定义的例子,当你编写XML文档时,你会发现她很有用。
<!ENTITY ldquo "“"> <!-- Left Double Quote -->
<!ENTITY rdquo "”"> <!-- Right Double Quote -->
<!ENTITY trade "™"> <!-- Trademark Symbol (TM) -->
<!ENTITY rtrade "®"> <!-- Registered Trademark (R) -->
<!ENTITY copyr "©"> <!-- Copyright Symbol -->
外部实体的引用
你能够使用SYSTEM或PUBLIC识别符指定一个外部实体。
为了引用一个外部实体,增加下面粗提到文件中:
<!DOCTYPE slideshow SYSTEM "slideshow.dtd" [
<!ENTITY product "WonderWidget">
<!ENTITY products "WonderWidgets">
<!ENTITY copyright SYSTEM "copyright.xml">
]>
这个定义引用一个版权信息,它包含在“copyright.xml”文件中。产生一个文件,输入一些感兴趣的内容,可能像下面那样:
<!-- A SAMPLE copyright -->
This is the standard copyright message that our lawyers
make us put everywhere so we don't have to shell out a
million bucks every time someone spills hot coffee in their
lap...
最后,增加下面粗体的文本到你的slideSample.xml文件中来引用这个外部的实体。保存这个文件到slideSample07.xml
<!-- TITLE SLIDE -->
...
</slide>
<!-- COPYRIGHT SLIDE -->
<slide type="all">
<item>©right;</item>
</slide>
你也能够使用一个外部的实体声明来访问一个servlet。这个servlet产生目前的日期:
<!ENTITY currentDate SYSTEM
"http://www.example.com/servlet/CurrentDate?fmt=dd-MMM-
yyyy">
你将像引用其他的实体一样引用它。
Today's date is ¤tDate;.
你将看到如下的回馈:
...
<slide type="all">
<item>
This is the standard copyright message that our lawyers
make us put everywhere so we don't have to shell out a
million bucks every time someone spills hot coffee in their
lap...
</item>
</slide>
...
你将注意到注释后面的新行所谓一个字符被回馈,但是这个注释本事被忽略。
总结
在文档中引用的一个实体,无论它是内部的还是外部的,都被称作普通实体。一个包含在DTD规范中的实体被称为参数实体。
一个包含XML(文本或标记)的实体,它会被分析器分析,所以称作被分析的实体。一个包含二进制数据(像图像)的实体被称为非分析实体。在本指南的下一部分我们将讨论非分析的实体的引用。
引用二进制实体
这部分讨论引用二进制数据文件的选择。
使用一个MIME数据类型
有两种方法可以引用一个非分析实体,如二进制图像文件。一个是使用DTD的NOTATION规范机制。然而,这个机制复杂的、不够初步的,它主要为了和SGML文档的兼用性而存在。当我们看DTDHandler API时,我们将有机会深层次的讨论它。
要建立使用图像文件的slideshow,增加下面粗体文本到你的slideshowlb.dtd文件:
<!ELEMENT slide (image?, title, item*)>
<!ATTLIST slide
type (tech exec all) #IMPLIED
>
<!ELEMENT title (#PCDATA)>
<!ELEMENT item (#PCDATA item)* >
<!ELEMENT image EMPTY>
<!ATTLIST image
alt CDATA #IMPLIED
src CDATA #REQUIRED
type CDATA "image/gif"
>
这些修改声明image为一个可选的元素。这个image标识模仿HTML4。0标识。它有一个“隐含的”值,它意味着它是可选的,程序处理这段数据可以获得充分的替代,像“image no found”。另一方面,src属性是必需的。
在文档里,到一个名称是“intro-pic”的image的引用可能像下面这样:
<image src="http://www.QQread.com/j2ee/image/intro-pic.gif", alt="Intro Pic",
type="image/gif" />
选择:使用实体引用
使用一个MIME数据类型作为一个元素的属性是一个机制,它是灵活的和可扩展的。要产生一个外部的ENTITY引用使用符号机制,你需要针对jpeg和gif数据的DTD NOTATION元素。
。
。
。
《由于水平所限,后面关于XML的部分暂时省略》
(出处:http://www.cncms.com)
更多精彩
赞助商链接