如何通过Java脚本API操作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

我正在写一个叫做工作流引擎的东西。为此,我按照特定的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" 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);