1. 程式人生 > >Java用String 擷取方式解析xml檔案、處理大xml檔案

Java用String 擷取方式解析xml檔案、處理大xml檔案

對於小資料返回值直接可採用Document、element的解析方式即可獲得xml節點值。

但對於返回值大於10M的資料,Document解析就顯得吃力甚至出現程式中斷情況。針對返回資料大的xml可採取Java String

分割擷取方式處理。

如下報文返回的是銀行資訊,程式需要獲得BankLocationCode、BankLocationName、BankId、AreaId節點值。

可採取如下處理方式

步驟一:壓縮檔案,把xml中的內容進行過濾替換,把空格回車都去掉,BankLocation可替換為@用於壓縮檔案,經過替換原40M的報文最終解析為9M。

步驟二:根據解析後的String 對內容進行分割處理,分割成多個list,如下為報文樣例和程式樣例

 

返回報文樣式格式

 
<Root>
<Head>
  <Version>20</Version>
  <LastVersion>0</LastVersion>
  <dataType>5</dataType>
  <TotalNum>130953</TotalNum>
  <CreateTime>2015-03-17 17:52:27</CreateTime>
</Head>
<Body>
  <BankLocation>
    <BankLocationCode>000998800006</BankLocationCode>
    <BankLocationName>電子聯行轉換中心</BankLocationName>
    <BankId>0</BankId>
    <AreaId>0</AreaId>
    <CityId>0</CityId>
    <ActionType>1</ActionType>
  </BankLocation>
  <BankLocation>
    <BankLocationCode>001612845001</BankLocationCode>
    <BankLocationName>崇左市中心支行</BankLocationName>
    <BankId>0</BankId>
    <AreaId>0</AreaId>
    <CityId>0</CityId>
    <ActionType>1</ActionType>
  </BankLocation>
</Body>
</Root>

 

package com.test;


import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;


import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;


 


public class dealXml {


/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String resultXml =   getTextFromFile2(new File("F:\\程式碼開發工作\\天安財險\\ATS-551資金系統聯行號每週兩次自動更新\\20150305_0_30_5_0\\20150305_0_30_5_0 - 副本.xml"), "utf-8");
//String resultXml =  FileUtil.getTextFromFile2(new File("F:\\程式碼開發工作\\天安財險\\ATS-551資金系統聯行號每週兩次自動更新\\DSP返回報文-20150317_0_20_5_0.xml"), "utf-8");
resultXml=resultXml.replaceAll(" ", "").replaceAll("\n", "");
resultXml=resultXml.replaceAll("\r", "");
resultXml=resultXml.replaceAll("<ActionType>1</ActionType>", "");
resultXml=resultXml.replaceAll("<BankLocation>", "@").replaceAll("</BankLocation>", "");
System.out.println(" length: "+resultXml.length());
resultXml=resultXml.replaceAll("<BankLocationCode>", "").replaceAll("</BankLocationCode>", "");
resultXml=resultXml.replaceAll("<BankLocationName>", "#").replaceAll("</BankLocationName>", "");
resultXml=resultXml.replaceAll("<BankId>", "+").replaceAll("</BankId>", "");
resultXml=resultXml.replaceAll("<AreaId>", "^").replaceAll("</AreaId>", "");
resultXml=resultXml.replaceAll("<CityId>", "*").replaceAll("</CityId>", ""); 


resultXml=resultXml.replaceAll("<Body>", "").replaceAll("</Body>", ""); 
resultXml=resultXml.replaceAll("<Root>", "").replaceAll("</Root>", ""); 
System.out.println(" length-r: "+resultXml.length());
//System.out.println(" length-r: "+resultXml);
String  alllist[] = resultXml.split("@");
 
List<String> codelist  =new ArrayList<String>();
List<String> namelist  =new ArrayList<String>();
List<String> bankidlist  =new ArrayList<String>();
List<String> areaidlist  =new ArrayList<String>();


for (int i=1  ;i< alllist.length;i++){
String code =alllist[i];
codelist.add(code.substring(0, code.indexOf("#"))) ;
if(code.indexOf("#+")>0){
namelist.add("") ;
}else{
namelist.add(code.substring(code.indexOf("#")+1, code.indexOf("+"))) ;
}
if(code.indexOf("+^")>0){
bankidlist.add("") ;
}else{
bankidlist.add(code.substring(code.indexOf("+")+1, code.indexOf("^"))) ;
}
System.out.println(" start:"+i+"code="+code);


if(code.indexOf("^*")>0){
areaidlist.add("") ;
}else{
areaidlist.add(code.substring(code.indexOf("^")+1, code.indexOf("*"))) ;
}

System.out.println(" start: "+codelist.size());
}


    public static String getTextFromFile2(File file, String encoding) {
        Reader reader = null;
        StringBuilder sb = new StringBuilder();
        try {
            //System.out.println("以字元為單位讀取檔案內容,一次讀多個位元組:");
            // 一次讀多個字元
            char[] tempchars = new char[1024];
            int charread = 0;
            reader = new InputStreamReader(new FileInputStream(file), encoding);
            // 讀入多個字元到字元陣列中,charread為一次讀取字元數
            while ((charread = reader.read(tempchars)) != -1) {
            sb.append(tempchars, 0, charread);
            }


        } catch (Exception e1) {
            e1.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                }
            }
        }
        return sb.toString();
    }


}

 

--------------------- 本文來自 土匪八號 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/fujianianhua/article/details/50480430?utm_source=copy