Java 6中的Xerces序列化

6
在Java 6中,整个xerces XML解析器/序列化实现已经在Java运行时(rt.jar)中。这些包已被移动到com.sun.*命名空间下,从而使它们在客户端代码中不能显式引用。当使用javax API定义的工厂来实例化解析器时,这不是问题。
然而,我们的代码还使用了xerces序列化(org.apache.xml.serialize.*)。据我所知,没有javax.xml API定义的创建Serializer和OutputFormat实例的工厂。这似乎意味着唯一的获取方式是显式调用com.sun.org.apache.xml.serialize.* API。
我在javax.xml.stream中找到了序列化类,但它们似乎没有像xerces OutputFormat类那样提供任何输出格式控制。
问题:
是否有一种通过javax标准API访问xerces序列化功能(它确实在rt.jar中)的方法,而无需包含xerces.jar并且也不需要显式实例化com.sun.*类?
如果没有,是否有一种符合javax API的方法来实现同样的效果?
4个回答

5
如果您想使用一个没有通过官方java.*javax.* API公开的Xerces功能,则您唯一的解决方案是将Xerces作为第三方库包含在内。以任何方式访问JRE内部版本的Xerces都是危险的,因为没有什么能保证有效的JRE甚至具有这些类(替代JRE甚至相同JRE的其他版本可能使用不同的实现来实现JAXP API,甚至只是将其移动到另一个包中)。

这是我们的起点,也是我们得出的结论。如果你想使用Xerces的非Java API部分(特别是序列化),那就必须包含Xerces。我们修改了我们的代码库,以删除系统属性中对Xerces类的明确引用,并让它在实例化解析器和转换器时使用默认值。这样可以防止类加载冲突,因为所有的默认值都在com.sun.*中。 - Jim Garrison

1
据我所知,目前没有官方的API能够实现这个功能。Java XML API奇怪的是只用于解析XML而已。
不过,您可以使用XML Transformation API将DOM Document写入文件中。请参考this example

我现在正在调查转换API。它似乎没有通过OutputFormat可用的指定格式的灵活性,除非它在底层使用xerces序列化并且有一种方法可以将参数传递给序列化程序。 - Jim Garrison

1

如果您不想引用sun API,可以将Xerces放置在endorsed目录中。它将替换sun的副本/实现,但是您可以无忧地使用API(这是“官方”方法)。

Java内置实现不能很好地控制输出,尽管使用Xerces和API属性可以获得一些更好的输出控制,因为API支持传递其他实现可能会发现有用的属性。我自己没有尝试过最后一个(我只是根据文档来做的)。

编辑(针对评论):如果您要在无法控制基础JDK以指定自己的JAXP替代API的环境中使用Xerces,则必须直接引用Xerces(或引用sun包重写)。

如果您可以将Xerces放入认可的目录中(或以其他方式覆盖认可的设置 - 老实说,在应用服务器上似乎不太可能,尽管我不知道Weblogic具体情况),则“JDK”设置基础实现属性的方法是通过TransformerFactory.setAttribute,这取决于实现方式,可能会与Transformer.setParameter交互。

我应该补充说明,如果Sun捆绑的底层版本足够,并且Weblogic使用它(或者如果Weblogic使用自己的Xerces就足够了),那么您可能会很幸运,只需传递属性即可使其工作。


我们本来会使用官方目录,但我们正在尝试使我们的产品能够在WAR/EAR中部署,在WebSphere环境中具有非常严格的安全要求。您在API中看到传递其他属性给底层xerces实现的可能性在哪里? - Jim Garrison

0

javax.xml.bind.JAXBContext是什么?如果您想将对象绑定/序列化到XML中,JAXB是标准选择。如果您正在进行原始解析,则org.xml.sax和/或org.w3c.dom应该有您需要的内容。

更新:com.javax.transform包应该会有所帮助。请查看转换器示例此处


不,我没有将Java对象绑定到XML。这只涉及序列化DOM,而且似乎只有xerces/xalan序列化API提供了对输出格式(缩进、空格等)的任何控制。 - Jim Garrison

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