第一次写博客,有什么需要修改的地方,劳烦大家留言,告知我一下,谢谢大家。
先说一下需求:客户方采用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这样的数据,在网上查了很多,然后写了这样一个解析工具方法。因为时间有点短,所以有很多地方需要写的有点模糊,命名也不太规范。