通过Groovy在Java中进行XML解析
发布时间:2020-12-14 16:28:39 所属栏目:大数据 来源:网络整理
导读:我正在尝试使用Groovy和 Java的ScriptEngine API来解析XML. 下面的代码正是如此,但我想知道是否有更好的方法来做同样的事情.还有与此相关的性能影响吗? import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import javax.script.Inv
我正在尝试使用Groovy和
Java的ScriptEngine API来解析XML.
下面的代码正是如此,但我想知道是否有更好的方法来做同样的事情.还有与此相关的性能影响吗? import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; /* <books> <book id="1"> <name>"Catcher In the Rye"</name> <author>J.D. Salinger</author> </book> <book id="2"> <name>"KiteRunner"</name> <author>Khaled Hosseini</author> </book> </books> */ public class XMLParsing{ public static void main(String[] args) { Map<String,ArrayList<String>> resultMap = new HashMap<String,ArrayList<String>>(); resultMap = getBookDetails("c:tempbook.xml"); System.out.println(resultMap); } public static Map<String ArrayList<String>> getBookDetails(String scriptXml) { Map<String,ArrayList<String>> resultMap = new HashMap<String,ArrayList<String>>(); ScriptEngineManager factory = new ScriptEngineManager(); ScriptEngine engine = factory.getEngineByName("groovy"); String fact = "import java.util.HashMap;" + "import java.util.ArrayList;" + "def getBookInformation(n){" + "def map1 = new HashMap();" + "xmlDesc = new XmlSlurper().parse(n);" + "xmlDesc.book.findAll{it}.each {" + "def list1 = new ArrayList();" + "def id = it.@id;" + //"println id;"+ "def name = it.name;" + "def author = it.author;" + "list1.add(name);" + "list1.add(author);" + "map1.put(id,list1);" + "};" + "return map1;}"; try { engine.eval(fact); Invocable inv = (Invocable) engine; Object[] params = {scriptXml}; resultMap = (Map<String,ArrayList<String>>) inv.invokeFunction("getBookInformation",params); } catch (ScriptException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return resultMap; } } 输出: {1=["Catcher In the Rye",J.D. Salinger],2=["KiteRunner",Khaled Hosseini]} 解决方法
你的Groovy脚本可能是“groovy-er”……
这也是一样的: String fact = "def getBookInformation(n) {" + " xmlDesc = new XmlSlurper().parse(n)n" + " xmlDesc.book.findAll().collectEntries {n"+ " [ (it.@id):[ it.name,it.author ] ]n" + " }n" + "}" ; 实际上,您可以使用GroovyShell而不是JVM脚本引擎,这可以帮助您: import java.util.ArrayList; import java.util.Map; import groovy.lang.Binding ; import groovy.lang.GroovyShell ; public class XMLParsing { public static void main(String[] args) { Map<String,ArrayList<String>> resultMap = getBookDetails("test.xml"); System.out.println(resultMap); } public static Map<String,ArrayList<String>> getBookDetails( String scriptXml ) { Binding b = new Binding() ; b.setVariable( "xmlFile",scriptXml ) ; GroovyShell shell = new GroovyShell( b ) ; Object ret = shell.evaluate( "new XmlSlurper().parse( xmlFile ).book.findAll().collectEntries { [ (it.@id):[ it.name,it.author ] ] }" ) ; return (Map<String,ArrayList<String>>)ret ; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |