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