2012-02-15 34 views
10

Estoy usando la propiedad JAXB_FRAGMENT para que mi Marshaller se margine en el nivel WorkSet. El problema es que cuando obtengo el atributo Workforce, el elemento xmlns se atribuye cada vez. ¿Hay alguna forma de reunir para que no adjunte el atributo xmlns? Así es como se ve mi XML.JAXB Fragment Marshal sin el espacio de nombres

<Import> 
     <WorkSets> 
      <WorkSet xmlns="http://www.namespace.com"> 
       <Work> 
       <Work> 
       ... 
       .. 
       ... 
      </WorkSet> 
      <WorkSet xmlns="http://www.namespace.com"> 
       <Work> 
       <Work> 
       ... 
      </WorkSet> 
     </WorkSets> 
    </Import> 

Aquí está el código que estoy utilizando el crear lo anterior:

FileOutputStream fos = new FileOutputStream("import.xml"); 
XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(fos); 

JAXBContext jc = JAXBContext.newInstance(WorkSet.class); 
Marshaller m = jc.createMarshaler(); 
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 

writer.writeStartDocument(); 
writer.writeStartElement("Import"); 
writer.writeAttribute("xmlns","http://www.namespace.com"); 
writer.writeStartElement("WorkSets"); 

while(hasWorkSet){ 
m.marshal(workSet, writer) 
} 
writer.writeEndDocument(); 
writer.close(); 
+0

¿Quieres tener la declaración de espacio de nombres más arriba en el documento, o no quieres un espacio de nombre declarado en absoluto? –

+0

@BlaiseDoughan Estoy escribiendo las etiquetas Importar y WorkSets manualmente a través de un XMLStreamWriter, así que también configuré sus atributos manualmente. Estoy usando JAXB para ordenar una colección de instancias de WorkSet, que funciona bien, simplemente no quiero el atributo xmlns asociado a cada una. No puso los atributos xmlns en WorkSet cuando utilicé JAXB para reunir la instancia XML completa (Importar, Trabajos, Trabajo, Trabajo ...). Solo comenzó cuando cambié JAXB_FRAGMENT para alinear solo WorkSet. – TyC

+0

@BlaiseDoughan He estado buscando a través de la API de JAXB y aún no puedo ver qué causa el espacio de nombres en el elemento WorkSet. – TyC

Respuesta

8

Suponiendo que desea que el espacio de nombres predeterminado para que el documento sea http://www.namespace.com, usted podría hacer lo siguiente:

demostración

elLos métodosy XMLStreamWriter.writeNamespace(String, String) se usarán para establecer y escribir el espacio de nombres predeterminado para el documento XML.

package forum9297872; 

import javax.xml.bind.*; 
import javax.xml.stream.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XMLStreamWriter writer = XMLOutputFactory.newFactory().createXMLStreamWriter(System.out); 
     writer.setDefaultNamespace("http://www.namespace.com"); 

     JAXBContext jc = JAXBContext.newInstance(WorkSet.class); 
     Marshaller m = jc.createMarshaller(); 
     m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE); 

     writer.writeStartDocument(); 
     writer.writeStartElement("http://www.namespace.com", "Import"); 
     writer.writeNamespace("", "http://www.namespace.com"); 
     writer.writeStartElement("WorkSets"); 

     m.marshal(new WorkSet(), writer); 
     m.marshal(new WorkSet(), writer); 

     writer.writeEndDocument(); 
     writer.close(); 
    } 

} 

WorkSet

Mi suposición es que ha especificado la información de espacio de nombres en su modelo de JAXB.

package forum9297872; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="WorkSet", namespace="http://www.namespace.com") 
public class WorkSet { 

} 

salida

a continuación es el resultado de la ejecución del código de demostración:

<?xml version="1.0" ?><Import xmlns="http://www.namespace.com"><WorkSets><WorkSet></WorkSet><WorkSet></WorkSet></WorkSets></Import> 
+0

Esto funcionó, pero no tengo idea de por qué. No se especificó ningún nombre en la clase WorkSet. Aquí está la etiqueta XmlRootElement asociada a la clase. @XmlRootElement (name = "WorkSet"). – TyC

+0

¿Hay una clase 'package-info' en el mismo paquete que la clase' WorkSet'? –

+0

Sí. Contiene lo siguiente: @ javax.xml.bind.annotation.XmlSchema (namespace = "http://www.itron.com/nVanta", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) – TyC

1

Hay tres soluciones para este.

1) Cree objetos anotados JAXB para el contenedor de sus grupos de empleados. Agregue los grupos de trabajo a ese objeto y luego marque todo.

2) Siga el primer ejemplo en 101 ways to marshal objects with JAXB y use DocumentBuilderFactory con namespace aware.

3) Suponiendo que el objeto jaxb está en un paquete que nunca debería tener espacios de nombres calificados, puede agregar lo siguiente a la anotación del paquete: (nota: hace mucho tiempo que no hago esto y no lo he probado este código)

@XmlSchema(namespace = "", elementFormDefault = XmlNsForm.UNQUALIFIED) 
package example; 
0

Sólo otro ejemplo:

try { 
     JAXBContext customerInformationRequestContext = JAXBContext.newInstance(CustomerInformationRequest.class); 
     Unmarshaller unmarshaller = customerInformationRequestContext.createUnmarshaller(); 
     StringReader stringReader = new StringReader(requestPayload); 
     XMLInputFactory xif = XMLInputFactory.newFactory(); 
     XMLStreamReader xsr = xif.createXMLStreamReader(stringReader); 
     XMLStreamReaderWrapper reader = new XMLStreamReaderWrapper(xsr); 
     CustomerInformationRequest customerInformationRequest = (CustomerInformationRequest) unmarshaller.unmarshal(reader); 
     CustomerInformationResponse customerInformationResponse = customerLookup(customerInformationRequest, sessionTransaction); 
     JAXBContext customerInformationResponseContext = JAXBContext.newInstance(CustomerInformationResponse.class); 
     Marshaller marshaller = customerInformationResponseContext.createMarshaller(); 
     StringWriter stringWriter = new StringWriter(); 
     XMLOutputFactory xof = XMLOutputFactory.newFactory(); 
     XMLStreamWriter xsw = xof.createXMLStreamWriter(stringWriter); 
     xsw = new XMLStreamWriterWrapper(xsw); 
     marshaller.marshal(customerInformationResponse, xsw); 
     String responsePayload = stringWriter.toString(); 
     return responsePayload; 
    } catch (Exception e) { 
     log.debug("The payload could not be unmarshalled.", e); 
     return null; 
    } 
Cuestiones relacionadas