如何通过Java脚本API操作XML数据
我正在写一个叫做工作流引擎的东西。为此,我按照特定的XML模式为工作流创建了XML数据模型 下面是表示此数据模型的XML示例:如何通过Java脚本API操作XML数据,java,xml,Java,Xml,我正在写一个叫做工作流引擎的东西。为此,我按照特定的XML模式为工作流创建了XML数据模型 下面是表示此数据模型的XML示例: <dm:agentModel xmlns:dm="ProcessObjects" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ProcessObjects agentModel.xsd"> <dm:cfp isList="false" obj
<dm:agentModel xmlns:dm="ProcessObjects" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="ProcessObjects agentModel.xsd">
<dm:cfp isList="false" objName="myCFP"></dm:cfp>
<dm:proposal isList="true" objName="receivedProposals"></dm:proposal>
<dm:feedbackList objName="cfpFeedbacks">
<dm:item>
<dm:to>Andrew</dm:to>
<dm:from>Paul</dm:from>
<dm:heading>That is bad</dm:heading>
<dm:body>Fix points a, b and c, please.</dm:body>
</dm:item>
<dm:item>
<dm:to>Frank</dm:to>
<dm:from>Paul</dm:from>
<dm:heading>Very good!</dm:heading>
<dm:body>I see no drawbacks. You can also ask Matthew for additional feedback.</dm:body>
</dm:item>
</dm:feedbackList>
</dm:agentModel>
为了运行用户编写的脚本,我尝试使用Java脚本API
/*Java code*/
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
//binding object
engine.put("agentModel", agentModel);
String script = "var i = 0;"
+ "println(agentModel.getValue(\"cfpFeedbacks[\" + i + \"].from\"));";
engine.eval(script);
这或多或少是可行的。我想做的是这样的工作:
/*Java code*/
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
//binding object
engine.put("agentModel", agentModel);
String script = "var i = 0;"
+ "println(agentModel.cfpFeedbacks[i].from);";
/**
* any magic operations here
*/
engine.eval(script);
目标是为最终用户编写脚本提供尽可能简单的界面
我有点迷路了,如果有什么灵感,我将不胜感激。就我个人而言,我考虑了三种情况:
- 创建JavaBean样式的类,并编译它们,而不是处理XML
- 从第二种形式解析脚本字符串到第一种形式(这似乎是最简单的,但时间昂贵,而且肯定不是“干净的”)
- 为对象开发某种神奇的接口,其中调用
是调用object.field
object.getValue(“field”)
注:若我的描述不清楚,或者你们觉得值得提供更多的源代码,我会立即澄清这个问题。完成这项工作是我现在的首要任务。最好的方法是将xml反序列化为java对象,然后将结果放入引擎 您可以直接操作通过
引擎放置的对象。放置(..)
方法
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("a", 1);
engine.put("b", 5);
engine.eval("a = 2;");
Object result = engine.eval("c = a + b;");
System.out.println("a + b = " + result);
最后从脚本引擎中获取对象并将对象序列化为xml,这将非常有用
/*Java code*/
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
//binding object
engine.put("agentModel", agentModel);
String script = "var i = 0;"
+ "println(agentModel.cfpFeedbacks[i].from);";
/**
* any magic operations here
*/
engine.eval(script);
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
engine.put("a", 1);
engine.put("b", 5);
engine.eval("a = 2;");
Object result = engine.eval("c = a + b;");
System.out.println("a + b = " + result);