
嘻道奇闻
- 文章199742
- 阅读14625734
Java解析XML的3种常用方法:DOM SAX Jackson代码实例
涓€銆佸紑澶达細涓轰粈涔堣瀛ML瑙f瀽锛熶妇涓牀瀛愷煂?/h3>
锛堝搸锛岃繖閲岀敤涓嶄簡琛ㄦ儏锛屼絾鍜辩敤鏂囧瓧鐓ф牱鑱婏級
浣犳槸涓嶆槸閬囧埌杩囪繖鏍风殑鍦烘櫙锛熷叕鍙歌浣犱粠绗笁鏂规帴鍙f帴鏀禭ML鏍煎紡鐨勮鍗曟暟鎹紝鎴栬€呴渶瑕佽В鏋愭湰鍦板嚑鍗丮B鐨勯厤缃枃浠讹紵杩欐椂鍊欒鏄笉浼氬鐞哫ML锛屽氨璺熸嬁鐫€铻轰笣鍒€鎷т笉寮€缃愬ご浼肩殑鈥斺€旀€ュ緱鎱屽晩锛佷粖澶╁挶浠氨鐢ㄢ€?strong>鈥嬩汉璇濃€?/strong>鈥嬭亰鑱奐ava瑙f瀽XML鐨勪笁澶х粷娲伙紝鍖呬綘鍗婂皬鏃跺氨鑳戒笂鎵嬪共娲伙紒
浜屻€丏OM瑙f瀽娉曪細鍍忔搷浣滅Н鏈ㄤ竴鏍锋憜寮刋ML
鈥?strong>鈥嬧€淒OM鏄暐锛熺畝鍗曡灏辨槸鎶婃暣涓猉ML鏂囦欢濉炶繘鍐呭瓨褰撲箰楂樼帺锛佲€濃€?/strong>鈥?br/> 姣斿鏈変釜璁㈠崟XML鏂囦欢闀胯繖鏍凤細
xml澶嶅埗<order> <id>20230801id> <items> <item name="Java缂栫▼鎬濇兂" price="99"/> items> order>
鐢―OM瑙f瀽鐨勪唬鐮侀鏋讹細
java澶嶅埗DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse("order.xml"); //鏁翠釜鏂囦欢鍔犺浇鍒板唴瀛?/span> //鍙栬鍗曞彿灏卞儚缈绘娊灞夋壘涓滆タ NodeList idList = doc.getElementsByTagName("id"); String orderId = idList.item(0).getTextContent(); //閬嶅巻鍟嗗搧鑺傜偣锛熺敤for寰幆鎸ㄤ釜鎵掓媺 NodeList items = doc.getElementsByTagName("item"); for(int i=0; i
Element item = (Element)items.item(i); String name = item.getAttribute("name"); //...鍏朵粬鎿嶄綔 }
鈥?strong>鈥嬩釜浜虹湅娉曪細鈥?/strong>鈥?DOM灏卞儚鍦ㄥ唴瀛橀噷寤轰簡涓矙鐩樻ā鍨嬶紝閫傚悎灏忔枃浠惰В鏋愩€備絾瑕佹槸閬囧埌鍑犵櫨MB鐨刋ML鈥斺€斿唴瀛樺垎鍒嗛挓鐖嗙偢锛岃繖鎯呭喌鍜卞緱鎹㈡嫑鍎匡紒
涓夈€丼AX瑙f瀽娉曪細杈硅杈瑰鐞嗙殑娴佹按绾夸綔涓?/h3>
鈥?strong>鈥嬧€淪AX灏卞儚宸ュ巶浼犻€佸甫锛屾暟鎹繃鎵嬩笉瀛橈紒鈥濃€?/strong>鈥?br/> 鍏堟悶涓户鎵緿efaultHandler鐨勭被锛?/p>
java澶嶅埗public class OrderHandler extends DefaultHandler { private String currentTag; private StringBuilder currentValue = new StringBuilder(); @Override public void startElement(String uri, String localName, String qName, Attributes attributes) { currentTag = qName; if("item".equals(qName)){ String name = attributes.getValue("name"); //鎷垮埌灞炴€х珛椹鐞嗭紝缁濅笉鎷栨偿甯︽按 } } @Override public void characters(char[] ch, int start, int length) { if(currentTag != null){ currentValue.append(ch, start, length); } } @Override public void endElement(String uri, String localName, String qName) { if("id".equals(qName)){ System.out.println("璁㈠崟鍙凤細" + currentValue); } currentValue.setLength(0); //娓呯┖缂撳瓨 } }
鍚姩瑙f瀽鍣ㄥ氨鍍忓紑鍔ㄤ紶閫佸甫锛?/p>
java澶嶅埗SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser(); parser.parse("bigdata.xml", new OrderHandler()); //杈硅杈硅В鏋?/span>
鈥?strong>鈥嬭俯鍧戞彁閱掞細鈥?/strong>鈥?鐢⊿AX澶勭悊澶氬眰宓屽鏍囩鏃讹紝寰楁嬁灏忔湰鏈鐫€褰撳墠灞傜骇鐘舵€侊紝涓嶇劧灏卞儚鍦ㄨ糠瀹噷杞湀鈥斺€斿垎涓嶆竻涓滃崡瑗垮寳锛?/p>
鍥涖€丣ackson-XML锛氬綋浠g▼搴忓憳銇伔鎳掔鍣?/h3>
鈥?strong>鈥嬧€滈兘2023骞翠簡锛岃皝杩樻墜鍔ㄨВ鏋怷ML锛熸暟鎹粦瀹氬畠涓嶉鍚楋紒鈥濃€?/strong>鈥?br/> 鍏堜笂Maven渚濊禆锛堜笉浼氱敤Maven鐨勫厛鍘婚潰澹侊級锛?/p>
xml澶嶅埗<dependency> <groupId com.fasterxml.jackson.dataformatgroupId> <artifactId>jackson-dataformat-xmlartifactId> <version>2.15.0version> dependency>
瀹氫箟涓狫avaBean锛?/p>
java澶嶅埗public class Order { @JacksonXmlProperty(localName = "id") private String orderId; @JacksonXmlProperty(localName = "items") private List
- itemList; //...getter/setter鐪佺暐 } public class Item { @JacksonXmlProperty(isAttribute = true) private String name; //...鍏朵粬灞炴€?/span> }
杞崲浠g爜绠€鍗曞埌鍝細
java澶嶅埗XmlMapper mapper = new XmlMapper(); Order order = mapper.readValue(new File("order.xml"), Order.class); //鐩存帴鎷垮埌瀵硅薄锛佹搷浣滃睘鎬у氨鍍忕敤鏅€欽ava瀵硅薄 System.out.println(order.getItemList().get(0).getName());
鈥?strong>鈥嬬伒榄傛嫹闂細鈥?/strong>鈥?鏈夌幇鎴愮殑杞瓙涓哄暐涓嶇敤锛熼櫎闈炰綘鎯冲湪闈㈣瘯鏃惰〃婕旀墜鍐欒В鏋愬櫒锛堜絾鍏ヨ亴鍚庤繕鏄緱鐢ㄦ鏋跺鍚э級锛?/p>
浜斻€佷釜浜鸿鐐癸細閫夋柟娉曡鐪嬪満鏅?/h3>
- 鈥?strong>鈥婦OM鈥?/strong>鈥嬶細閫傚悎鈥?strong>鈥嬮厤缃枃浠惰В鏋愨€?/strong>鈥嬶紝姣斿Spring鐨刡ean瀹氫箟
- 鈥?strong>鈥婼AX鈥?/strong>鈥嬶細澶勭悊鈥?strong>鈥嬫棩蹇楁枃浠跺垎鏋愨€?/strong>鈥嬭繖绉嶅ぇ鏂囦欢鍦烘櫙
- 鈥?strong>鈥婮ackson鈥?/strong>鈥嬶細鍋氣€?strong>鈥嬫帴鍙f暟鎹浆鎹⑩€?/strong>鈥嬫椂鏁堢巼椋炶捣
鏈€杩戦亣鍒颁釜鐪熷疄妗堜緥锛氭湁涓悓浜嬬敤DOM瑙f瀽200MB鐨勮鍗曟暟鎹紝缁撴灉鍐呭瓨椋欏埌2G鐩存帴鎶婃湇鍔℃悶宕╀簡銆傚悗鏉ユ崲鎴怱AX瑙f瀽锛屽唴瀛樼ǔ瀹氬湪50MB宸﹀彸鈥斺€斾綘鐪嬬湅锛岄€夊鏂规硶澶氶噸瑕侊紒
鈥?strong>鈥嬫渶鍚庤鍙ュぇ瀹炶瘽锛氣€?/strong>鈥?鍒纾曟煇涓€绉嶆柟娉曪紝涓嶅悓鍦烘櫙鐢ㄤ笉鍚屽伐鍏锋墠鏄珮鎵嬫€濈淮銆傚氨鍍忎綘涓嶄細鐢ㄨ彍鍒€鍓婅嫻鏋滅毊瀵瑰惂锛燂紙鍡?..涔熻浣犵湡浼氾紵閭g畻鎴戞病璇达級