首页 > 奇闻 > 正文内容

Java解析XML的3种常用方法:DOM SAX Jackson代码实例

奇闻2025-05-28 06:19:58

涓€銆佸紑澶达細涓轰粈涔堣瀛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; iElement 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>
  1. 鈥?strong>鈥婦OM鈥?/strong>鈥嬶細閫傚悎鈥?strong>鈥嬮厤缃枃浠惰В鏋愨€?/strong>鈥嬶紝姣斿Spring鐨刡ean瀹氫箟
  2. 鈥?strong>鈥婼AX鈥?/strong>鈥嬶細澶勭悊鈥?strong>鈥嬫棩蹇楁枃浠跺垎鏋愨€?/strong>鈥嬭繖绉嶅ぇ鏂囦欢鍦烘櫙
  3. 鈥?strong>鈥婮ackson鈥?/strong>鈥嬶細鍋氣€?strong>鈥嬫帴鍙f暟鎹浆鎹⑩€?/strong>鈥嬫椂鏁堢巼椋炶捣

鏈€杩戦亣鍒颁釜鐪熷疄妗堜緥锛氭湁涓悓浜嬬敤DOM瑙f瀽200MB鐨勮鍗曟暟鎹紝缁撴灉鍐呭瓨椋欏埌2G鐩存帴鎶婃湇鍔℃悶宕╀簡銆傚悗鏉ユ崲鎴怱AX瑙f瀽锛屽唴瀛樼ǔ瀹氬湪50MB宸﹀彸鈥斺€斾綘鐪嬬湅锛岄€夊鏂规硶澶氶噸瑕侊紒

鈥?strong>鈥嬫渶鍚庤鍙ュぇ瀹炶瘽锛氣€?/strong>鈥?鍒纾曟煇涓€绉嶆柟娉曪紝涓嶅悓鍦烘櫙鐢ㄤ笉鍚屽伐鍏锋墠鏄珮鎵嬫€濈淮銆傚氨鍍忎綘涓嶄細鐢ㄨ彍鍒€鍓婅嫻鏋滅毊瀵瑰惂锛燂紙鍡?..涔熻浣犵湡浼氾紵閭g畻鎴戞病璇达級

搜索