XML和POJO互相转换

XML转换成JAVA

1、XML文件

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<process displayName="文件审批" name="fileOADecision">
    <start displayName="start1" layout="31,567,-1,-1" name="start1">
        <transition g="" name="transition1" offset="0,0" to="task1"/>
    </start>
    <task assignee="applicant" autoExecute="Y" displayName="发起申请" layout="152,563,108,52" name="task1" performType="ANY" taskType="Major">
        <transition g="" name="transition2" offset="0,0" to="task2"/>
    </task>
    <task assignee="applicant_leader" autoExecute="Y" displayName="发起人部门长审批" layout="326,694,186,52" name="task2" performType="ALL" taskType="Major">
        <transition g="" name="transition3" offset="0,0" to="decision1"/>
    </task>
    <task assignee="compliance_leader" autoExecute="Y" displayName="合规部门长审批" layout="571,696,163,52" name="task3" performType="ALL" taskType="Major">
        <transition g="" name="transition6" offset="0,0" to="decision3"/>
    </task>
    <task assignee="compliance" autoExecute="Y" displayName="合规人员审批" layout="804,697,157,52" name="task4" performType="ALL" taskType="Major">
        <transition g="" name="transition9" offset="0,0" to="decision2"/>
    </task>
    <end displayName="end1" layout="1032,552,-1,-1" name="end1"/>
    <decision displayName="decision1" expr="#agree?'transition5':'transition4'" layout="397,558,-1,-1" name="decision1">
        <transition g="" name="transition4" offset="0,0" to="task1"/>
        <transition g="" name="transition5" offset="0,0" to="task3"/>
    </decision>
    <decision displayName="decision3" expr="#agree?'transition8':'transition7'" layout="621,560,-1,-1" name="decision3">
        <transition g="" name="transition7" offset="0,0" to="task2"/>
        <transition g="" name="transition8" offset="0,0" to="task4"/>
    </decision>
    <decision displayName="decision2" expr="#agree?'transition11':'transition10'" layout="859,555,-1,-1" name="decision2">
        <transition g="" name="transition10" offset="0,0" to="task3"/>
        <transition g="" name="transition11" offset="0,0" to="end1"/>
    </decision>
</process>

2、Bean

@Data
//根元素
@XmlRootElement(name = "task")
//访问类型,通过字段
@XmlAccessorType(XmlAccessType.FIELD)
public class ProcessTaskDTO {

	@XmlAttribute(name = "displayName")
	private String displayName;
	
	@XmlAttribute(name = "name")
	private String name;
	
	@XmlAttribute(name = "assignee")
	private String assignee;
}

3、BeanList

@Data
@XmlRootElement(name = "process")
@XmlAccessorType(XmlAccessType.FIELD)
public class ProcessTaskListDTO {

	 @XmlElement(name = "task")
	 private List<ProcessTaskDTO> processTasks;
}

PS: @XmlElement节点,@XmlAttribute属性,@XmlRootElement根标签
4、将XML转为指定的POJO的转换工具类

public class XmlBuilder {
	/**
     * JAXB将XML转为指定的POJO
     *
     * @param clazz
     * @param xml
     * @return
     */
    public static Object JAXB_XmlToBean(Class<?> clazz, String xml) {
        try {
            Object xmlObject;
            Reader reader;
            JAXBContext context = JAXBContext.newInstance(clazz);
            // XML 转为对象的接口
            Unmarshaller unmarshaller = context.createUnmarshaller();
            reader = new StringReader(xml);
            //以文件流的方式传入这个string
            xmlObject = unmarshaller.unmarshal(reader);
            reader.close();
            return xmlObject;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

4、Service

public ProcessTaskListDTO getBasicTrace(String processId) {
		StringBuilder xml = new StringBuilder();
        ByteArrayInputStream in = null;
        try {
        	Process process = getEngine().process().getProcessById(processId);
        	String startNoteName = process.getModel().getStart().getOutputs().get(0).getTarget().getName();
        	List<HistoryTask> starts = engine.query().getHistoryTasks(new QueryFilter().setName(startNoteName)
        			.orderBy("create_time").order(QueryFilter.ASC));
        	if(EmptyUtil.isEmpty(starts)) {
        		throw new ServiceException("找不到发起节点信息");
        	}
        	// 找到原始节点的审批人
      	Map<String, Object> operatorMap = starts.get(0).getVariableMap();
        	byte[] dbContent = process.getDBContent();
            in =  new ByteArrayInputStream(dbContent);
            // 将流转换为字符串
            byte[] b = new byte[4096];
            for (int n; (n = in.read(b)) != -1; ) {
                xml.append(new String(b, 0, n, StandardCharsets.UTF_8));
            }
            // XML转为Java对象
            ProcessTaskListDTO processTaskList = (ProcessTaskListDTO) XmlBuilder.JAXB_XmlToBean(ProcessTaskListDTO.class, xml.toString());
            return processTaskList;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        	try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
        }
        return null;
	}
}

5、结果

{
    "message": "ok",
    "result": {
        "processTasks": [
            {
                "assignee": "applicant",
                "displayName": "发起申请",
                "name": "task1"
            },
            {
                "assignee": "applicant_leader",
                "displayName": "发起人部门长审批",
                "name": "task2"
            },
            {
                "assignee": "compliance_leader",
                "displayName": "合规部门长审批",
                "name": "task3"
            }
      ]
    },
    "status": 0
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值