2010-05-24 10 views
6

En Java 6, toda la implementación del xerces XML parser/serializer está ahora en el tiempo de ejecución de Java (rt.jar). Los paquetes se han movido debajo del espacio de nombres com.sun. *, Lo que los hace fuera de los límites de referencia explícita dentro del código del cliente. Esto no es un problema cuando se usa el analizador sintáctico, que se crea una instancia a través de fábricas definidas por la API javax.serialización de xerces en Java 6

Sin embargo, nuestro código también utiliza la serialización xerces (org.apache.xml.serialize. *). AFAICT, no hay fábricas definidas por API javax.xml para crear instancias de Serializer y OutputFormat. Esto parece implicar que la única forma de obtener uno es llamar explícitamente a las API com.sun.org.apache.xml.serialize. *.

He encontrado las clases de serialización en javax.xml.stream, pero no parecen proporcionar ningún control de formato de salida como la clase xerces OutputFormat.

Pregunta:

¿Hay una manera de acceder a la funcionalidad de serialización xerces (que es en rt.jar) a través de una API estándar javax, sin incluir xerces.jar y también sin crear instancias explícitamente com. sol. * clases?

Si no es así, ¿existe una forma compatible con javax API para lograr el mismo efecto?

Respuesta

5

Si desea utilizar una función Xerces que no esté expuesta a través de una API oficial java.* o javax.*, entonces la única solución real es incluir Xerces como una biblioteca de terceros. Acceder a la versión interna de Xerces de JRE sería algo peligroso, ya que nada garantiza que un JRE válido tenga esas clases (JRE alternativos e incluso otras versiones del mismo JRE podrían implementar las API de JAXP usando una implementación diferente o incluso solo muévelo a otro paquete).

+0

Aquí es donde comenzamos, y es la conclusión a la que hemos llegado también. Si desea utilizar las partes de Xerces que no son de Java-Java (específicamente la serialización), no hay forma de que incluya Xerces. Modificamos nuestra base de código para eliminar cualquier mención explícita de las clases Xerces en las propiedades del sistema, permitiéndole usar los valores predeterminados al crear instancias de analizadores y analizadores. Esto debería evitar conflictos de carga de clases ya que todos los valores predeterminados están en com.sun. * –

1

Por lo que sé, no hay una API oficial para hacer esto. Las API XML de Java son extrañamente solo para analizar XML.

Sin embargo, podría utilizar la API de transformación XML para escribir un DOM Document en un archivo. Ver this example.

+0

Estoy investigando la API de Transformación ahora. No parece tener la flexibilidad para especificar el formato que está disponible a través de OutputFormat, a menos que esté usando la serialización de xerces debajo de las cubiertas y hay una manera de obtener parámetros para el serializador. –

0

javax.xml.bind.JAXBContext? Si está intentando vincular/serializar objetos a XML, JAXB es el estándar a seguir. Si está realizando un análisis en bruto, org.xml.sax y/u org.w3c.dom debería tener lo que busca.

ACTUALIZADO: Los paquetes com.javax.transform deberían ayudar. Eche un vistazo al ejemplo de Transformador here.

+0

No, no estoy vinculando objetos de Java a XML. Se trata de serializar DOM, y nada más que la API de serialización xerces/xalan parece proporcionar control sobre el formato de salida (sangría, espacios en blanco, etc.). –

1

Si no desea hacer referencia a las API de Sun, puede colocar Xerces en el directorio endosado. Reemplazará la copia solar/implementación, pero luego podrá usar la API sin preocupaciones (esta es la manera "oficial" de hacerlo).

La implementación incorporada de Java no proporciona un buen control sobre la salida, aunque es posible obtener un mejor control sobre la salida utilizando Xerces y las propiedades API, ya que la API admite pasar propiedades adicionales que otras implementaciones pueden encontrar útil. No he probado el último yo (solo voy por la documentación).

Editar (en respuesta al comentario): Si desea utilizar Xerces en un entorno donde no controla el JDK subyacente hasta el punto donde puede especificar sus propias API de reemplazo para JAXP, tendrá que hacer referencia a Xerces directamente (o haga referencia a la reescritura del paquete solar).

Si puede poner Xerces en el directorio endosado (o anular la configuración respaldada, lo que parece poco probable en un servidor de aplicaciones, aunque no conozco Weblogic específicamente) la forma "JDK" de establecer las propiedades en un la implementación subyacente es a través de TransformerFactory.setAttribute, que dependiendo de la implementación puede interactuar con Transformer.setParameter.

Debo añadir que si la versión subyacente de los lotes de dom es suficiente, y si Weblogic lo usa (o usa sus propios Xerces si eso es suficiente) entonces puede que tenga suerte aquí, y solo pueda pasar las propiedades y haz que funcione

+0

Usaríamos el directorio endosado, pero estamos intentando que nuestro producto se pueda desplegar en un WAR/EAR, en un entorno WebSphere que tiene requisitos de seguridad muy estrictos. ¿En qué parte de la API ve la posibilidad de pasar propiedades adicionales a la implementación de xerces subyacente? –

+0

@Jim, edité mi respuesta para proporcionar algunos enlaces. – Yishai