解析複雜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到的詩一首,很是能代表此時這十一假期的心情:

練得身形似鶴形,

千株松下兩函經,

我來問道無餘說,

雲在青天水在瓶!