4

我正在使用此代码来获取XMLStreamWriter

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

最近我不得不将 jars 包含jaxws到我的系统中。之后,XmlStreamWriter实施从 更改com.sun.xml.internal.stream.writers.XMLStreamWriterImplcom.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  
4

4 回答 4

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();
于 2014-02-15T13:06:36.397 回答
1

当然是一个非常古老的线程,但我仍然面临这个问题并用 JDK 9+ 和这行代码解决了它:

XMLOutputFactory.newDefaultFactory();

也许这对以后的人有帮助……当再次面临这个问题时,甚至可能是我自己。;-)

于 2020-10-19T12:35:18.523 回答
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
于 2013-10-25T07:08:55.570 回答