tutorial parse online español java xml jaxb

parse - xml to java object jaxb online



¿Cómo calcular sin un espacio de nombres? (7)

Esto funciona para mí:

marshaller.setProperty (Marshaller.JAXB_SCHEMA_LOCATION, "");

Tengo un XML repetitivo bastante grande para crear utilizando JAXB. Almacenar todo el objeto en la memoria y luego hacer el cálculo de referencias requiere mucha memoria. Esencialmente, mi XML se ve así:

<Store> <item /> <item /> <item /> ..... </Store>

Actualmente, mi solución al problema es "codificar" la etiqueta raíz a una secuencia de salida y reunir cada uno de los elementos repetitivos uno por uno:

aOutputStream.write("<?xml version="1.0"?>") aOutputStream.write("<Store>") foreach items as item aMarshaller.marshall(item, aOutputStream) end aOutputStream.write("</Store>") aOutputStream.close()

De alguna manera los JAXB generan el XML así.

<Store xmlns="http://stackoverflow.com"> <item xmlns="http://stackoverflow.com"/> <item xmlns="http://stackoverflow.com"/> <item xmlns="http://stackoverflow.com"/> ..... </Store>

Aunque este es un XML válido, pero se ve feo, así que me pregunto si hay alguna manera de decirle al agente de cálculo que no coloque espacio de nombres para los elementos del elemento. ¿O hay una mejor manera de usar JAXB para serializar a XML por trozo?


Hay una forma muy sencilla de deshacerse de los prefijos de espacio de nombres en su caso: simplemente configure el atributo elementFormDefault como no calificado en su esquema, como este:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:your="http://www..com/your/namespace">

Obtendrá el prefijo de espacio de nombres solo en la primera etiqueta:

<ns1:your xmlns:ns1="http://www..com/your/namespace">

Espero que esto ayude.

Saludos Pawel Procaj


He intentado todas las soluciones proporcionadas como respuestas aquí y ninguna de ellas funcionó para mi entorno. Mis requerimientos actuales son:

  1. jdk1.6.0_45
  2. Las clases anotadas JAXB 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 soluciones que he encontrado en .

link espacio de nombres personalizado

Solución simple y elegante, pero en mi entorno tengo una excepción con el siguiente seguimiento de pila:

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é atascado tratando de averiguar por qué ocurre esta excepción y decidí probar algo más.

Modificación del link package-info.java

La solución más simple que he encontrado. Generalmente funciona, pero este archivo se genera en cada compilación. Es por eso que tengo que encontrar otra solución.

link modificación de esquema

Funciona como se describe pero no resuelve mi problema. Todavía tengo un espacio de nombres en el elemento raíz.

Delegando el link XMLStreamWriter

También probé las soluciones mencionadas allí, pero tuve una aseveración extraña en com.sun.xml.bind.v2.runtime.output.NamespaceContextImpl (método declareNsUri) que no pude derrotar.

Mi solución

Mientras investigaba el problema con la aserción, tuve que implementar mi propia versión de XMLStreamWriter basada 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 pasar información de espacio de nombres al XMLStreamWriter subyacente. Espero que esto te ayude a ahorrar tiempo resolviendo problemas similares.

PD. No es necesario extender DelegatingXMLStreamWriter en su código. He hecho esto para mostrar qué métodos hay que cambiar.


Lo siguiente hizo el truco para mí:

XMLStreamWriter writer = ... writer.setNamespaceContext(new NamespaceContext() { public Iterator getPrefixes(String namespaceURI) { return null; } public String getPrefix(String namespaceURI) { return ""; } public String getNamespaceURI(String prefix) { return null; } });


Para mí, simplemente llamar a xmlStreamWriter.setDefaultNamespace("") solucionó el problema.

Una cosa más que debe tener en cuenta para eliminar el prefijo del espacio de nombres de la salida es que en todas partes tiene @XmlElement asegúrese de que no incluya la propiedad del espacio de nombres como @XmlElement(name="", namespace"http://...") ; De lo contrario, ninguna de las soluciones funcionará.


Si no especifica un espacio de nombres, JaxB no escribirá uno.

Yout podría usar Stax en un Stream, si su estructura no es demasiado complicada.


Verifique su package-info.java (en el paquete donde están sus clases anotadas con jaxb). Ahí está el atributo de namespace de namespace de @XmlSchema .

Además, hay un atributo de namespace en la anotación @XmlRootElement .