使用java的script引擎动态转换填充xml
近日,在做一个功能:根据xml模板动态填充数据生成xml,而xml的节点值或属性值,可能会动态根据需求而转换。
我想到了使用java的script引擎来做.
客户的需求文档其中:
Grain 表示纹理, 纹理 0=无;1=竖纹;2=横纹(影响排版时的旋转角度)
xml模板
code="${code}"
name="${name}"
Grain="${javascript:textureDir;if(textureDir=='vertical'){ '1';}else if(textureDir=='horizontal'){'2';}else{ '0';}}"
/>
然后写个测试script引擎的Test
package com.test;
import javax.script.*;
import java.util.HashMap;
import java.util.Map;
/**
* 测试java的javascript引擎
* @Project
* @Package com.test
* @FileName TestScriptEngine.java
* @ClassName TestScriptEngine
* @author ygw
* @date 2020/11/5 11:54
* @Description
*
*/
public class TestScriptEngine {
public static void main(String[] args) throws ScriptException {
//textureDir纹理:vertical=竖纹;horizontal=横纹;空值=无
Map partMap = new HashMap<>();
partMap.put("code", "20201105001");
partMap.put("name", "左侧板");
partMap.put("textureDir", "vertical");
ScriptEngine scriptEngine = new ScriptEngineManager().getEngineByName("Nashorn");
//String s = "${javascript:textureDir;var r = ''; if(textureDir=='vertical'){ r = '1';}else if(textureDir=='horizontal'){r = '2';}else{r = '0';}; r }";
String xmlValue = "${javascript:textureDir;if(textureDir=='vertical'){ '1';}else if(textureDir=='horizontal'){'2';}else{ '0';}}";
xmlValue = xmlValue.substring(2, xmlValue.length()-1);
System.out.println("xmlValue=" + xmlValue);
String paramsStr = xmlValue.substring(xmlValue.indexOf(":")+1, xmlValue.indexOf(";"));
String script = xmlValue.substring(xmlValue.indexOf(";")+1);
System.out.println("params=" + paramsStr);
System.out.println("script=" + script);
Bindings bindings = new SimpleBindings();
String[] params = paramsStr.split(",");
for(String param: params){
bindings.put(param, partMap.get(param));
}
String result = (String) scriptEngine.eval(script, bindings);
System.out.println("Grain=" + result);
}
}
运行结果
xmlValue=javascript:textureDir;if(textureDir=='vertical'){ '1';}else if(textureDir=='horizontal'){'2';}else{ '0';}
params=textureDir
script=if(textureDir=='vertical'){ '1';}else if(textureDir=='horizontal'){'2';}else{ '0';}
Grain=1
[0x7FFB5A1E77A0] ANOMALY: meaningless REX prefix used
Process finished with exit code 0