接收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这样的数据,在网上查了很多,然后写了这样一个解析工具方法。因为时间有点短,所以有很多地方需要写的有点模糊,命名也不太规范。

原文地址:https://www.cnblogs.com/sunshine-2018/p/10156669.html