解析复杂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到的诗一首,很是能代表此时这十一假期的心情:

练得身形似鹤形,

千株松下两函经,

我来问道无馀说,

云在青天水在瓶!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在实际的项目中,IPhone应用程序会存在很多与服务器之间的数据交互的地方,XML是首选方案。 此包可以解决XML文件解析、对象转化为XML字符串的问题。 1 通过调用解析类,可以将XML的DATA数据转换为XmlNode对象,XmlNode以树形结构进行XML的数据封装,使用的时候按照树形结构进行数据的获取。(如有问题请留言) XmlNode结构如下: @interface XmlNode : NSObject { } @property(nonatomic,retain)NSMutableDictionary *attributes;//属性 @property(nonatomic,retain)NSMutableArray *childs;//下级子节点 @property(nonatomic,retain)NSString *name;//节点名称 @property(nonatomic,retain)NSString *value;//节点值 @property BOOL haveChilds;//是否有子节点 @property BOOL haveAttribute;//是否有属性 @property(nonatomic,retain)NSMutableString *xmlString; -(void)addAttribute:(NSDictionary *)att; -(void)addChild:(XmlNode *)node; -(NSString *)getXmlString;//将此对象装换为XML字符串 -(NSString *)getNodeValue:(NSString *)nodeName;//在此节点中根据子节点名称获得子节点值 -(NSString *)getAttributeValue:(NSString *)attName;//获得此节点的属性值 @end 2 而解析器只需要调用相应的方法,传入相应的参数即可。 -(XmlNode *)getObject:(NSString *)elName xmlData:(NSData *)xmlData;//从data中获取对象,并返回封装对象XmlNode 。 -(NSMutableArray *)getList:(NSString *)elName xmlData:(NSData *)xmlData;//从DATA中获得对象集合,集合中也是XmlNode --ps-- 花了点时间重构了之前的xml与对象的转换代码,采用了新的逻辑算法。代码更加精简,并可支持包含节点的属性转换了。 之前有人说看不懂是做什么,所以写了个小UI来进行体现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值