如何设置javax.xml.transform.TransformerFactory系统属性

5
我正在使用javax.xml.transform.Transform将XML文件转换为PDF。这在单独使用时很好,但项目的某些部分正在使用Xalan,它实现了自己的TransformerFactory,其中某些内容无法处理Cyrillic。
我在https://xml.apache.org/xalan-j/usagepatterns.html上发现了一个属性,用于定义所使用的工厂:
TransformerFactory是一个抽象类,具有静态newInstance()方法,该方法实例化由javax.xml.transform.TransformerFactory系统属性指定的具体子类。 此系统属性的默认设置为org.apache.xalan.processor.TransformerFactoryImpl。
我的问题是:如何设置此属性以不使用Xalan?
2个回答

2

尝试将其设置为Java参数-Djavax.xml.transform.TransformerFactory=<factory class>

您还可以在程序中直接实例化所需的工厂,如TransformerFactory tf = new SomeTransformerFactoryImpl();


1

您可以使用-D标志在执行程序时静态地设置它:

java -Dorg.apache.xalan.processor.TransformerFactoryImpl=com.xyz.YourFactory YourApp

或者通过应用程序内部动态地使用 System.setProperty()
System.setProperty("org.apache.xalan.processor.TransformerFactoryImpl",
        "com.xyz.YourFactory");

请注意,您需要使用工厂类的完全限定类名,并且该工厂必须出现在您的类路径中,以使这两者之一起作用。

你知道“平台默认值”是什么吗?来自https://docs.oracle.com/javase/7/docs/api/javax/xml/transform/TransformerFactory.html。 - Martin Fouks
我找到了com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl。 - Martin Fouks
谢谢您的回答,我使用了System.setProperty()和System.clearProperty()来避免影响项目的其他部分。 - Martin Fouks
不幸的是,使用System.setProperty()和System.clearProperty()并不能避免影响项目的其他部分。虽然影响可能是短暂的,但它会影响在该时间窗口内执行的任何内容。最好使用接受工厂类名的newInstance()版本。(或直接实例化工厂,例如factory = new net.sf.saxon.TransformerFactoryImpl())。 - Michael Kay
这对我不起作用。我需要从javax.xml.transform.TransformerFactory创建实例,但它正在从org.apache.xalan.processor.TransformerFactoryImpl创建实例。请帮忙。 - tarekahf
javax.xml.transform.TransformerFactory 是 JAXP/TrAX API 的一部分。它不能直接实例化(它的构造函数是私有的),也不能自己创建 Transformers。相反,当您调用它的静态 newInstance() 方法时,它确定应该使用哪个 TransformerFactoryImpl 的实现,并将该实例交给您;您永远不会直接使用 TransformerFactory。使用的实现可以通过系统属性设置,如上所述;默认取决于您的 bootclasspath/classpath 上有什么。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接