这个是上个月工作中调试接口的时候用到的,今天得空给简单整理下,
需求是:从返回的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到的诗一首,很是能代表此时这十一假期的心情:
练得身形似鹤形,
千株松下两函经,
我来问道无馀说,
云在青天水在瓶!