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
}