• 接收xml信息并对xml信息进行分析


    第一次写博客,有什么需要修改的地方,劳烦大家留言,告知我一下,谢谢大家。


    先说一下需求:客户方采用Retry机制,将他们那边修改的信息推送给我们,我们需要写一个接口,接收他们的信息并进行处理。

    客户那一端采用HTTP Post方式以XML格式将数据推送给我们。

    接收xml信息

    首先,客户端将xml传递给我们的时候,我们通过流的方式将xml获取到。

        //创建请求
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
            HttpServletRequest request = requestAttributes.getRequest();
            BufferedReader in = null;
            try {
                in = request.getReader();
            } catch (IOException e) {
                e.printStackTrace();
            }
            String line;
            try {
                String str = new String();
                while ((line = in.readLine()) != null) {//获得xml格式的字符串
                    str = str + line;
                }catch (Exception e) {
                e.printStackTrace();
            }

    这时,通过request请求就将对方需要传给你的信息获取到了。

    对xml信息进行解析

    当从对方哪里拿到了数据以后,你就需要对数据进行分析了。

    第一步:先将xml转化为Document

    Document是一个接口,将String转化为document可以看作是将String转化成一个HTML 或 XML 文档,只有这样才能对他进行操作。

    将String转化成document有很多方法,有DOM方法,SAX方法,JDOM方法,DOM4J。这些方法都可以将String转化成Document,如何转化请大家自行查阅网上的各种方法的具体实现。

    下面是我转化的方法

        xmlStr.replaceAll("\s", "");
        try{
                InputSource is = new InputSource(new StringReader(xmlStr));//xmlStr就是需要转化的字符串
                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder=factory.newDocumentBuilder();
                Document doc = builder.parse(is);
                return doc;
            }catch(Exception e){
                e.printStackTrace();
            }
            return null;

    第二步:对文档树各个节点进行分析,将xml里面的信息放入一个map中

    
    
    Map<String,Object> map = new LinkedHashMap();

    if(null != document){
         NodeList xmlList = document.getElementsByTagName("GDSPublisherRequest");//这里的"GDSPublisherRequest"是xml的根节点可以根据自己的xml文件修改
       map = nodeToMap(map, xmlList);
    }

    nodeToMap()方法:

    public static Map nodeToMap(Map map,NodeList nodeList){
            NodeList GDSPublisherRequest = nodeList;//得到子节点
            for(int i =0; i<GDSPublisherRequest.getLength(); i++) {//对子节点进行遍历
                Node GDSPublisher = GDSPublisherRequest.item(i);
                NamedNodeMap GDSPublisherRequestmap = GDSPublisher.getAttributes();
                Map<String,Object> map2 = new LinkedHashMap();
                if (GDSPublisherRequestmap != null){//获得节点的属性,并放入map中
                    for (int j = 0; j < GDSPublisherRequestmap.getLength(); j++) {
                        Node node = GDSPublisherRequestmap.item(j);
                        map2.put(node.getNodeName() + j, node.getNodeValue());
                    }
                }
                map.put(GDSPublisher.getNodeName(),map2);
                Map<String,Object> map3 = new LinkedHashMap();
                for(int t = 0; t<GDSPublisherRequest.getLength(); t++){//获得节点的值,并放入map中
                        Node node = GDSPublisherRequest.item(t);
                        map3.put(node.getNodeName() + t, node.getNodeValue());
                }
                map.put(GDSPublisher.getNodeName() + "-value",map3);
                nodeToMap(map, GDSPublisher.getChildNodes());
            }
            return map;
        }

    然后通过map的键((node.getNodeName()也就是你的节点名字)得到里面的数据,再然后就是你对这些数据的操作了!

    这里有个坑需要注意一下:

    在转化document之前一定要对字符串进行处理,去除多余的空格,回车,换行。因为在对节点进行遍历的时候,换行和回车等字符也会看成一个节点,这个时候就容易报空指针异常。所以需要加一个

    str.replaceAll("\s", "");

    上面就是xml的接收和解析了。第一次接触接收xml这样的数据,在网上查了很多,然后写了这样一个解析工具方法。因为时间有点短,所以有很多地方需要写的有点模糊,命名也不太规范。

  • 相关阅读:
    缓存架构设计细节二三事
    啥,又要为表增加一列属性?
    SpringMvc4.x---快捷的ViewController
    SpringMvc4.x--@ControllerAdvice注解
    SpringMvc4.x--Spring MVC的常用注解
    解决svn--Unable to connect to a repository at URL ‘https://xxxxxx’ 问题
    或许你不知道的10条SQL技巧
    Java 基础-运算符
    Java 运算符 % 和 /
    Java基础-注释
  • 原文地址:https://www.cnblogs.com/sunshine-2018/p/10156669.html
Copyright © 2020-2023  润新知