Emi*_*ggi 3 ruby api saxon jruby
我有这个JRuby 工作代码(从Keith的博客中窃取),它包装了SAXON xslt处理器API.
现在,我想知道我是否可以,如何在Ruby框架中包装相同的API?
请告诉我这个问题是否无意义或是否可以某种方式改进.
这是所需API的java doc参考.
这是我正在使用的JRuby代码:
require 'java'
module JXslt
include_class "javax.xml.transform.TransformerFactory"
include_class "javax.xml.transform.Transformer"
include_class "javax.xml.transform.stream.StreamSource"
include_class "javax.xml.transform.stream.StreamResult"
include_class "java.lang.System"
class XsltProcessor
def transform(xslt,infile,outfile)
transformer = @tf.newTransformer(StreamSource.new(xslt))
transformer.transform(StreamSource.new(infile), StreamResult.new(outfile))
end
end # XsltProcessor
class Saxon < XsltProcessor
TRANSFORMER_FACTORY_IMPL = "net.sf.saxon.TransformerFactoryImpl"
def initialize
System.setProperty("javax.xml.transform.TransformerFactory", TRANSFORMER_FACTORY_IMPL)
@tf = TransformerFactory.newInstance
end
end
end
Run Code Online (Sandbox Code Playgroud)
如上所述,您不能直接从Ruby运行时执行此操作,从Ruby调用Java要求您使用JRuby或使用允许您从C调用Java代码的C/C++ JVM API间接调用Java.
第一个选项可能是使用Ruby Java Bridge,它可以为您完成大部分繁重工作(它可以作为Ruby-to-C-to-Java包装器).
如果RJB不适合您,您也可以使用C语言中的JVM API直接构建包装器(此处为示例),然后您可以使用FFI从Ruby调用它.
但除非你真的需要使用C-Ruby(MRI),否则我建议你避免使用上述任何方法并使用JRuby,因为深入研究本机代码会导致可能出现段错误,内存管理问题以及所有上述选项您可以在单个线程中运行,而您可以使用JRuby构建多线程解决方案.