xml报文解析和组装
package com.xjts.cipher.util;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONType;
import com.xjts.model.XmlEngine;
public class XmlGen {
/*****************************
* 组装请求xml串
* list 数据库中配置的报文头,报文体
* map 请求参数
*****************************/
public static String assembleRequestXml(List<XmlEngine> list, Map<String, String> map) {
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("message");
Element head = root.addElement("head");
Set<Map.Entry<String, String>> itermap = map.entrySet();
for(Map.Entry<String, String> entry: itermap){
String key = entry.getKey();
String value = entry.getValue();
for(int i = 0; i < list.size(); i++ ){
if(key.equals(list.get(i).getName().substring(10))){
list.get(i).setDefaultvalue(value);
}
}
}
for(int i = 0; i < list.size(); i++){
if("head".equals(list.get(i).getName().substring(0, 4))){
Element field = head.addElement("field");
field.addAttribute("name",
list.get(i).getName().substring(10));
String str = list.get(i).getDefaultvalue();
if (null != str && !"".equals(str)){
field.addAttribute("name",
list.get(i).getName().substring(10))
.setText(str);
}
}
}
Element body = root.addElement("body");
for(int i = 0; i < list.size(); i++){
if("body".equals(list.get(i).getName().substring(0, 4))){
Element field = body.addElement("field");
field.addAttribute("name",
list.get(i).getName().substring(10));
String str = list.get(i).getDefaultvalue();
if (null != str && !"".equals(str)){
field.addAttribute("name",
list.get(i).getName().substring(10))
.setText(str);
}
}
}
OutputFormat format = OutputFormat.createPrettyPrint();
//.createCompactFormat(); //createPrettyPrint() 输出格式化
format.setEncoding("gb2312");
StringWriter writer = new StringWriter();
XMLWriter output = new XMLWriter(writer, format);
try {
output.write(doc);
writer.close();
output.close();
// System.out.println(writer.toString());
} catch (IOException e) {
e.printStackTrace();
return null;
}
String content=writer.toString();
StringBuilder sb = new StringBuilder();
sb.append(content);
//加入 standalone="yes"
// sb.insert(37, " standalone=\"yes\"");
return sb.toString();
}
/***********************************************
* 组装响应xml串
* list xml中head和body内的标签
* map xml中head和body内的标签的key-value
* listDetail 应答报文的明细数据,记录
***********************************************/
public static String assembleResponseXml(List<XmlEngine> list, Map<String, String> map
, List<Map<String, String>> listDetail){
Document doc = DocumentHelper.createDocument();
Element root = doc.addElement("message");
Element head = root.addElement("head");
Set<Map.Entry<String, String>> itermap = map.entrySet();
for(Map.Entry<String, String> entry: itermap){
String key = entry.getKey();
String value = entry.getValue();
for(int i = 0; i < list.size(); i++ ){
if(key.equals(list.get(i).getName().substring(10))){
list.get(i).setDefaultvalue(value);
}
}
}
for(int i = 0; i < list.size(); i++){
if("head".equals(list.get(i).getName().substring(0, 4))){
Element field = head.addElement("field");
field.addAttribute("pin",
"false");
field.addAttribute("name",
list.get(i).getName().substring(10));
String str = list.get(i).getDefaultvalue();
if (null != str && !"".equals(str)){
field.addAttribute("name",
list.get(i).getName().substring(10))
.addCDATA(str);
}else{
field.addAttribute("name",
list.get(i).getName().substring(10))
.addCDATA("");
}
}
}
Element body = root.addElement("body");
for(int i = 0; i < list.size(); i++){
if("body".equals(list.get(i).getName().substring(0, 4))){
Element field = body.addElement("field");
field.addAttribute("pin",
"false");
field.addAttribute("name",
list.get(i).getName().substring(10));
String str = list.get(i).getDefaultvalue();
if (null != str && !"".equals(str)){
field.addAttribute("name",
list.get(i).getName().substring(10))
.addCDATA(str);
}
}
}
if(listDetail != null){
if(listDetail.size() != 0){
Element field1 = body.addElement("field-list");
field1.addAttribute("name",
"ARRAY_" + list.get(0).getName().substring(4, 10));
for(int i = 0; i < listDetail.size(); i++){
Element field2 = field1.addElement("field-list");
field2.addAttribute("name",
"" + i);
Set<Map.Entry<String, String>> itermap1 = listDetail.get(i).entrySet();
for(Map.Entry<String, String> entry: itermap1){
String key = entry.getKey();
String value = entry.getValue();
Element field3 = field2.addElement("field");
field3.addAttribute("pin",
"false");
field3.addAttribute("name",
key).addCDATA(value);;
}
}
}
}
OutputFormat format = OutputFormat.createPrettyPrint();
//createCompactFormat(); //createPrettyPrint() 格式化
format.setEncoding("gb2312");
StringWriter writer = new StringWriter();
XMLWriter output = new XMLWriter(writer, format);
try {
output.write(doc);
writer.close();
output.close();
// System.out.println(writer.toString());
} catch (IOException e) {
e.printStackTrace();
return null;
}
return writer.toString();
}
/********************************************
* 针对List<Map<String, String>>类型的对象
* 转为Json串,此方法和 parseXmlStr(String xml)
* 有关联
********************************************/
public static String listMap2Json(List<Map<String, String>> listMap){
if(listMap == null) return "null";
String jsonXmlStr = JSON.toJSONString(listMap);
String[] splitStr = jsonXmlStr.split("\\{\"\\d{1,2}\":\"\"\\}");
String retStr = splitStr[0];
for(int i = 1; i < splitStr.length; i++){
retStr += splitStr[i].replaceAll("\\},\\{", ",").substring(1);
}
return retStr;
}
/*****************************
* 解析xml串,返回Map对象
*****************************/
public static List<Map<String, String>> parseXmlStr(String xml) throws Exception {
//final SAXReader sax = new SAXReader();// 创建一个SAXReader对象
//final File xmlFile = new File("E:\\req_message.xml");// 根据指定的路径创建file对象
//final Document document = sax.read(xmlFile);// 获取document对象,如果文档无节点,则会抛出Exception提前结束
Document document = DocumentHelper.parseText(xml);
final Element root = document.getRootElement();// 获取根节点
List<Map<String, String>> listMap = new ArrayList<Map<String, String>>();
getNodes(root, listMap);// 从根节点开始遍历所有节点
return listMap;
}
/**
* 从指定节点Element node开始,递归遍历其所有子节点
*/
public static void getNodes(final Element node, List<Map<String,String>> listMap) {
//System.out.println("-------开始新节点-------------");
String str = node.getTextTrim();
// 当前节点的名称、文本内容和属性
//System.out.println("当前节点名称:" + node.getName());// 当前节点名称
//System.out.println("当前节点的内容:" + node.getTextTrim());// 当前节点内容
final List<Attribute> listAttr = node.attributes();// 当前节点的所有属性
for (final Attribute attr : listAttr) {// 遍历当前节点的所有属性
final String name = attr.getName();// 属性名称
final String value = attr.getValue();// 属性的值
//System.out.println("属性名称:" + name + "---->属性值:" + value);
if ("name".equals(name)) {
Map map = new LinkedHashMap();
map.put(value, str);
listMap.add( map);
}
}
// 递归遍历当前节点所有的子节点
final List<Element> listElement = node.elements();// 所有一级子节点的list
for (final Element e : listElement) {// 遍历所有一级子节点
getNodes(e, listMap);// 递归
}
}
/**
* 从指定节点Element node开始,递归遍历其所有子节点
*/
public static void getNodes(final Element node, Map map) {
String str = node.getTextTrim();
final List<Attribute> listAttr = node.attributes();
for (final Attribute attr : listAttr) {
final String name = attr.getName();
final String value = attr.getValue();
if (null != name && !"".equals(str)) {
if ("name".equals(name)) {
map.put(value, str);
}
}
}
final List<Element> listElement = node.elements();
for (final Element e : listElement) {
getNodes(e, map);//递归调用
}
}
public void saveDocument(Document document, File outputXml){
try {
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter output = new XMLWriter(new FileWriter(outputXml),
format);
output.write(document);
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String [] argv){
XmlGen dom4j = new XmlGen();
Document document = null;
dom4j.saveDocument(document, new File("output.xml"));
//System.out.println(assembleResponseXml(null, null));
}
public class StandaloneWriter extends XMLWriter {
protected void writeDeclaration() throws IOException {
OutputFormat format = getOutputFormat();
String encoding = format.getEncoding();
if (!format.isSuppressDeclaration()) {
writer.write("<?xml version=\"1.0\"");
if (!format.isOmitEncoding()) {
if (encoding.equals("UTF8"))
writer.write(" encoding=\"UTF-8\"");
else
writer.write(" encoding=\"" + encoding + "\"");
}
writer.write(" standalone=\"true\"");
writer.write("?>");
if (format.isNewLineAfterDeclaration()) { println(); }
}
}
}
}
xml报文解析和组装的更多相关文章
- SOAP XML报文解析
import java.util.HashMap;import java.util.List;import java.util.Map; import org.dom4j.Document;impor ...
- dom4j组装xml 以及解析xml
dom4j组装xml 以及解析xml: 1.下载dom4j的jar包,地址:https://dom4j.github.io/ 2.java代码: package test; import java.i ...
- Java开发笔记(一百零九)XML报文的定义和解析
前面介绍了JSON格式的报文解析,虽然json串短小精悍,也能有效表达层次结构,但是每个元素只能找到对应的元素值,不能体现更丰富的样式特征.比如某个元素除了要传输它的字符串文本,还想传输该文本的类型. ...
- java 写webservice接口解析xml报文
1 <!--解析xml报文--> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId& ...
- xml报文的装配解析
xstream dom 将map自动转化为xml报文 http://blog.csdn.net/lisheng19870305/article/details/45847985 报文的通信
- 解析xml报文,xml与map互转
这段时间写了一个关于xml报文的工具类,做一下具体的讲解: xml文本 <NTMMessage version="1.03"> <NTMHeader> &l ...
- ISO8583报文解析
在此只写了一个8583报文的拆包,组包其实也差不多的. 不多说直接上文件, 具体思路过程,在解析类里面写的有. 其中包含了四个文件 8583resp.txt报文 ISO8583medata配置文件 B ...
- 报文解析及CRC类
/// <summary> /// 报文解析转换类 /// </summary> public class DatagramConvert { public static En ...
- 通过正则表达式实现简单xml文件解析
这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...
随机推荐
- Linux搭建nfs服务器
使用linux进行嵌入式开发的时候,为了方便开发,通常是将开发板挂载到宿主机的文件系统上,然后将代码放到共享给开发板的目录中,再通过开发板运行. 首先查看是否安装了 nfs 软件包,yum list ...
- 数据绑定控件之Repeater
引言 前几篇的文章在说AJAX的内容,利用AJAX技术能够开发出高效运行的网站应用程序,不过在进行B/S项目开发时只拥有AJAX技术是远远不够的,踏入到B/S要学的东西会更多,但相较C/S的复杂逻辑结 ...
- Innodb 表空间传输迁移数据
在mysql5.5之前,mysql实例中innodb引擎表的迁移是个头疼的问题,要么使用mysqldump导出,要么使用物理备份的方法,但是在mysql5.6之后的版本中,可以使用一个新特性,方便地迁 ...
- MOCK DATA -- node路由
前后端分离,有时候后端接口给的不是很及时,这就需要前端自己mock data, 本文讲的简单的node模拟数据 api路由跳转 首先有个data.js(json)文件, 路由: 配置在dev-serv ...
- bzoj3223 文艺平衡树
传送门 :http://www.lydsy.com/JudgeOnline/problem.php?id=3223 splay区间翻转的基础题,然而我还是调了一晚上(蒟蒻的悲哀) #include & ...
- jdbc连接mysql
package june25jdbcTest; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Res ...
- 挑战程序2.1.4 穷竭搜索>>深度优先搜索
深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386 思路:(⊙v⊙)嗯 和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 ...
- 零配置简单搭建SpringMVC 项目
SpringMVC是比较常用的JavaWeb框架,非常轻便强悍,能简化Web开发,大大提高开发效率,在各种Web程序中广泛应用.本文采用Java Config的方式搭建SpringMVC项目,并对Sp ...
- spring-listener&spring-task注解版本
1.spring-listener: a) import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextLi ...
- 【转】T-SQL查询进阶—理解SQL Server中的锁
简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于大多数数据库来说是需要同时处理多个查 ...