代码之家  ›  专栏  ›  技术社区  ›  Jim Garrison

Java 6中的XECES序列化

  •  6
  • Jim Garrison  · 技术社区  · 15 年前

    在Java 6中,整个XRESCES XML解析器/序列化程序实现现在在Java运行时(RT.jar)中。这些包已移动到com.sun.*命名空间下,这使它们不受客户端代码中显式引用的限制。这在使用解析器时不是问题,解析器是通过javax-api定义的工厂实例化的。

    但是,我们的代码还使用了Xerces序列化(org.apache.xml.serialize.*)。在aict中,没有为创建序列化程序和输出格式的实例定义javax.xml api工厂。这似乎意味着获得一个的唯一方法是显式调用com.sun.org.apache.xml.serialize.*API。

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

    问题:

    是否有方法访问Xerces序列化功能(其中 在rt.jar中)通过javax标准API,不包括xerces.jar,也不显式实例化com.sun.*类?

    如果没有,是否有一种符合javax-api的方法来实现相同的效果?

    4 回复  |  直到 15 年前
        1
  •  5
  •   Joachim Sauer    15 年前

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

        2
  •  1
  •   Jesper    15 年前

    据我所知,没有官方的API来实现这一点。Java XML API奇怪的是只对XML进行解析。

    但是,您可以使用XML转换API来编写DOM。 Document 一个文件。见 this example .

        3
  •  1
  •   Yishai    15 年前

    如果不想引用Sun API,可以将Xerces放在已认可的目录中。它将取代Sun的拷贝/实现,但是您可以毫无顾虑地使用API(这是一种“官方”的方式)。

    Java内置的实现并不能提供对输出的良好控制,尽管可以使用XECES和API属性获得对输出的更好的控制,因为API支持传递其他实现可能有用的附加属性。我自己还没试过最后一个(我只看文件)。

    编辑(响应注释):如果您希望在不控制底层JDK的环境中使用Xerces,从而可以为JAXP指定自己的替换API,则必须直接引用Xerces(或引用Sun包重写)。

    如果您可以将Xerces放在已认可的目录中(或者以其他方式覆盖已认可的设置,坦率地说,这在应用服务器中似乎不太可能,尽管我不特别了解WebLogic),将属性设置为底层实现的“jdk”方法是通过 TransformerFactory.setAttribute ,这取决于实现可能与 Transformer.setParameter .

    我应该补充一点,如果Sun捆绑包的底层版本足够,并且如果WebLogic使用它(如果足够,则使用它自己的xerces),那么您在这里可能很幸运,并且能够传递属性并让它工作。

        4
  •  0
  •   Matthew Flynn    15 年前

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

    更新: com.javax.transform包应该会有所帮助。看看变压器的例子 here .