java - parse - Los prefijos de espacio de nombres JAXB que faltan
parse xml java jaxb (3)
He generado clases de Java desde XSD, todo funciona bien desde el punto de vista de descalificación.
Sin embargo, cuando salgo de las clases de JAXB obtengo lo siguiente:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns="http://poc.cmc.com/ScreenLayout">
<Data>
<Type>Sample</Type>
. . .
</message>
Pero yo 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 eso desde Java?
Muchas gracias
De acuerdo con la especificación XML, ambos xml son iguales, ya que xmlns = "" define el espacio de nombres predeterminado que se aplica a los elementos actuales y secundarios. Analizadores XML deberían darle el mismo DOM o SAX en ambos casos
No puedo publicar esto como un comentario!
porque la aplicación que consume es muy tonta y necesita el prefijo
En ese caso, la aplicación tonta realmente no consume 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")
Usado en una declaración de clase
@XmlElement(namespace="http://www.example.org/property")
Usado 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.
Puede usar la anotación @XmlSchema
en una clase package-info
para asignar un prefijo al espacio de 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.*;