锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓嬮潰鏉ョ湅涓涓嬪畼鏂規(guī)枃妗d腑鐨勪唬鐮佺ず渚嬨?br />
1. 鏍規(guī)嵁澶存潵璇誨彇CSV鏂囦歡
鎶婃枃浠朵腑鐨勬瘡琛岃褰曡鍙栧嚭鏉ヨ漿鍖栦負(fù)java瀵硅薄錛屽亣璁句綘鏈変竴涓猆serBean綾伙紝浠g爜濡備笅錛?br />
public class UserBean {
String username, password, street, town;
int zip;
public String getPassword() { return password; }
public String getStreet() { return street; }
public String getTown() { return town; }
public String getUsername() { return username; }
public int getZip() { return zip; }
public void setPassword(String password) { this.password = password; }
public void setStreet(String street) { this.street = street; }
public void setTown(String town) { this.town = town; }
public void setUsername(String username) { this.username = username; }
public void setZip(int zip) { this.zip = zip; }
}
騫朵笖鏈変竴涓狢SV鏂囦歡錛屽寘鍚竴涓枃浠跺ご錛屽亣璁炬枃浠跺唴瀹瑰涓嬶細(xì)
username, password, date, zip, town
Klaus, qwexyKiks, 17/1/2007, 1111, New York
Oufu, bobilop, 10/10/2007, 4555, New York
鑰岃緗笉闇瑕侀獙璇侊紝鍙渶瑕佽緗瓺ocumentBuilderFactory.setValidating錛坒alse錛夊氨鍙互杈懼埌鏁堟灉浜嗭紝浣嗘槸瑙f瀽鍣ㄨ繕鏄細(xì)璇誨彇DTD鐨勶紝瑙e喅鐨勬柟娉曟槸瀹炵幇EntityResolver鎺ュ彛錛屽叿浣撲唬鐮佸涓嬶細(xì)
package com.founder.demo;
import Java.io.ByteArrayInputStream;
import Java.io.IOException;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
public class IgnoreDTDEntityResolver implements EntityResolver {
@Override
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
return new InputSource(new ByteArrayInputStream("<?xml version='1.0' encoding='UTF-8'?>".getBytes()));
}
}
鐒跺悗璁劇疆SAXReader 瀵硅薄濡備笅錛?br />
SAXReader reader = new SAXReader();
reader.setEntityResolver(new IgnoreDTDEntityResolver()); // ignore dtd
涓鍒噊k銆?/p>
1. 浠嬬粛
1錛塂OM(JAXP Crimson瑙f瀽鍣?
DOM鏄敤涓庡鉤鍙板拰璇█鏃犲叧鐨勬柟寮忚〃紺篨ML鏂囨。鐨勫畼鏂筗3C鏍囧噯銆侱OM鏄互灞傛緇撴瀯緇勭粐鐨勮妭鐐規(guī)垨淇℃伅鐗囨柇鐨勯泦鍚堛傝繖涓眰嬈$粨鏋勫厑璁稿紑鍙戜漢鍛樺湪鏍?wèi)涓L壘鐗瑰畾淇℃伅銆傚垎鏋愯緇撴瀯閫氬父闇瑕佸姞杞芥暣涓枃妗e拰鏋勯犲眰嬈$粨鏋勶紝鐒跺悗鎵嶈兘鍋氫換浣曞伐浣溿傜敱浜庡畠鏄熀浜庝俊鎭眰嬈$殑錛屽洜鑰孌OM琚涓烘槸鍩轟簬鏍?wèi)鎴栧熮Z簬瀵硅薄鐨勩侱OM浠ュ強(qiáng)騫夸箟鐨勫熀浜庢爲(wèi)鐨勫鐞嗗叿鏈夊嚑涓紭鐐廣傞鍏堬紝鐢變簬鏍?wèi)鍦ㄥ唴瀛樹腑鏄寔涔呯殑锛屽洜姝ゅ彲浠ヤ慨鏀瑰畠浠ヤ究搴旂敤绋嬪簭鑳藉?guī)暟鎹拰緇撴瀯浣滃嚭鏇存敼銆傚畠榪樺彲浠ュ湪浠諱綍鏃跺欏湪鏍?wèi)涓笂涓嬪D埅錛岃屼笉鏄儚SAX閭f牱鏄竴嬈℃х殑澶勭悊銆侱OM浣跨敤璧鋒潵涔熻綆鍗曞緱澶氥?/p>
2錛塖AX
SAX澶勭悊鐨勪紭鐐歸潪甯哥被浼間簬嫻佸獟浣撶殑浼樼偣銆傚垎鏋愯兘澶熺珛鍗沖紑濮嬶紝鑰屼笉鏄瓑寰呮墍鏈夌殑鏁版嵁琚鐞嗐傝屼笖錛岀敱浜庡簲鐢ㄧ▼搴忓彧鏄湪璇誨彇鏁版嵁鏃舵鏌ユ暟鎹紝鍥犳涓嶉渶瑕佸皢鏁版嵁瀛樺偍鍦ㄥ唴瀛樹腑銆傝繖瀵逛簬澶у瀷鏂囨。鏉ヨ鏄釜宸ㄥぇ鐨勪紭鐐廣備簨瀹炰笂錛屽簲鐢ㄧ▼搴忕敋鑷充笉蹇呰В鏋愭暣涓枃妗o紱瀹冨彲浠ュ湪鏌愪釜鏉′歡寰楀埌婊¤凍鏃跺仠姝㈣В鏋愩備竴鑸潵璇達(dá)紝SAX榪樻瘮瀹冪殑鏇夸唬鑰匘OM蹇澶氥?
銆銆閫夋嫨DOM榪樻槸閫夋嫨SAX錛?瀵逛簬闇瑕佽嚜宸辯紪鍐欎唬鐮佹潵澶勭悊XML鏂囨。鐨勫紑鍙戜漢鍛樻潵璇達(dá)紝 閫夋嫨DOM榪樻槸SAX瑙f瀽妯″瀷鏄竴涓潪甯擱噸瑕佺殑璁捐鍐崇瓥銆?DOM閲囩敤寤虹珛鏍?wèi)迮灳l撴瀯鐨勬柟寮忚闂甔ML鏂囨。錛岃孲AX閲囩敤鐨勪簨浠舵ā鍨嬨?
銆銆DOM瑙f瀽鍣ㄦ妸XML鏂囨。杞寲涓轟竴涓寘鍚叾鍐呭鐨勬爲(wèi)錛屽茍鍙互瀵規(guī)爲(wèi)榪涜閬嶅巻銆傜敤DOM瑙f瀽妯″瀷鐨勪紭鐐規(guī)槸緙栫▼瀹規(guī)槗錛屽紑鍙戜漢鍛樺彧闇瑕佽皟鐢ㄥ緩鏍?wèi)鐨勬寚渥o(hù)錛岀劧鍚庡埄鐢╪avigation APIs璁塊棶鎵闇鐨勬爲(wèi)鑺傜偣鏉ュ畬鎴愪換鍔°傚彲浠ュ緢瀹規(guī)槗鐨勬坊鍔犲拰淇敼鏍?wèi)涓殑鍏冪礌銆傜劧鑰岀敱浜庝嬌鐢―OM瑙f瀽鍣ㄧ殑鏃跺欓渶瑕佸鐞嗘暣涓猉ML鏂囨。錛屾墍浠ュ鎬ц兘鍜屽唴瀛樼殑瑕佹眰姣旇緝楂橈紝灝ゅ叾鏄亣鍒板緢澶х殑XML鏂囦歡鐨勬椂鍊欍傜敱浜庡畠鐨勯亶鍘嗚兘鍔涳紝DOM瑙f瀽鍣ㄥ父鐢ㄤ簬XML鏂囨。闇瑕侀綣佺殑鏀瑰彉鐨勬湇鍔′腑銆?
銆銆SAX瑙f瀽鍣ㄩ噰鐢ㄤ簡鍩轟簬浜嬩歡鐨勬ā鍨嬶紝瀹冨湪瑙f瀽XML鏂囨。鐨勬椂鍊欏彲浠ヨЕ鍙戜竴緋誨垪鐨勪簨浠訛紝褰撳彂鐜扮粰瀹氱殑tag鐨勬椂鍊欙紝瀹冨彲浠ユ縺媧諱竴涓洖璋冩柟娉曪紝鍛婅瘔璇ユ柟娉曞埗瀹氱殑鏍囩宸茬粡鎵懼埌銆係AX瀵瑰唴瀛樼殑瑕佹眰閫氬父浼?xì)姣旇緝浣庡Q屽洜涓哄畠璁╁紑鍙戜漢鍛樿嚜宸辨潵鍐沖畾鎵瑕佸鐞嗙殑tag銆傜壒鍒槸褰撳紑鍙戜漢鍛樺彧闇瑕佸鐞嗘枃妗d腑鎵鍖呭惈鐨勯儴鍒嗘暟鎹椂錛孲AX榪欑鎵╁睍鑳藉姏寰楀埌浜嗘洿濂界殑浣撶幇銆備絾鐢⊿AX瑙f瀽鍣ㄧ殑鏃跺欑紪鐮佸伐浣滀細(xì)姣旇緝鍥伴毦錛岃屼笖寰堥毦鍚屾椂璁塊棶鍚屼竴涓枃妗d腑鐨勫澶勪笉鍚屾暟鎹?
3錛塉DOM http://www.jdom.org/
JDOM鐨勭洰鐨勬槸鎴愪負(fù)Java鐗瑰畾鏂囨。妯″瀷錛屽畠綆鍖栦笌XML鐨勪氦浜掑茍涓旀瘮浣跨敤DOM瀹炵幇鏇村揩銆傜敱浜庢槸絎竴涓狫ava鐗瑰畾妯″瀷錛孞DOM涓鐩村緱鍒板ぇ鍔涙帹騫垮拰淇冭繘銆傛鍦ㄨ冭檻閫氳繃“Java瑙勮寖璇鋒眰JSR-102”灝嗗畠鏈緇堢敤浣?#8220;Java鏍囧噯鎵╁睍”銆備粠2000騫村垵灝卞凡緇忓紑濮嬩簡JDOM寮鍙戙?
銆銆JDOM涓嶥OM涓昏鏈変袱鏂歸潰涓嶅悓銆傞鍏堬紝JDOM浠呬嬌鐢ㄥ叿浣撶被鑰屼笉浣跨敤鎺ュ彛銆傝繖鍦ㄦ煇浜涙柟闈㈢畝鍖栦簡API錛屼絾鏄篃闄愬埗浜嗙伒媧繪с傜浜岋紝API澶ч噺浣跨敤浜咰ollections綾伙紝綆鍖栦簡閭d簺宸茬粡鐔熸?zhèn)墭q欎簺綾葷殑Java寮鍙戣呯殑浣跨敤銆?
銆銆JDOM鏂囨。澹版槑鍏剁洰鐨勬槸“浣跨敤20%(鎴栨洿灝?鐨勭簿鍔涜В鍐?0%(鎴栨洿澶?Java/XML闂”(鏍規(guī)嵁瀛︿範(fàn)鏇茬嚎鍋囧畾涓?0%)銆侸DOM瀵逛簬澶у鏁癑ava/XML搴旂敤紼嬪簭鏉ヨ褰撶劧鏄湁鐢ㄧ殑錛屽茍涓斿ぇ澶氭暟寮鍙戣呭彂鐜癆PI姣擠OM瀹規(guī)槗鐞嗚В寰楀銆侸DOM榪樺寘鎷紼嬪簭琛屼負(fù)鐨勭浉褰撳箍娉涙鏌ヤ互闃叉鐢ㄦ埛鍋氫換浣曞湪XML涓棤鎰忎箟鐨勪簨銆傜劧鑰岋紝瀹冧粛闇瑕佹?zhèn)ㄥ厖鍒嗙悊瑙ML浠ヤ究鍋氫竴浜涜秴鍑哄熀鏈殑宸ヤ綔(鎴栬呯敋鑷崇悊瑙f煇浜涙儏鍐典笅鐨勯敊璇?銆傝繖涔熻鏄瘮瀛︿範(fàn)DOM鎴朖DOM鎺ュ彛閮芥洿鏈夋剰涔夌殑宸ヤ綔銆?
銆銆JDOM鑷韓涓嶅寘鍚В鏋愬櫒銆傚畠閫氬父浣跨敤SAX2瑙f瀽鍣ㄦ潵瑙f瀽鍜岄獙璇佽緭鍏ML鏂囨。(灝界瀹冭繕鍙互灝嗕互鍓嶆瀯閫犵殑DOM琛ㄧず浣滀負(fù)杈撳叆)銆傚畠鍖呭惈涓浜涜漿鎹㈠櫒浠ュ皢JDOM琛ㄧず杈撳嚭鎴怱AX2浜嬩歡嫻併丏OM妯″瀷鎴朮ML鏂囨湰鏂囨。銆侸DOM鏄湪Apache璁稿彲璇佸彉浣撲笅鍙戝竷鐨勫紑鏀炬簮鐮併?/p>
4錛塂OM4J http://dom4j.sourceforge.net/
铏界劧DOM4J浠h〃浜嗗畬鍏ㄧ嫭绔嬬殑寮鍙戠粨鏋滐紝浣嗘渶鍒濓紝瀹冩槸JDOM鐨勪竴縐嶆櫤鑳藉垎鏀傚畠鍚堝茍浜嗚澶氳秴鍑哄熀鏈琗ML鏂囨。琛ㄧず鐨勫姛鑳斤紝鍖呮嫭闆嗘垚鐨刋Path鏀寔銆乆ML Schema鏀寔浠ュ強(qiáng)鐢ㄤ簬澶ф枃妗f垨嫻佸寲鏂囨。鐨勫熀浜庝簨浠剁殑澶勭悊銆傚畠榪樻彁渚涗簡鏋勫緩鏂囨。琛ㄧず鐨勯夐」錛屽畠閫氳繃DOM4J API鍜屾爣鍑咲OM鎺ュ彛鍏鋒湁騫惰璁塊棶鍔熻兘銆備粠2000涓嬪崐騫村紑濮嬶紝瀹冨氨涓鐩村浜庡紑鍙戜箣涓?
銆銆涓烘敮鎸佹墍鏈夎繖浜涘姛鑳斤紝DOM4J浣跨敤鎺ュ彛鍜屾娊璞″熀鏈被鏂規(guī)硶銆侱OM4J澶ч噺浣跨敤浜咥PI涓殑Collections綾伙紝浣嗘槸鍦ㄨ澶氭儏鍐典笅錛屽畠榪樻彁渚涗竴浜涙浛浠f柟娉曚互鍏佽鏇村ソ鐨勬ц兘鎴栨洿鐩存帴鐨勭紪鐮佹柟娉曘傜洿鎺ュソ澶勬槸錛岃櫧鐒禗OM4J浠樺嚭浜嗘洿澶嶆潅鐨凙PI鐨勪唬浠鳳紝浣嗘槸瀹冩彁渚涗簡姣擩DOM澶у緱澶氱殑鐏墊椿鎬с?
銆銆鍦ㄦ坊鍔犵伒媧繪с乆Path闆嗘垚鍜屽澶ф枃妗e鐞嗙殑鐩爣鏃訛紝DOM4J鐨勭洰鏍囦笌JDOM鏄竴鏍風(fēng)殑錛氶拡瀵笿ava寮鍙戣呯殑鏄撶敤鎬у拰鐩磋鎿嶄綔銆傚畠榪樿嚧鍔涗簬鎴愪負(fù)姣擩DOM鏇村畬鏁寸殑瑙e喅鏂規(guī)錛屽疄鐜板湪鏈川涓婂鐞嗘墍鏈塉ava/XML闂鐨勭洰鏍囥傚湪瀹屾垚璇ョ洰鏍囨椂錛屽畠姣擩DOM鏇村皯寮鴻皟闃叉涓嶆紜殑搴旂敤紼嬪簭琛屼負(fù)銆?
銆銆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媯(gè)嫻嬪嵆灝嗗埌鏉ョ殑XML嫻侊紝浣嗗茍娌℃湁杞藉叆鍒板唴瀛?褰撶劧褰揦ML嫻佽璇誨叆鏃訛紝浼?xì)鏈夐儴鍒嗘枃妗f殏鏃堕殣钘忓湪鍐呭瓨涓?銆?/p>
3. 鍥涚xml鎿嶄綔鏂瑰紡鐨勫熀鏈嬌鐢ㄦ柟娉?/p>
xml鏂囦歡錛?/p>
<?xml version="1.0" encoding="utf-8" ?>
<Result>
<VALUE>
<NO DATE="2005">A1</NO>
<ADDR>GZ</ADDR>
</VALUE>
<VALUE>
<NO DATE="2004">A2</NO>
<ADDR>XG</ADDR>
</VALUE>
</Result>
1錛塂OM
import Java.io.*;
import Java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
銆public static void main(String arge[]){
銆銆long lasting =System.currentTimeMillis();
銆銆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("杞︾墝鍙風(fēng)爜:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
銆銆銆銆System.out.println("杞︿富鍦板潃:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
銆 銆}
銆銆}catch(Exception e){
銆銆銆e.printStackTrace();
}
2錛塖AX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
銆Java.util.Stack tags = new Java.util.Stack();
銆public MyXMLReader() {
銆銆super();
}
銆public static void main(String args[]) {
銆銆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();
銆銆}
銆銆System.out.println("榪愯鏃墮棿錛? + (System.currentTimeMillis() - lasting) + "姣");}
銆銆public void characters(char ch[], int start, int length) throws SAXException {
銆銆String tag = (String) tags.peek();
銆銆if (tag.equals("NO")) {
銆銆銆System.out.print("杞︾墝鍙風(fēng)爜錛? + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
銆銆System.out.println("鍦板潃:" + new String(ch, start, length));
}
}
銆銆public void startElement(String uri,String localName,String qName,Attributes attrs) {
銆銆tags.push(qName);}
}
3錛?JDOM
import Java.io.*;
import Java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
銆public static void main(String arge[]) {
銆銆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("杞︾墝鍙風(fēng)爜:" + ((Element)allChildren.get(i)).getChild("NO").getText());
銆銆銆銆System.out.println("杞︿富鍦板潃:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
銆銆銆}
銆銆} catch (Exception e) {
銆銆銆e.printStackTrace();
}
}
4錛塂OM4J
import Java.io.*;
import Java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader {
銆public static void main(String arge[]) {
銆銆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("杞︾墝鍙風(fēng)爜:" + foo.elementText("NO"));
銆銆銆銆System.out.println("杞︿富鍦板潃:" + foo.elementText("ADDR"));
銆銆銆}
銆銆} catch (Exception e) {
銆銆銆e.printStackTrace();
}
}
Grails鏀寔涓浜涗笉鍚岀殑鏂規(guī)硶鏉ヤ駭鐢焁ML鍜孞SON鍝嶅簲銆傜涓涓槸闅愬紡鐨勯氳繃render鏂規(guī)硶銆?
render
鏂規(guī)硶鍙互浼犻掍竴涓唬鐮佸潡鏉ユ墽琛屾爣璁扮敓鎴愬櫒浜х敓XML
def list = { def results = Book.list() render(contentType:"text/xml") { books { for(b in results) { book(title:b.title) } } } }
榪欐浠g爜鐨勭粨鏋滃皢浼?xì)鍍彉q欐牱錛?
<books> <book title="The Stand" /> <book title="The Shining" /> </books>
娉ㄦ剰錛屽綋浣犱嬌鐢ㄦ爣璁扮敓鎴愬櫒鏃訛紝蹇呴』灝忓績閬垮厤鍛藉悕鍐茬獊銆備緥濡傦紝榪欐浠g爜灝嗕駭鐢熶竴涓敊璇細(xì)
def list = { def books = Book.list() // naming conflict here render(contentType:"text/xml") { books { for(b in results) { book(title:b.title) } } } }
鍘熷洜鏄紝榪欓噷鐨勪竴涓湰鍦板彉閲?code>books浼佸浘浣滀負(fù)鏂規(guī)硶琚皟鐢ㄣ?
render
鏂規(guī)硶鍙互鍚屾牱琚敤浜庤緭鍑篔SON:
def list = { def results = Book.list() render(contentType:"text/json") { books { for(b in results) { book(title:b.title) } } } }
鍦ㄨ繖縐嶆儏鍐典笅錛岀粨鏋滃氨浼?xì)鏄ぇ鑷寸浉鍚岀殑锛?xì)
[ {title:"The Stand"}, {title:"The Shining"} ]
鍚屾牱鐨勫懡鍚嶅啿紿佸嵄闄╅傜敤浜嶫SON鐢熸垚鍣ㄣ?
錛堣瘧鑰呮敞錛氬湪姝ら檮涓婂浜庡垪闆?Marshalling)瑙i噴錛氬鍑芥暟鍙傛暟榪涜鎵撳寘澶勭悊寰楄繃紼嬶紝鍥犱負(fù)鎸囬拡絳夋暟鎹紝蹇呴』閫氳繃涓瀹氬緱杞崲錛屾墠鑳借鍙︿竴緇勪歡鎵鐞嗚В銆傚彲浠ヨ鍒楅泦(Marshalling)鏄竴縐嶆暟鎹牸寮忕殑杞崲鏂規(guī)硶銆傦級(jí)
Grails鍚屾牱鏀寔鑷姩鍒楅泦(Marshalling)棰嗗煙綾諱負(fù)XML閫氳繃鐗瑰畾鐨勮漿鎹㈠櫒銆?
棣栧厛錛屽鍏?code>grails.converters 綾誨寘鍒頒綘鐨勬帶鍒跺櫒錛圕ontrollers錛変腑錛?
import grails.converters.*
鐜板湪錛屼綘鍙互浣跨敤涓嬪垪楂樺害鏄撹鐨勮娉曟潵鑷姩杞崲棰嗗煙綾繪垚XML錛?
render Book.list() as XML
杈撳嚭緇撴灉鐪嬩笂鍘諱細(xì)鍍忎笅鍒楄繖鏍鳳細(xì)
<?xml version="1.0" encoding="ISO-8859-1"?> <list> <book id="1"> <author>Stephen King</author> <title>The Stand</title> </book> <book id="2"> <author>Stephen King</author> <title>The Shining</title> </book> </list>
涓涓嬌鐢ㄨ漿鎹㈠櫒鐨勬浛浠f柟娉曟槸浣跨敤Grails鐨刢odecs鐗規(guī)с俢odecs鐗規(guī)ф彁渚涗簡encodeAsXML鍜宔ncodeAsJSON鏂規(guī)硶:
def xml = Book.list().encodeAsXML() render xml
Grails鍚屾牱鏀寔鑷姩鍒楅泦(Marshalling)涓篔SON閫氳繃鍚屾牱鐨勬満鍒躲傜畝鍗曟浛浠?code>XML 涓?code>JSON
render Book.list() as JSON
杈撳嚭緇撴灉鐪嬩笂鍘諱細(xì)鍍忎笅鍒楄繖鏍鳳細(xì)
[ {"id":1, "class":"Book", "author":"Stephen King", "title":"The Stand"}, {"id":2, "class":"Book", "author":"Stephen King", "releaseDate":new Date(1194127343161), "title":"The Shining"} ]
鍐嶆浣滀負(fù)涓縐嶆浛浠o紝浣犲彲浠ヤ嬌鐢?code>encodeAsJSON杈懼埌鐩稿悓鐨勬晥鏋?
鍏充簬XML Schema涓殑key鍜寀nique鐨勬蹇靛緢澶歋chema鏁欑▼閲岄潰璁茶繃錛屽彲鎯滅綉涓婂ぇ閮ㄥ垎鏁欑▼閲岄潰鐨勪緥瀛愭槸閿欒鐨勶紝鑰屼笖騫舵病鏈夌粰鍑哄畬鏁存竻鏅扮殑瑙i噴錛屾垜鏌ユ壘浜哠chema鐨勮鑼冨茍鍐欏嚭浜嗙浉搴斾簡渚嬪瓙錛岀悊娓呬簡榪欎袱涓蹇碉紝甯屾湜瀵瑰ぇ瀹舵湁鎵甯姪銆俋ML Schema瑙勮寖鏉ヨ嚜浜?br /> http://www.w3.org/TR/xmlschema-0/
1.unique鐨勫畾涔夊拰渚嬪瓙
瑙勮寖涓浜巙nique鏄繖鏍峰畾涔夌殑錛歑ML Schema enables us to indicate that any attribute or element value must be unique within a certain scope. To indicate that one particular attribute or element value is unique, we use the unique element first to "select" a set of elements, and then to identify the attribute or element "field" relative to each selected element that has to be unique within the scope of the set of selected elements.
璇戞枃錛歑ML Schema鍏佽鎴戜滑鎸囧嚭浠繪剰鐨勫睘鎬ф垨鑰呭厓绱犲煎湪鏌愪釜鑼冨洿鍐呮槸鍞竴鐨勩備負(fù)浜嗘寚鍑鴻繖涓睘鎬ф垨鑰呭厓绱犲肩殑鍞竴鎬э紝鎴戜滑浣跨敤浜唘nique鍏冪礌錛屽畠棣栧厛“閫夋嫨”涓緇勫厓绱狅紝鐒跺悗鎸囧嚭榪欎釜灞炴ф垨鑰呭厓绱犵殑“鍩?#8221;鍦ㄤ笂涓姝ユ墍閫夋嫨鍑虹殑鍏冪礌闆嗗悎涓槸鍞竴鐨勩?br />
渚嬪瓙Schema錛歎niqueTest.xsd
<?xml version="1.0" encoding="GB2312"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Person">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" maxOccurs="unbounded"/>
<xs:element name="Id" type="xs:integer" maxOccurs="unbounded">
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:unique name="IdUnique">
<xs:selector xpath=".//Id"/>
<xs:field xpath="."/>
</xs:unique>
</xs:element>
</xs:schema>
渚嬪瓙XML:UniqueTest.xml
<?xml version="1.0" encoding="GB2312"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="UniqueTest.xsd">
<Name>wxb_nudt</Name>
<Id>1001</Id>
<Id>1002</Id>
<Id>1001</Id> <!--榪欏効灝變細(xì)鎶ラ敊錛屽洜涓哄畠鐨勫煎拰絎竴涓狪d閲嶅浜嗭紝騫朵笉鏄敮涓鐨?->
<Id>1004</Id>
</Person>
2.key鐨勫畾涔夊拰渚嬪瓙
瑙勮寖涓槸閫氳繃涓涓緝闀跨殑渚嬪瓙鏉ヨ鏄巏ey鍜宬eyref鐨勫畾涔夛紝褰掔撼璧鋒潵鍙互鍋氬涓嬪畾涔夛細(xì)XML Schema鍙互閫氳繃灝嗕竴涓厓绱犳垨鑰呭睘鎬у畾涔変負(fù)涓涓猭ey錛岃繖涓猭ey蹇呴』鏄痷nique鐨勶紝榪欎釜key鍙互鍦╔ML鏂囨。涓殑鍏朵粬閮ㄥ垎閫氳繃keyref榪涜寮曠敤錛宬eyref鐨勫間竴瀹氬彇鑷簬key鐨勬煇涓涓箋俴ey鐨勬蹇靛緢綾諱技浜庢暟鎹簱涓殑澶栭敭銆?br />
key鐨勫叿浣撳畾涔夋柟娉曞緢綾諱技浜巙nique鐨勫畾涔夋柟娉曪紝棣栧厛“閫夋嫨”涓緇勫厓绱狅紝鐒跺悗鎸囧嚭鏌愪釜灞炴ф垨鑰呭厓绱犵殑“鍩?#8221;灝辨槸涓涓猭ey銆?br />
鑰宬eyref涓巏ey鐨勫畾涔夊畬鍏ㄧ浉浼鹼紝鍞竴鐨勫尯鍒槸鍔犱簡涓涓猺efer灞炴э紝榪欎釜refer灞炴ф寚鍑轟簡key鐨勫悕瀛楋紝鍏蜂綋渚嬪瓙濡備笅錛?br />
渚嬪瓙schema錛欿eyExam.xsd
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by wxb (nudt) -->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="rootElement">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="elementOne" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementOneKey" type="xsd:integer"/>
<xsd:attribute name="elementOneDesc" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="elementTwo" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="elementTwoKey" type="xsd:integer"/>
<xsd:attribute name="elementOneKey" type="xsd:string"/>
<xsd:attribute name="elementTwoDesc" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:key name="elementOnePK">
<xsd:selector xpath=".//elementOne"/>
<xsd:field xpath="@elementOneDesc"/>
</xsd:key>
<xsd:keyref name="elementOneFK" refer="elementOnePK">
<xsd:selector xpath=".//elementTwo"/>
<xsd:field xpath="@elementTwoDesc"/>
</xsd:keyref>
<xsd:unique name="EOneKeyU" xsi:type="xsd:integer">
<xsd:selector xpath=".//elementOne"/>
<xsd:field xpath="@elementOneKey"/>
</xsd:unique>
</xsd:element>
</xsd:schema>
渚嬪瓙xml錛欿eyExam.xml
<?xml version="1.0" encoding="UTF-8"?>
<rootElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="KeyExam.xsd">
<elementOne elementOneKey="1" elementOneDesc="a"/>
<elementOne elementOneKey="2" elementOneDesc="b"/>
<elementOne elementOneKey="3" elementOneDesc="c"/>
<elementOne elementOneKey="4" elementOneDesc="d"/>
<elementTwo elementOneKey="5" elementTwoDesc="e" elementTwoKey="78"/>
<!--涓婇潰鐨別lementTwoDesc浣滀負(fù)elementOneDesc鐨勪竴涓猭eyref錛屽畠蹇呴』鍙栧間簬涓婇潰鐨?涓猭ey鍊間箣涓錛岃繖閲屽畠鐨勫?e"鍥犱負(fù)涓嶆槸鍙栧間簬"a","b","c","d",鎵浠ヤ細(xì)鎶ラ敊-->
</rootElement>
瀵逛竴緇勫肩殑綰︽潫錛堜嬌鐢ㄦ灇涓撅級(jí)
涓嬭堪妗堜緥緇欏悕涓?car"鐨勫厓绱犲畾涔変簡綰︽潫鏉′歡錛岀鍚堟潯浠剁殑鍊兼湁錛欰udi銆丟olf銆丅MW錛?br />
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
瀵逛竴緋誨垪鍊肩殑綰︽潫
涓嬭堪妗堜緥緇欏悕涓?letter"鐨勫厓绱犲畾涔変簡綰︽潫鏉′歡銆傚敮涓絎﹀悎鏉′歡鐨勫兼槸浠?a 鍒?z 涔嬮棿鐨勪竴涓皬鍐欏瓧姣嶏細(xì)
<xs:element name="letter">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
涓嬭堪妗堜緥緇欏悕涓?gender"鐨勫厓绱犲畾涔変簡涓涓害鏉熸潯浠躲傚敮涓絎﹀悎鐨勫兼槸male 錛堢敺鎬э級(jí)鎴杅emale錛堝コ鎬э級(jí)錛?/span>
<xs:element name="gender">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="male|female"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
瀵圭┖鐧界鐨勭害鏉?/span>
涓嬭堪妗堜緥緇欏悕涓?address"鐨勫厓绱犲畾涔変簡涓涓害鏉熸潯浠躲傜┖鐧界璁劇疆涓?preserve"錛堜繚鐣欙級(jí)錛岃繖鎰忓懗鐫XML澶勭悊鍣ㄤ笉浼?xì)鍒犻櫎鋼Q浣曠┖鐧界錛?/span>
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
涓嬭堪妗堜緥緇欏悕涓?address"鐨勫厓绱犲畾涔変簡涓涓害鏉熸潯浠躲傜┖鐧界璁劇疆涓? replace "錛堟浛浠o級(jí)錛岃繖鎰忓懗鐫XML澶勭悊鍣ㄤ細(xì)鐢ㄧ┖鏍兼浛浠f墍鏈夌殑絀虹櫧瀛楃錛堝叾涓寘鎷細(xì)鎹㈣絎︺佸埗琛ㄧ銆佺┖鏍肩銆佸洖杞︾錛夛細(xì)
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="replace"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
涓嬭堪妗堜緥緇欏悕涓?address"鐨勫厓绱犲畾涔変簡涓涓害鏉熸潯浠躲傜┖鐧界璁劇疆涓?collapse"錛堟竻闄わ級(jí)錛岃繖鎰忓懗鐫XML澶勭悊鍣ㄤ細(xì)娓呴櫎鎵鏈夌殑絀虹櫧瀛楃錛堟崲琛岀銆佸埗琛ㄧ銆佺┖鏍肩浠ュ強(qiáng)鍥炶濺絎﹂兘琚┖鏍肩鏇夸唬銆傚ご閮ㄣ佸熬閮ㄧ殑絀烘牸浼?xì)琚竻闄ゅQ屽涓┖鏍間篃浼?xì)鑷姩鍑彏畱湄?fù)涓涓級(jí)錛?/span>
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
瀵規(guī)暟鎹被鍨嬬殑綰︽潫
Constraint |
Description |
enumeration |
Defines a list of acceptable values |
fractionDigits |
Specifies the maximum number of decimal places allowed. Must be equal to or greater than zero |
length |
Specifies the exact number of characters or list items allowed. Must be equal to or greater than zero |
maxExclusive |
Specifies the upper bounds for numeric values (the value must be less than this value) |
maxInclusive |
Specifies the upper bounds for numeric values (the value must be less than or equal to this value) |
maxLength |
Specifies the maximum number of characters or list items allowed. Must be equal to or greater than zero |
minExclusive |
Specifies the lower bounds for numeric values (the value must be greater than this value) |
minInclusive |
Specifies the lower bounds for numeric values (the value must be greater than or equal to this value) |
minLength |
Specifies the minimum number of characters or list items allowed. Must be equal to or greater than zero |
pattern |
Defines the exact sequence of characters that are acceptable |
totalDigits |
Specifies the exact number of digits allowed. Must be greater than zero |
whiteSpace |
Specifies how white space (line feeds, tabs, spaces, and carriage returns) is handled |
import Java.io.IOException;
import Java.io.InputStream;
import javax.xml.XMLConstants;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
public class SchemaValidation {
/**
* @param args
* @throws IOException
* @throws SAXException
* @throws ParserConfigurationException
*/
public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException {
SchemaValidation sv = new SchemaValidation();
sv.validate();
}
public void validate() {
try {
String strLang = XMLConstants.W3C_XML_SCHEMA_NS_URI;
SchemaFactory factory = SchemaFactory.newInstance(strLang);
InputStream isSchema = getClass().getResourceAsStream("/founder.xsd");
StreamSource ss = new StreamSource(isSchema);
Schema schema = factory.newSchema(ss);
Validator validator = schema.newValidator();
InputStream isXML = getClass().getResourceAsStream("/founder.xml");
StreamSource source = new StreamSource(isXML);
validator.validate(source);
System.out.println("Result : Valid!");
} catch (Exception e) {
e.printStackTrace();
System.out.println("Result : Invalid!");
}
}
}
founder.xsd
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.founder.com" elementFormDefault="qualified">
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string" />
<xs:element name="from" type="xs:string" />
<xs:element name="heading" type="xs:string" />
<xs:element name="body" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
founder.xml
<?xml version="1.0"?>
<note xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.founder.com founder.xsd">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
濡傛灉瑕佸憡璇夊埆浜轟拱涓鍔犱粦鐗涘ザ錛屾?zhèn)ㄤ細(xì)鎬庝箞璇達(dá)紵“璇峰幓涔頒竴鍔犱粦鐗涘ザ鍥炴潵” 榪樻槸 “浠庡墠闂ㄥ嚭鍘伙紝鍚戝乏杞紝璧頒笁涓鍖哄悜鍙寵漿錛屽啀璧板崐涓鍖哄悜鍙寵漿榪涘叆鍟嗗簵銆傝蛋鍚戝洓鍙烽氶亾錛屾部閫氶亾璧頒簲綾沖悜宸︼紝鎷夸竴鐡朵竴鍔犱粦瑁呯殑鐗涘ザ鐒跺悗鍒版敹閾跺彴浠樻銆傚啀娌垮師璺洖瀹躲?#8221; 綆鐩村お鍙瑧浜嗐傚彧瑕佸湪 “璇峰幓涔頒竴鍔犱粦鐗涘ザ鍥炴潵” 鐨勫熀紜涓婄◢鍔犳寚紺猴紝澶氭暟鎴愪漢閮借兘鑷繁涔板洖鐗涘ザ鏉ャ?
鏌ヨ璇█鍜岃綆楁満鎼滅儲(chǔ)涓庢綾諱技銆傜洿鎺ヨ “鎵句竴涓?Cryptonomicon 鐨勫壇鏈?#8221; 瑕佹瘮緙栧啓鎼滅儲(chǔ)鏌愪釜鏁版嵁搴撶殑璇︾粏閫昏緫瀹規(guī)槗寰楀銆傜敱浜庢悳绱㈡搷浣滅殑閫昏緫闈炲父鐩鎬技錛屽彲浠ュ彂鏄庝竴縐嶉氱敤璇█璁╂?zhèn)ㄤ娇鐢?“鎵懼埌 Neal Stephenson 鐨勬墍鏈夎憲浣?#8221; 榪欐牱鐨勫懡浠わ紝鐒跺悗緙栧啓瀵圭壒瀹氭暟鎹瓨鍌ㄦ墽琛屾綾繪煡璇㈢殑寮曟搸銆?
鍦ㄤ紬澶氭煡璇㈣璦涔嬩腑錛岀粨鏋勫寲鏌ヨ璇█錛圫QL錛夋槸涓縐嶉拡瀵規(guī)煡璇㈢壒瀹氱被鍨嬬殑鍏崇郴搴撹岃璁″拰浼樺寲鐨勮璦銆傚叾浠栦笉閭d箞甯歌鐨勬煡璇㈣璦榪樻湁瀵硅薄鏌ヨ璇█錛圤QL錛夊拰 XQuery銆備絾鏈枃鐨勪富棰樻槸 XPath錛屼竴縐嶄負(fù)鏌ヨ XML 鏂囨。鑰岃璁$殑鏌ヨ璇█銆傛瘮濡傦紝涓嬮潰榪欎釜綆鍗曠殑 XPath 鏌ヨ鍙互鍦ㄦ枃妗d腑鎵懼埌浣滆呬負(fù) Neal Stephenson 鐨勬墍鏈夊浘涔︾殑鏍囬錛?/p>
|
浣滀負(fù)瀵圭収錛屾煡璇㈠悓鏍蜂俊鎭殑綰?DOM 鎼滅儲(chǔ)浠g爜濡?娓呭崟 1 鎵紺猴細(xì)
|
涓嶈鎮(zhèn)ㄦ槸鍚︾浉淇★紝娓呭崟 1 涓殑 DOM 鏄劇劧涓嶅綆鍗曠殑 XPath 琛ㄨ揪寮忛氱敤鎴栬呭仴澹傛?zhèn)ㄦ効鎰従~栧啓銆佽皟璇曞拰緇存姢鍝竴涓紵鎴戞兂絳旀寰堟槑鏄俱?
浣嗘槸铏界劧鏈夊緢寮虹殑琛ㄨ揪鑳藉姏錛孹Path 騫朵笉鏄?Java 璇█錛屼簨瀹炰笂 XPath 涓嶆槸涓縐嶅畬鏁寸殑緙栫▼璇█銆傛湁寰堝涓滆タ鐢?XPath 琛ㄨ揪涓嶅嚭鏉ワ紝鐢氳嚦鏈変簺鏌ヨ涔熸棤娉曡〃杈俱傛瘮鏂硅錛孹Path 涓嶈兘鏌ユ壘鍥介檯鏍囧噯鍥句功緙栫爜錛圛SBN錛夋楠岀爜涓嶅尮閰嶇殑鎵鏈夊浘涔︼紝鎴栬呮壘鍑哄澶栧笎鎴鋒暟鎹簱鏄劇ず嬈犲笎鐨勬墍鏈変綔鑰呫傚垢榪愮殑鏄紝鍙互鎶?XPath 緇撳悎鍒?Java 紼嬪簭涓紝榪欐牱灝辮兘鍙戞尌涓よ呯殑浼樺娍浜嗭細(xì)Java 鍋?Java 鎵鎿呴暱鐨勶紝XPath 鍋?XPath 鎵鎿呴暱鐨勩?
鐩村埌鏈榪戯紝Java 紼嬪簭鎵ц XPath 鏌ヨ鎵闇瑕佺殑搴旂敤紼嬪簭緙栫▼鎺ュ彛錛圓PI錛夎繕鍥犲艦褰㈣壊鑹茬殑 XPath 寮曟搸鑰屽悇涓嶇浉鍚屻俋alan 鏈変竴縐?API錛孲axon 浣跨敤鍙︿竴縐嶏紝鍏朵粬寮曟搸鍒欎嬌鐢ㄥ叾浠栫殑 API銆傝繖鎰忓懗鐫浠g爜寰寰鎶婃?zhèn)ㄩ檺鍒跺堫C竴縐嶄駭鍝佷笂銆傜悊鎯蟲儏鍐典笅錛屾渶濂借兘澶熻瘯楠屽叿鏈変笉鍚屾ц兘鐗圭偣鐨勫悇縐嶅紩鎿庯紝鑰屼笉浼?xì)甯︽潵涓嶉傚綋鐨勯夯鐑?chǔ)鎴栬呴噸鏂扮紪鍐欎唬鐮併?
浜庢槸錛孞ava 5 鎺ㄥ嚭浜?javax.xml.xpath
鍖咃紝鎻愪緵涓涓紩鎿庡拰瀵硅薄妯″瀷鐙珛鐨?XPath 搴撱傝繖涓寘涔熷彲鐢ㄤ簬 Java 1.3 鍙?qiáng)浠ュ悗鐨勭増鏈Q屼絾闇瑕佸崟鐙畨瑁?Java API for XML Processing (JAXP) 1.3銆俋alan 2.7 鍜?Saxon 8 浠ュ強(qiáng)鍏朵粬浜у搧鍖呭惈浜嗚繖涓簱鐨勫疄鐜般?
![]() ![]() |
![]()
|
鎴戝皢涓句緥璇存槑濡備綍浣跨敤瀹冦傜劧鍚庡啀璁ㄨ涓浜涚粏鑺傞棶棰樸傚亣璁捐鏌ヨ涓涓浘涔﹀垪琛紝瀵繪壘 Neal Stephenson 鐨勮憲浣溿傚叿浣撴潵璇達(dá)紝榪欎釜鍥句功鍒楄〃鐨勫艦寮忓 娓呭崟 2 鎵紺猴細(xì)
|
![]() |
|
鏌ユ壘鎵鏈夊浘涔︾殑 XPath 鏌ヨ闈炲父綆鍗曪細(xì)//book[author="Neal Stephenson"]
銆備負(fù)浜嗘壘鍑鴻繖浜涘浘涔︾殑鏍囬錛屽彧瑕佸鍔犱竴姝ワ紝琛ㄨ揪寮忓氨鍙樻垚浜?//book[author="Neal Stephenson"]/title
銆傛渶鍚庯紝鐪熸闇瑕佺殑鏄?title
鍏冪礌鐨勬枃鏈妭鐐瑰瀛愩傝繖灝辮姹傚啀澧炲姞涓姝ワ紝瀹屾暣鐨勮〃杈懼紡灝辨槸 //book[author="Neal Stephenson"]/title/text()
銆?
鐜板湪鎴戞彁渚涗竴涓畝鍗曠殑紼嬪簭錛屽畠浠?Java 璇█涓墽琛岃繖涓煡璇紝鐒跺悗鎶婃壘鍒扮殑鎵鏈夊浘涔︾殑鏍囬鎵撳嵃鍑烘潵銆傞鍏堬紝闇瑕佸皢鏂囨。鍔犺澆鍒頒竴涓?DOM Document
瀵硅薄涓備負(fù)浜嗙畝鍖栬搗瑙侊紝鍋囪璇ユ枃妗e湪褰撳墠宸ヤ綔鐩綍鐨?books.xml 鏂囦歡涓備笅闈㈢殑綆鍗曚唬鐮佺墖孌佃В鏋愭枃妗e茍寤虹珛瀵瑰簲鐨?Document
瀵硅薄錛?
|
鍒扮洰鍓嶄負(fù)姝紝榪欎粎浠呮槸鏍囧噯鐨?JAXP 鍜?DOM錛屾病鏈変粈涔堟柊椴滅殑銆?
鎺ヤ笅鏉ュ垱寤?XPathFactory
錛?/p>
|
鐒跺悗浣跨敤榪欎釜宸ュ巶鍒涘緩 XPath
瀵硅薄錛?
|
XPath
瀵硅薄緙栬瘧 XPath 琛ㄨ揪寮忥細(xì)
|
![]() |
|
鏈鍚庯紝璁$畻 XPath 琛ㄨ揪寮忓緱鍒扮粨鏋溿傝〃杈懼紡鏄拡瀵圭壒瀹氱殑涓婁笅鏂囪妭鐐硅綆楃殑錛屽湪榪欎釜渚嬪瓙涓槸鏁翠釜鏂囨。銆傝繕蹇呴』鎸囧畾榪斿洖綾誨瀷銆傝繖閲岃姹傝繑鍥炰竴涓妭鐐歸泦錛?
|
鍙互灝嗙粨鏋滃己鍒惰漿鍖栨垚 DOM NodeList
錛岀劧鍚庨亶鍘嗗垪琛ㄥ緱鍒版墍鏈夌殑鏍囬錛?
|
娓呭崟 4
鎶婁笂榪扮墖孌電粍鍚堝埌浜嗕竴涓▼搴忎腑銆傝繕瑕佹敞鎰忥紝榪欎簺鏂規(guī)硶鍙兘鎶涘嚭涓浜涙鏌ュ紓甯革紝榪欎簺寮傚父蹇呴』鍦?throws
瀛愬彞涓0鏄庯紝浣嗘槸鎴戝湪涓婇潰鎶婂畠浠帺鐩栬搗鏉ヤ簡錛?
|
姣忓綋娣峰悎浣跨敤璇稿 XPath 鍜?Java 榪欐牱涓ょ涓嶅悓鐨勮璦鏃訛紝蹇呭畾浼?xì)鏈夋煇浜洖畣涓よ呯矘鍚堝湪涓璧風(fēng)殑鏄庢樉鎺ョ紳銆傚茍闈炰竴鍒囬兘寰堝悎鎷嶃俋Path 鍜?Java 璇█娌℃湁鍚屾牱鐨勭被鍨嬬郴緇熴俋Path 1.0 鍙湁鍥涚鍩烘湰鏁版嵁綾誨瀷錛?/p>
褰撶劧錛孞ava 璇█鏈夋洿澶氱殑鏁版嵁綾誨瀷錛屽寘鎷敤鎴峰畾涔夌殑瀵硅薄綾誨瀷銆?/p>
澶氭暟 XPath 琛ㄨ揪寮忥紝鐗瑰埆鏄綅緗礬寰勶紝閮借繑鍥炶妭鐐歸泦銆備絾鏄繕鏈夊叾浠栧彲鑳姐傛瘮濡傦紝XPath 琛ㄨ揪寮?count(//book)
榪斿洖鏂囨。涓殑鍥句功鏁伴噺銆俋Path 琛ㄨ揪寮?count(//book[@author="Neal Stephenson"]) > 10
榪斿洖涓涓竷?yōu)當(dāng)鍊鹼細(xì)濡傛灉鏂囨。涓?Neal Stephenson 鐨勮憲浣滆秴榪?10 鏈垯榪斿洖 true錛屽惁鍒欒繑鍥?false銆?
evaluate()
鏂規(guī)硶琚0鏄庝負(fù)榪斿洖 Object
銆傚疄闄呰繑鍥炰粈涔堜緷璧栦簬 XPath 琛ㄨ揪寮忕殑緇撴灉浠ュ強(qiáng)瑕佹眰鐨勭被鍨嬨備竴鑸潵璇達(dá)紝XPath 鐨?/p>
Java.lang.Double
Java.lang.String
Java.lang.Boolean
org.w3c.dom.NodeList
![]() |
|
鍦?Java 涓綆?XPath 琛ㄨ揪寮忔椂錛岀浜屼釜鍙傛暟鎸囧畾闇瑕佺殑榪斿洖綾誨瀷銆傛湁浜旂鍙兘錛岄兘鍦?javax.xml.xpath.XPathConstants
綾諱腑鍛藉悕浜嗗父閲忥細(xì)
XPathConstants.NODESET
XPathConstants.BOOLEAN
XPathConstants.NUMBER
XPathConstants.STRING
XPathConstants.NODE
鏈鍚庝竴涓?XPathConstants.NODE
瀹為檯涓婃病鏈夊尮閰嶇殑 XPath 綾誨瀷銆傚彧鏈夌煡閬?XPath 琛ㄨ揪寮忓彧榪斿洖涓涓妭鐐規(guī)垨鑰呭彧闇瑕佷竴涓妭鐐規(guī)椂鎵嶄嬌鐢ㄥ畠銆傚鏋?XPath 琛ㄨ揪寮忚繑鍥炰簡澶氫釜鑺傜偣騫朵笖鎸囧畾浜?XPathConstants.NODE
錛屽垯 evaluate()
鎸夌収鏂囨。欏哄簭榪斿洖絎竴涓妭鐐廣傚鏋?XPath 琛ㄨ揪寮忛夋嫨浜嗕竴涓┖闆嗗茍鎸囧畾浜?XPathConstants.NODE
錛屽垯 evaluate()
榪斿洖 null銆?
濡傛灉涓嶈兘瀹屾垚瑕佹眰鐨勮漿鎹紝evaluate()
灝嗘姏鍑?XPathException
銆?
鑻?XML 鏂囨。涓殑鍏冪礌鍦ㄥ悕縐扮┖闂翠腑錛屾煡璇㈣鏂囨。鐨?XPath 琛ㄨ揪寮忓繀欏諱嬌鐢ㄧ浉鍚岀殑鍚嶇О絀洪棿銆俋Path 琛ㄨ揪寮忎笉涓瀹氳浣跨敤鐩稿悓鐨勫墠緙錛屽彧闇瑕佸悕縐扮┖闂?URI 鐩稿悓鍗沖彲銆備簨瀹炰笂錛屽鏋?XML 鏂囨。浣跨敤榛樿鍚嶇О絀洪棿錛岄偅涔堝敖綆$洰鏍囨枃妗f病鏈変嬌鐢ㄥ墠緙錛孹Path 琛ㄨ揪寮忎篃蹇呴』浣跨敤鍓嶇紑銆?
浣嗘槸錛孞ava 紼嬪簭涓嶆槸 XML 鏂囨。錛屽洜姝や笉鑳界敤涓鑸殑鍚嶇О絀洪棿瑙f瀽銆傚繀欏繪彁渚涗竴涓璞″皢鍓嶇紑鏄犲皠鍒板悕縐扮┖闂?URI銆傝瀵硅薄鏄?javax.xml.namespace.NamespaceContext
鎺ュ彛鐨勫疄渚嬨傛瘮濡傦紝鍋囪鍥句功鏂囨。鏀懼湪 http://www.example.com/books 鍚嶇О絀洪棿涓紝濡?娓呭崟 5 鎵紺猴細(xì)
|
鏌ユ壘 Neal Stephenson 鍏ㄩ儴钁椾綔鏍囬鐨?XPath 琛ㄨ揪寮忓氨瑕佹敼涓?//pre:book[pre:author="Neal Stephenson"]/pre:title/text()
銆備絾鏄紝蹇呴』灝嗗墠緙 pre
鏄犲皠鍒?URI http://www.example.com/books銆?code>NamespaceContext 鎺ュ彛鍦?Java 杞歡寮鍙戝伐鍏風(fēng)錛圝DK錛夋垨 JAXP 涓病鏈夐粯璁ゅ疄鐜頒技涔庢湁鐐圭錛屼絾紜疄濡傛銆備笉榪囷紝鑷繁瀹炵幇涔熶笉闅俱?a >娓呭崟 6 瀵逛竴涓悕縐扮┖闂寸粰鍑轟簡綆鍗曠殑瀹炵幇銆傝繕闇瑕佹槧灝?xml
鍓嶇紑銆?
|
浣跨敤鏄犲皠瀛樺偍緇戝畾鍜屽鍔?setter 鏂規(guī)硶瀹炵幇鍚嶇О絀洪棿涓婁笅鏂囩殑閲嶇敤涔熶笉闅俱?
鍒涘緩 NamespaceContext
瀵硅薄鍚庯紝鍦ㄧ紪璇戣〃杈懼紡涔嬪墠灝嗗叾瀹夎鍒?XPath
瀵硅薄涓娿備互鍚庡氨鍙互鍍忎互鍓嶄竴鏍鋒槸鐢ㄨ繖浜涘墠緙鏌ヨ浜嗐傛瘮濡傦細(xì)
|
鏈夋椂鍊欙紝鍦?Java 璇█涓畾涔夌敤浜?XPath 琛ㄨ揪寮忕殑鎵╁睍鍑芥暟寰堟湁鐢ㄣ傝繖浜涘嚱鏁板彲浠ユ墽琛岀敤綰?XPath 寰堥毦鎴栬呮棤娉曟墽琛岀殑浠誨姟銆備笉榪囧繀欏繪槸鐪熸鐨勫嚱鏁幫紝鑰屼笉鏄殢鎰忕殑鏂規(guī)硶銆傚氨鏄涓嶈兘鏈夊壇浣滅敤銆傦紙XPath 鍑芥暟鍙互鎸夌収浠繪剰鐨勯『搴忔眰鍊間換鎰忓嬈°傦級(jí)
閫氳繃 Java XPath API 璁塊棶鐨勬墿灞曞嚱鏁板繀欏誨疄鐜?javax.xml.xpath.XPathFunction
鎺ュ彛銆傝繖涓帴鍙e彧澹版槑浜嗕竴涓柟娉?evaluate錛?
|
璇ユ柟娉曞繀欏昏繑鍥?Java 璇█鑳藉杞崲鍒?XPath 鐨勪簲縐嶇被鍨嬩箣涓錛?
String
Double
Boolean
Nodelist
Node
姣斿錛?a >娓呭崟 8 鏄劇ず浜嗕竴涓墿灞曞嚱鏁幫紝瀹冩鏌?ISBN 鐨勬牎楠屽拰騫惰繑鍥?Boolean
銆傝繖涓牎楠屽拰鐨勫熀鏈鍒欐槸鍓嶄節(jié)浣嶆暟鐨勬瘡涓浣嶄箻涓婂畠鐨勪綅緗紙鍗崇涓浣嶆暟涔樹笂 1錛岀浜屼綅鏁頒箻涓?2錛屼緷嬈$被鎺級(jí)銆傚皢榪欎簺鏁板姞璧鋒潵鐒跺悗鍙栭櫎浠?11 鐨勪綑鏁般傚鏋滀綑鏁版槸 10錛岄偅涔堟渶鍚庝竴浣嶆暟灝辨槸 X銆?
|
涓嬩竴姝ヨ榪欎釜鎵╁睍鍑芥暟鑳藉鍦?Java 紼嬪簭涓嬌鐢ㄣ備負(fù)姝わ紝闇瑕佸湪緙栬瘧琛ㄨ揪寮忎箣鍓嶅悜 XPath 瀵硅薄瀹夎 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 鏍¢獙鍜屼笉鍖歸厤鐨勬墍鏈夊浘涔︺?
|
鐢變簬鎵╁睍鍑芥暟蹇呴』鏈夊悕縐扮┖闂達(dá)紝鎵浠ヨ綆楀寘鍚墿灞曞嚱鏁扮殑琛ㄨ揪寮忔椂蹇呴』浣跨敤 NamespaceResolver
錛屽嵆渚挎煡璇㈢殑鏂囨。娌℃湁浣跨敤浠諱綍鍚嶇О絀洪棿銆傜敱浜?XPathFunctionResolver
銆?code>XPathFunction 鍜?NamespaceResolver
閮芥槸鎺ュ彛錛屽鏋滄柟渚跨殑璇濆彲浠ュ皢瀹冧滑鏀懼湪鎵鏈夌殑綾諱腑銆?
鐢?SQL 鍜?XPath 榪欐牱鐨勫0鏄庢ц璦緙栧啓鏌ヨ錛岃姣斾嬌鐢?Java 鍜?C 榪欐牱鐨勫懡浠ゅ紡璇█瀹規(guī)槗寰楀銆備絾鏄紝鐢?Java 鍜?C 榪欐牱鐨勫浘鐏靛畬鏁磋璦緙栧啓澶嶆潅鐨勯昏緫錛屽張姣?SQL 鍜?XPath 榪欐牱鐨勫0鏄庢ц璦瀹規(guī)槗寰楀銆傛墍騫哥殑鏄紝閫氳繃浣跨敤 Java Database Connectivity (JDBC) 鍜?javax.xml.xpath
涔嬬被鐨?API 鍙互灝嗕袱鑰呯粨鍚堣搗鏉ャ傞殢鐫涓栫晫涓婅秺鏉ヨ秺澶氱殑鏁版嵁杞悜 XML錛?code>javax.xml.xpath 灝嗕笌 Java.sql
涓鏍峰彉寰楄秺鏉ヨ秺閲嶈銆?/p>
榪欐槸鏍囧噯鐨刋ML鏂囨。鐨勯琛屼唬鐮侊紝鍥犱負(fù)XSLT鏈韓涔熸槸XML鏂囨。銆?br />encoding灞炴х敤鏉ュ畾涔夋枃妗d嬌鐢ㄧ殑緙栫爜褰㈠紡錛宨so-8859-1涓昏鏀寔瑗挎鍜屽寳緹庣殑璇█緙栫爜銆?br />濡傛灉浣犳兂浣跨敤綆浣撲腑鏂囷紝閭d箞灝卞簲璇ュ啓鎴愶細(xì)
<?xml version="1.0" encoding="GB2312"?>
鎺ヤ笅鍘葷殑浠g爜鏄?
鎶宸?/span>
1
銆銆
XmlNode.InnerText
涓?/span>
.InnerXml
鐨勫尯鍒槸錛氬墠鑰呭皢鍐呭涓殑
<
鍜?/span>
>
鍒嗗埆鍙樻垚
<
鍜?/span>
>
錛屽洜姝わ紝甯屾湜灝嗕袱孌?/span>
XmlDocument
鍚堝茍鐨勭▼搴忓彧鑳戒嬌鐢?/span>
XmlDocumentFragment.InnerXml = XmlNode.OuterXml
/XPath: string end-with
<xsl:for-each select="root/data[substring-after(@name,'.')= 'Text' and string-length(value)>0]">