6

在 Java 6 中,整个 xerces XML 解析器/序列化器实现现在位于 Java 运行时 (rt.jar) 中。这些包已移至 com.sun.* 命名空间下,这将它们置于客户端代码中明确引用的禁区。使用解析器时这不是问题,它是通过 javax API 定义的工厂实例化的。

但是,我们的代码也使用 xerces 序列化 (org.apache.xml.serialize.* )。AFAICT,没有用于创建 Serializer 和 OutputFormat 实例的 javax.xml API 定义的工厂。这似乎意味着获得一个的唯一方法是显式调用 com.sun.org.apache.xml.serialize.* API。

我在 javax.xml.stream 中找到了序列化类,但它们似乎没有像 xerces OutputFormat 类那样提供任何输出格式控制。

问题:

有没有办法通过 javax 标准 API 访问 xerces 序列化功能(rt.jar 中),而不包括 xerces.jar 并且也没有显式实例化 com.sun.* 类?

如果没有,是否有符合 javax API 的方式来实现相同的效果?

4

4 回答 4

5

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

于 2010-05-25T14:32:24.757 回答
1

据我所知,没有官方的 API 可以做到这一点。奇怪的是,Java XML API 仅用于解析 XML。

但是,您可以使用 XML 转换 API 将 DOM 写入Document文件。请参阅此示例

于 2010-05-24T19:06:37.083 回答
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 使用它(或者如果足够的话,使用它自己的 Xerces)那么你可能在这里很幸运,并且能够传递属性并让它工作.

于 2010-05-24T19:27:30.653 回答
0

javax.xml.bind.JAXBContext?如果您尝试将对象绑定/序列化到 XML,则 JAXB 是要使用的标准。如果您正在执行原始解析,那么 org.xml.sax 和/或 org.w3c.dom 应该有您要查找的内容。

更新: com.javax.transform 包应该有所帮助。看看这里的 Transformer 示例。

于 2010-05-24T19:09:18.030 回答