如何将java内部XMLStreamWriter与另一个提供者一起使用

时间:2013-10-23 22:16:11

标签: java xml java-7 java-6

我使用此代码获取XMLStreamWriter

javax.xml.stream.XMLOutputFactory
    .newInstance()
    .createXMLStreamWriter( outputStream )

最近我不得不将jaxws的罐子包含在我的系统中。之后,XmlStreamWriter实施从com.sun.xml.internal.stream.writers.XMLStreamWriterImpl更改为com.ctc.wstx.sw.SimpleNsStreamWriter。此类生成的输出与java内部实现不同。

如何通过显式使用com.sun.xml.internal.stream.XMLOutputFactoryImpl强制java使用内部实现而不将我的代码绑定到java 6? Java 7使用不同的XMLStreamWriter,我希望我的代码也能用java 7运行。


我试过了:

XMLOutputFactory.newFactory( 
    "com.sun.xml.internal.stream.XMLOutputFactoryImpl", 
    getClass().getClassLoader() 
);

正在使用Oracle JDK 6,但是使用JDK 7会导致

javax.xml.stream.FactoryConfigurationError: 
Provider for com.sun.xml.internal.stream.XMLOutputFactoryImpl cannot be found  

3 个答案:

答案 0 :(得分:2)

根据javadoc,这就是工厂的运作方式:

  • 使用javax.xml.stream.XMLOutputFactory系统属性。
  • 使用JRE目录中的属性文件“lib / stax.properties”。
  • 使用服务API(详见JAR规范)
  • 平台默认XMLOutputFactory实例。

因此,为了确保使用sun内部实现,我认为最好的方法是执行以下操作:

System.setProperty("javax.xml.stream.XMLOutputFactory", "com.sun.xml.internal.stream.XMLOutputFactoryImpl");
XMLOutputFactory.newInstance();

答案 1 :(得分:0)

这是糟糕的风格,但它适用于Oracles Java 6和7:

new com.sun.xml.internal.stream.writers.XMLStreamWriterImpl( 
    outputStream, 
    encoding, 
    new com.sun.org.apache.xerces.internal.impl.PropertyManager(
        PropertyManager.CONTEXT_WRITER
    ) 
);

为了能够编译这个,我必须使用以下选项调用javac

-XDignore.symbol.file

答案 2 :(得分:0)

当然是一个非常老的线程,但我仍然面对该问题,并使用JDK 9+和以下代码行解决了该问题:

XMLOutputFactory.newDefaultFactory();

也许这对以后的某个人有帮助...当再次遇到该问题时,甚至可能是我自己。 ;-)

相关问题