解析複雜xml資源獲取目標引數值
這個是上個月工作中除錯介面的時候用到的,今天得空給簡單整理下,
需求是:從返回的xml報文中讀取IMAGENUMBER欄位(多個),取其最大值。
先擷取報文中的一部分感受下:
下面開始對報文進行解析,直接上程式碼:
/**
* @param imgResp xml資源的String格式
* @param paramName 目標引數名
* @return
*/
public int praseXmlResponse(String imgResp, String paramName) {
int amount = 0;
try {
Document doc = DocumentHelper.parseText(imgResp);
Element root = doc.getRootElement();
Iterator<Element> iter = root.elementIterator();
List<Integer> praseXMLResp = new ArrayList<>();
praseXML(iter, praseXMLResp, paramName, "string");
System.out.println("praseXMLResp: "+praseXMLResp);
if(praseXMLResp==null || praseXMLResp.isEmpty()){
return amount;
}
amount = Collections.max(praseXMLResp);
} catch (DocumentException e1) {
e1.printStackTrace();
}
return amount;
}
/**
* @param imgRespUrl xml資源路徑
* @param paramName 目標引數名
* @return
*/
public int praseXmlResponse2(String imgRespUrl, String paramName) {
int amount = 0;
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(new File(imgRespUrl));
Element root = doc.getRootElement();
Iterator<Element> iter = root.elementIterator();
List<Integer> praseXMLResp = new ArrayList<>();
praseXML(iter, praseXMLResp, paramName, "string");
System.out.println("praseXMLResp: "+praseXMLResp);
if(praseXMLResp==null || praseXMLResp.isEmpty()){
return amount;
}
amount = Collections.max(praseXMLResp);
} catch (DocumentException e) {
e.printStackTrace();
}
return amount;
}
/**
* @param iter
* @param key1 目標欄位父標籤
* @param key2 目標欄位標籤
* @return
*/
public List<Integer> praseXML(Iterator<Element> iter, List<Integer> praseXMLResp, String key1, String key2) {
if(iter==null || key1==null || key2==null){
return null;
}
while(iter.hasNext()){
Element ele = iter.next();
String eleName = ele.getName();
if(key1.equals(eleName)){
Iterator<Element> iter2 = ele.elementIterator();
while(iter2.hasNext()){
Element ele2 = iter2.next();
String eleName2 = ele2.getName();
if(key2.equals(eleName2)){
//praseXMLResp.add(ele2.getText());
praseXMLResp.add(Integer.parseInt(ele2.getText()));
}
}
}else{
Iterator<Element> iter2 = ele.elementIterator();
praseXML(iter2, praseXMLResp, key1, key2);
}
}
return praseXMLResp;
}
完了可以找個xml檔案簡單測試下:
public static void main(String[] args) {
PraseXml test = new PraseXml();
//String xmlStr = "";//資源xml檔案的String格式
String xmlStr = "src/main/resources/queryImgResp.xml";//資源xml檔案路徑
String paramName = "IMAGENUMBER";//序號
//String respNum = test.praseXmlResponse(xmlStr, paramName);
int respNum = test.praseXmlResponse2(xmlStr, paramName);
System.out.println("序號最大值: "+respNum);
}
不出意外的話,常見的xml資源基本都可以搞定,出現搞不定的情況另行谷歌百度了。
最後附上之前看劇時無意間get到的詩一首,很是能代表此時這十一假期的心情:
練得身形似鶴形,
千株松下兩函經,
我來問道無餘說,
雲在青天水在瓶!