java中xml进行报文发送和解析操作

利用OKhttp网络框架,进行Maven项目管理

//报文发送

<dependency>
 <groupId>com.squareup.okhttp3</groupId>
 <artifactId>okhttp</artifactId>
 <version>3.8.0</version>
</dependency>

//报文解析

<dependency>
 <groupId>xom</groupId>
 <artifactId>xom</artifactId>
 <version>1.2.5</version>
</dependency>

报文示例

<STUDENT>
 <AGE>18</AGE>
 <NAME>
  <XING>赵</XING>
  <MING>明玉</MING>
 </NAME>
 <NAME>
 <XING>沙</XING>
  <MING>明德</MING>
 </NAME>
</STUDENT>

报文拼接

 StringBuffer strBuff = new StringBuffer();

 strBuff.append("<STUDENT>");
 strBuff.append("<AGE>18</AGE>");
 strBuff.append("<NAME>");
 strBuff.append("<XING>赵</XING>");
 strBuff.append("<MING>明玉</MING>");
 strBuff.append("</NAME>");
 strBuff.append("<NAME>");
 strBuff.append("<XING>沙</XING>");
 strBuff.append("<MING>明德</MING>");
 strBuff.append("</NAME>");
 strBuff.append("</STUDENT>");

 String xmlStr = strBuff.toString;

报文发送,post请求接口调用,xmlStr为xml格式请求参数体

 public String postXml(String xmlStr){

 //可改变请求参数体编码GBK/UTF-8
 RequestBody body= RequestBody.create(MediaType.parse("application/xml;charset=GBK"), xmlStr);
 //url为接口地址
 Request requestOk = new Request.Builder().url("http://192.168.0.103:8007").post(body).build();
 //网络请求
 OkHttpClient client = new OkHttpClient.Builder().retryOnConnectionFailure(true).build();
 //可手动设置连接时长
 OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(60000, TimeUnit.MILLISECONDS)
   .readTimeout(60000, TimeUnit.MILLISECONDS)
   .build();
 //获取处理结果
 Response response = null;
 try {
  response = client.newCall(requestOk).execute();
 } catch (IOException e) {
  e.printStackTrace();
 }
 //获取响应
 String jsonString = response.body().string();
 return jsonString;
 }

报文解析,进行实体解析

 //STUDENT为XML最大节点
 JAXBContext context = JAXBContext.newInstance(STUDENT.class);
 Unmarshaller unmarshaller = context.createUnmarshaller();

 //jsonString为报文响应
 STUDENT student = (STUDENT)unmarshaller.unmarshal(new StringReader(jsonString));

实体类

//XmlRootElement注解是将类与XML元素进行映射,XML节点与属性大小写保持一致

@XmlRootElement(name ="STUDENT")
public class STUDENT implements Serializable {

 private String AGE;
 private List<NAME> NAME;

 public String getAGE() {
 return AGE;
 }

 public void setAGE(String AGE) {
 this.AGE = AGE;
 }

 public List<NAME> getNAME() {
 return NAME;
 }

 public void setNAME(List<NAME> NAME) {
 this.NAME = NAME;
 }

 @Override
 public String toString() {
 return "Cccc{" +
  "AGE='" + AGE + '\'' +
  ", NAME=" + NAME +
  '}';
 }
}

补充知识:Java发送内容为xml格式请求并解析返回json结果

封装成静态请求方法:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ConnectException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
 * 发送HTTP的一种方法
 * GaoLiang
 */
public class HttpSendUtil {

 public static String xmlPost(String urlStr, String xmlInfo) {
  try {
   URL url = new URL(urlStr);
   URLConnection con = url.openConnection();
   con.setDoOutput(true);
//   con.setRequestProperty("Pragma:", "no-cache");
//   con.setRequestProperty("Cache-Control", "no-cache");
   // 一定要设置报文格式,否则发送失败
   con.setRequestProperty("Content-Type", "text/xml");

   OutputStreamWriter out = null;
   try {
    out = new OutputStreamWriter(con.getOutputStream());
   } catch (ConnectException e) {
//    e.printStackTrace();
    return "Connection refused";
   }
//   System.out.println("urlStr=" + urlStr);
//   System.out.println("xmlInfo=" + xmlInfo);
   out.write(new String(xmlInfo.getBytes("ISO-8859-1")));
   out.flush();
   out.close();
   BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
   StringBuilder stringBuilder = new StringBuilder();
   String line = "";
   for (line = br.readLine(); line != null; line = br.readLine()) {
//    System.out.println(line);
    stringBuilder.append(line);
   }
   return stringBuilder.toString();
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return null;
 }

在外部调用静态方法:

// 请求的xml服务地址
String url = url;
// 请求参数 由于是手动拼写的参数很长 看起来也不美观就不放了(手动哭脸)
String param = "" ;
// 发送请求 调用上面的静态方法
String ret = xmlPost(url,param);
// 得到的是xml格式的返回结果 但是里面的“<”,“>”都是“&lt;”,“&gt;”显示 所以就需要解析,具体解析见下表
ret = ret.replaceAll("&lt;", "<");
ret = ret.replaceAll("&gt;", ">");
ret = ret.replaceAll("&amp;", "&");
ret = ret.replaceAll("&quot;", "\"");
ret = ret.replaceAll("&apos;", "\'");
// 因为接口最终要返回的是json格式 所以还要把想要的值取出来解析成String
// 解析 拿到节点里想要的值
Document document = DocumentHelper.parseText(ret);
// 根节点 这里不一定要和根节点取一样的名字 可自定义 这么写是方便理解
Element root = document.getRootElement();
// root节点下的子节点
Element business = root.element("business");

//解析完 取到business节点下的值
String healthCode = business.getStringValue();

// 拼接返回值
Map<String,Object> thisResult = new HashMap();
thisResult.put("healthCode",healthCode);
resultList.add(thisResult);

// 统一返回值
Map<String,Object> returnset = new HashMap<>();

xml解析五种格式:

补充一下:xml返回结果类似于这样

<?xml version="1.0" encoding="utf-8" ?>
<Root>
<business>我想要的值:healthCode</business >
</Root>

最后,由于时间比较匆忙,又没有接触过xml格式请求,确实折磨了我一阵子时间,搜了好多大神写的博客,最终整理出自己的。写的比较笨希望大家帮忙指点,互相学习。 奥利给,冲了!

以上这篇java中xml进行报文发送和解析操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java Stax解析XML示例

    package org.itat.stax; import java.io.IOException; import java.io.InputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.stream.E

  • java读取XML文件的四种方法总结(必看篇)

    JAVA操作XML文档主要有四种方式,分别是DOM.SAX.JDOM和DOM4J,DOM和SAX是官方提供的,而JDOM和DOM4J则是引用第三方库的,其中用的最多的是DOM4J方式.运行效率和内存使用方面最优的是SAX,但是由于SAX是基于事件的方式,所以SAX无法在编写XML的过程中对已编写内容进行修改,但对于不用进行频繁修改的需求,还是应该选择使用SAX. 下面基于这四种方式来读取XML文件. 第一,以DOM的方式实现. package xmls; import org.w3c.dom.D

  • 通过Java读取xml文件内容过程解析

    这篇文章主要介绍了通过Java读取xml文件内容过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 需要下载jar包dom4j:https://dom4j.github.io/ package com.zyb.xml; import java.io.File; import java.util.Iterator; import org.dom4j.Attribute; import org.dom4j.Document; import or

  • java中xml进行报文发送和解析操作

    利用OKhttp网络框架,进行Maven项目管理 //报文发送 <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.8.0</version> </dependency> //报文解析 <dependency> <groupId>xom</gr

  • 详解Java中JSON数据的生成与解析

    一.什么是JSON JSON: JavaScript Object Notation JS对象简谱,是一种类似于XML的语言.相比于XML,它更小.更快.更易解析.主要用于项目前端和Server的网络数据传输. 二.JSON的语法 对象 一个对象,由一个大括号表示{},{}中通过一个个的键值对来描述对象的属性 注意: 键与值之间使用冒号连接,多个键值对之间使用逗号分隔. 键值对的键,应使用引号引住(通常Java解析时,键不使用引号会报错,而JS能正确解析):键值对的值,可以是JS中的任意数据类型

  • java中幂指数值的运算代码解析

    说到幂指数的运算我们就会用到Math.pow(doublea,doubleb),返回的结果是a的b次方. 在Java中,当我们计算2的n次方时,可以直接用Math.pow来计算.非常方便. 但是,已知一个幂的结果为M和幂的底数a,现在要求幂的指数n.Math中提供的有log(double)方法,但是只能传入一个参数,即M.那么问题来了,如何简单.方便.快捷的达到我们的要求呢?答案如下: n=Math.log(M)/Math.log(a); 这个方法可以满足我们大多数幂指数的计算,但是每次访问的值

  • java中的异或问题代码解析

    java的位运算符中有一个叫异或的运算符,用符号(^)表示,其运算规则是:两个操作数的位中,相同则结果为0,不同则结果为1.下面看一个例子: public class TestXOR{ public static void main(String[] args){ int i = 15, j = 2; System.out.println("i ^ j = " + (i ^ j)); } } 运行结果是:i^j=13. 分析上面程序,i=15转成二进制是1111,j=2转成二进制是00

  • Java中数组与集合的相互转换实现解析

    这篇文章主要介绍了Java中数组与集合的相互转换实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 List转数组:采用集合的toArray()方法 数组转List:采用Arrays的asList()方法 数组转换为集合 注意:在数组转集合的过程中,要注意是否使用了视图的方式直接返回数组中的数据.以Arrays.asList()为例,它把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出 Unsu

  • Java中lombok的@Builder注解的解析与简单使用详解

    Lombok中@Builder用法 1.建造者模式简介:Builder 使用创建者模式又叫建造者模式.简单来说,就是一步步创建一个对象,它对用户屏蔽了里面构建的细节,但却可以精细地控制对象的构造过程. 2.注解类Builder.java注释: * The builder annotation creates a so-called 'builder' aspect to the class that is annotated or the class  * that contains a mem

  • 关于Java中XML Namespace 命名空间问题

    根据Namespaces in XML W3C 推荐标准的定义,XML命名空间是由国际化资源标识符 (IRI) 标识的 XML 元素和属性集合:该集合通常称作 XML"词汇". 定义 XML 命名空间的主要动机之一是在使用和重用多个词汇时避免名称冲突.XML 模式用于为 XML 实例创建一个词汇并频繁使用命名空间.因此,正确理解命名空间概念对于从总体上理解 XML 模式和实例验证至关重要. 命名空间在多个方面类似于 Java 中的程序包: Java 中的程序包可以包含许多可重用的类和接

  • Java中常用的Lambda表达式案例解析

    目录 1.ForEach 2.Collect 3.Filter 4.Map 5.MapToInt 6.Distinct 7.Sorted 8.groupingBy 9.FindFirst 10.Reduce 11.Peek 12.Limit 13.Max,Min 总结 前言: 我们日常工作中,Lambda 使用比较多的场景,就是集合类下的 Lambda 流操作,往往几行代码可以帮助我们实现复杂代码 接下来我们把 Lambda 流的常用方法用案列讲解一下. 1.ForEach 集合的遍历forEa

  • Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码

    一.读Excel 1.Excel表格示例 2.对象示例 @Data public class DemoData { private String string; private Date date; private Double doubleData; } 3.监听器(重点部分) // 有个很重要的点 DemoDataListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去 public class DemoDataListener e

  • asp.net中XML如何做增删改查操作

    一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); xml.Load(HttpContext.Current.Server.MapPath("~/file/bookstore.xml")); //指定一个节点 XmlNode root=xml.SelectSingleNode("/root"); //获取节点下所有直接

随机推荐