He intentado todas las soluciones proporcionadas como respuestas aquí y ninguna de ellas funcionó para mi entorno. Mis requisitos actuales son:
- jdk1.6.0_45
- JAXB las clases anotadas se generan en cada reconstrucción, por lo que cambiarlas no es una opción.
Me gustaría compartir con ustedes los resultados de mis experimentos con las soluciones que he encontrado en stackoverflow.
NamespaceContext personalizadalink
solución simple y elegante, pero en mi entorno tengo una excepción con el siguiente StackTrace:
javax.xml.stream.XMLStreamException: Trying to write END_DOCUMENT when document has no root (ie. trying to output empty document).
at com.ctc.wstx.sw.BaseStreamWriter.throwOutputError(BaseStreamWriter.java:1473)
at com.ctc.wstx.sw.BaseStreamWriter.reportNwfStructure(BaseStreamWriter.java:1502)
at com.ctc.wstx.sw.BaseStreamWriter.finishDocument(BaseStreamWriter.java:1663)
at com.ctc.wstx.sw.BaseStreamWriter.close(BaseStreamWriter.java:288)
at MyDataConverter.marshal(MyDataConverter.java:53)
me quedé atrapado tratando de averiguar por qué se produce esta excepción y Decidí probar algo más.
Modificación de package-info.javalink
La solución más sencilla que he encontrado. En general, funciona, pero este archivo se genera en cada compilación. Es por eso que tengo que encontrar otra solución.
modificación del esquemalink
Obras como se describe, pero no resuelve mi problema. Todavía tengo un espacio de nombres en el elemento raíz.
DelegatingXMLStreamWriterlink
También he intentado soluciones mencionadas allí, pero tenía una extraña afirmación en com.sun.xml.bind.v2.runtime.output.NamespaceContextImpl (método declareNsUri), que yo' No he podido vencer.
Mi solución
Durante la investigación de la cuestión con la afirmación que tuvo que poner en práctica mi propia versión de XMLStreamWriter basado en DelegatingXMLStreamWriter.java
public class NamespaceStrippingXMLStreamWriter extends DelegatingXMLStreamWriter {
public NamespaceStrippingXMLStreamWriter(XMLStreamWriter xmlWriter) throws XMLStreamException {
super(xmlWriter);
}
@Override
public void writeNamespace(String prefix, String uri) throws XMLStreamException {
// intentionally doing nothing
}
@Override
public void writeDefaultNamespace(String uri) throws XMLStreamException {
// intentionally doing nothing
}
@Override
public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
super.writeStartElement(null, local, null);
}
@Override
public void writeStartElement(String uri, String local) throws XMLStreamException {
super.writeStartElement(null, local);
}
@Override
public void writeEmptyElement(String uri, String local) throws XMLStreamException {
super.writeEmptyElement(null, local);
}
@Override
public void writeEmptyElement(String prefix, String local, String uri) throws XMLStreamException {
super.writeEmptyElement(null, local, null);
}
@Override
public void writeAttribute(String prefix, String uri, String local, String value) throws XMLStreamException {
super.writeAttribute(null, null, local, value);
}
@Override
public void writeAttribute(String uri, String local, String value) throws XMLStreamException {
super.writeAttribute(null, local, value);
}
}
La idea principal es evitar la transmisión de información de espacio de nombres a la XMLStreamWriter subyacente . Espero que esto te ayude a ahorrar algo de tiempo para resolver un problema similar.
PS. No es necesario extender DelegatingXMLStreamWriter en su código. Hice esto para mostrar qué métodos necesitan cambios.
En realidad, su implementación y la salida sugerida no coinciden. Usted está escribiendo la etiqueta raíz usted mismo, por qué hay un espacio de nombres en el resultado en el elemento raíz. – tkr
Ahh buena captura. Porque realmente uso JAXB para "codificar" el elemento raíz también. Entonces, lo que hice fue crear un objeto Root vacío, dirigirlo a una Cadena, luego analizar la Cadena para extraer las etiquetas raíz. Entonces, si JAXB no genera espacio de nombres para la etiqueta raíz, entonces estoy condenado. – Alvin