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报文解析和组装的更多相关文章

  1. SOAP XML报文解析

    import java.util.HashMap;import java.util.List;import java.util.Map; import org.dom4j.Document;impor ...

  2. dom4j组装xml 以及解析xml

    dom4j组装xml 以及解析xml: 1.下载dom4j的jar包,地址:https://dom4j.github.io/ 2.java代码: package test; import java.i ...

  3. Java开发笔记(一百零九)XML报文的定义和解析

    前面介绍了JSON格式的报文解析,虽然json串短小精悍,也能有效表达层次结构,但是每个元素只能找到对应的元素值,不能体现更丰富的样式特征.比如某个元素除了要传输它的字符串文本,还想传输该文本的类型. ...

  4. java 写webservice接口解析xml报文

    1 <!--解析xml报文--> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId& ...

  5. xml报文的装配解析

    xstream dom 将map自动转化为xml报文 http://blog.csdn.net/lisheng19870305/article/details/45847985 报文的通信

  6. 解析xml报文,xml与map互转

    这段时间写了一个关于xml报文的工具类,做一下具体的讲解: xml文本 <NTMMessage version="1.03"> <NTMHeader> &l ...

  7. ISO8583报文解析

    在此只写了一个8583报文的拆包,组包其实也差不多的. 不多说直接上文件, 具体思路过程,在解析类里面写的有. 其中包含了四个文件 8583resp.txt报文 ISO8583medata配置文件 B ...

  8. 报文解析及CRC类

    /// <summary> /// 报文解析转换类 /// </summary> public class DatagramConvert { public static En ...

  9. 通过正则表达式实现简单xml文件解析

    这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...

随机推荐

  1. unresolved inclusion in the java header in JNI

    eclipse的ndk开发环境建差不多后打开jni的samples里的hello-jni项目.添加native和运行都没有问题,但是打开hello-jni.c看到一片红: 光这一个文件牵涉的问题有下面 ...

  2. newtonsoft.json 序列化,反序列化

    public class Book { public string BookID { get; set; } public DateTime PublishDate { get; set; } pub ...

  3. 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)

    控制反转和依赖注入 控制反转和依赖注入是两个密不可分的方法用来分离你应用程序中的依赖性.控制反转Inversion of Control (IoC) 意味着一个对象不会新创建一个对象并依赖着它来完成工 ...

  4. javascript 创建 div

        纯JAVASCRIPPT创建 (1):document.getElementById("要创建DIV位置的ID").innerHTML='<div>div里面的 ...

  5. linux下TCP/IP及内核参数优化调优(转)

    Linux下TCP/IP及内核参数优化有多种方式,参数配置得当可以大大提高系统的性能,也可以根据特定场景进行专门的优化,如TIME_WAIT过高,DDOS攻击等等. 如下配置是写在sysctl.con ...

  6. List view优化

    ListView 针对每个item,要求 adapter "返回一个视图" (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据 ...

  7. Java 导入Excel文件到数据库

    原文:http://www.jb51.net/article/44021.htm 项目中要求读取excel文件内容,并将其转化为xml格式.常见读取excel文档一般使用POI和JExcelAPI这两 ...

  8. winfrom 文字滚动

    winfrom 文字滚动 http://www.codeproject.com/Articles/6913/Creating-a-professional-looking-GDI-drawn-cust ...

  9. [OSG][osgEarth]osgEarth例子程序简介

    1.osgearth_graticule:生成经纬线. 2.osgearth_annotation:各类标注(点.线.面.模型.文本等). 3.osgearth_city:加载一个城市三维模型,可以浏 ...

  10. asp.net调用客户端WebBrowser 进行网站地址截屏

    在asp.net网站中,如果要实现,在文本框中输入一个URL地址,就把该网页的页面整屏截下来,这段时间一直在研究这一块,在网上查了好多资料.自己又整合了一下. 其实也不是想象中的那么难.主要是通过调用 ...