2011-06-09 32 views
27

He generado clases de Java desde XSD, todo funciona bien desde el punto de vista de no clasificación.JAXB namespace prefixes missing

Sin embargo, cuando Marshall de clases JAXB me sale el siguiente:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<message xmlns="http://poc.cmc.com/ScreenLayout"> 
    <Data> 
     <Type>Sample</Type> 
    . . . 
</message> 

Pero necesito

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns0:message xmlns:ns0="http://poc.cmc.com/ScreenLayout"> 
    <ns0:Data> 
     <ns0:Type>Sample</ns0:Type> 
    . . . 

cómo puedo controlar que a partir de Java?

Muchas gracias

+2

El primer listado es perfectamente válido; tiene el espacio de nombre predeterminado establecido en "http: //poc.cmc.com/ScreenLayout". ¿Por qué necesitas un prefijo de espacio de nombres? – perp

+4

Hola, porque la aplicación que consume es muy tonta y necesita el prefijo, y no tenemos control sobre ella –

Respuesta

2

Según especificación XML de ambos XML son los mismos, como xmlns = "" define espacio de nombres predeterminado que se aplica a elementos secundarios actuales y todos. analizadores XML deben darle el mismo DOM o SAX en ambos casos

+0

Ok, Resuelto con package-info.java: –

+0

@ javax.xml.bind.annotation.XmlSchema (namespace = "http: //poc.cmc.com/ScreenLayout ", xmlns = {@XmlNs (namespaceURI =" http://poc.cmc.com/ScreenLayout ", prefix =" ns1 ")}, elementFormDefault = XmlNsForm.QUALIFIED) –

31

Puede utilizar la anotación @XmlSchema en una clase package-info para asignar un prefijo a los nombres:

@XmlSchema(
    namespace = "http://poc.cmc.com/ScreenLayout", 
    elementFormDefault = XmlNsForm.QUALIFIED, 
    xmlns={@XmlNs(prefix="ns0", namespaceURI="http://poc.cmc.com/ScreenLayout")})  
package your.package; 


import javax.xml.bind.annotation.*; 
+1

No lo probé, pero sería agradable. Desafortunadamente los archivos java se generan, por lo que necesitaría que el proceso de compilación coloque este archivo personalizado en el mismo lugar que los archivos generados ... – f1sh

+0

Lo que no entiendo es que hay casi 20 clases de información de paquete en mi proyecto . ¿Cuál necesito para agregar la información de @XmlNs? – hellzone

+0

@hellzone - El siguiente enlace puede ayudar: http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html –

4

posterior Cant esto como un comentario!

debido a que la aplicación que se consume es muy tonto y necesita el prefijo

En ese caso, la aplicación tonto no es realmente consumiendo XML. Eche un vistazo a este enlace http://bdoughan.blogspot.com/2010/08/jaxb-namespaces.html y juegue con las opciones del espacio de nombres. Específicamente

@XmlSchema (
    xmlns = { 
     @javax.xml.bind.annotation.XmlNs(prefix = "ns1", namespaceURI="http:test"), 
     @javax.xml.bind.annotation.XmlNs(prefix = "xsd", namespaceURI="http:www.w3.org2001XMLSchema") 
    }, 
    namespace = "http:test", 
    elementFormDefault = XmlNsForm.UNQUALIFIED, 
    attributeFormDefault = XmlNsForm.UNSET 
) 

utilizado en un archivo package-info.java.

@XmlType(namespace="http://www.example.org/type") 

utilizado en una declaración de clase

@XmlElement(namespace="http://www.example.org/property") 

Se utiliza en una propiedad.

Alguna combinación o solo una de estas opciones puede darle lo que desea. Sin embargo, debe comprender que está librando una batalla cuesta arriba al pasar de xml válido a xml que debe contener un prefijo de espacio de nombre específico en todos los elementos.