2011-06-09 4 views
27

J'ai généré des classes Java à partir de XSD, tout fonctionne correctement d'un point de vue unmarshalling.Les préfixes d'espace de noms JAXB manquants

Cependant, quand je marshall des classes JAXB je reçois les éléments suivants:

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

Mais je dois

<?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> 
    . . . 

comment puis-je contrôler que de Java?

Merci beaucoup

+2

La première liste est parfaitement valide; il a l'espace de noms par défaut défini sur "http: //poc.cmc.com/ScreenLayout". Pourquoi avez-vous besoin d'un préfixe d'espace de noms? – perp

+4

Salut, parce que l'application consommatrice est très bête et a besoin du préfixe, et nous n'avons aucun contrôle sur elle –

Répondre

2

Selon les spécifications XML les documents XML de ce sont les mêmes, que xmlns = « » définit l'espace de noms par défaut qui applique à tous les éléments actuels et de l'enfant. parseurs XML devrait vous donner le même DOM ou SAX dans les deux cas

+0

Ok, Résolu avec package-info.java: –

+0

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

31

Vous pouvez utiliser l'annotation @XmlSchema sur une classe package-info d'attribuer un préfixe à l'espace de noms:

@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

Je n'ai pas testé, mais ce serait bien. Malheureusement, les fichiers java sont générés, vous aurez donc besoin de construire un processus pour placer ce fichier personnalisé au même endroit que les fichiers générés ... – f1sh

+0

Ce que je ne comprends pas, c'est qu'il y a près de 20 classes d'info-paquet dans mon projet . Lequel dois-je ajouter aux infos de @XmlNs? – hellzone

+0

@hellzone - Le lien suivant peut vous aider: http://blog.bdoughan.com/2011/11/jaxb-and-namespace-prefixes.html –

4

post Cant cela comme un commentaire!

parce que l'application consommatrice est très stupide et a besoin du préfixe

Dans ce cas, l'application stupide ne consomme pas vraiment xml. Jetez un oeil à ce lien http://bdoughan.blogspot.com/2010/08/jaxb-namespaces.html et jouez avec les options d'espace de noms. Plus précisément

@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 
) 

utilisé dans un fichier package-info.java.

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

Utilisé sur une déclaration de classe

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

Utilisé sur une propriété.

Une combinaison ou une seule de ces options peut vous donner ce que vous voulez. Cependant, vous devez comprendre que vous vous battez dans une bataille difficile lorsque vous passez d'un fichier xml valide à xml qui doit contenir un préfixe d'espace de nom spécifique sur tous les éléments.

Questions connexes