2010-11-30 5 views
9

J'essaie de générer du XML en utilisant jaxb. J'ai créé xsd et généré des classes Java. Mais quand je génère du XML, je suis le préfixe de geeting ns2 à la balise racine, ce que je ne veux pas.JAXB généré xml - problème avec le préfixe de l'élément racine

ex: Je veux balise racine pour être

<report> 
    <id>rep 1</id> 
</report> 

, mais obtenir que

<ns2:report> 
.... 
</ns2:report> 

Dans la classe java généré, j'ai donné l'annotation comme @XmlRootElement(name="report",namespace="urn:report")

Quelqu'un peut pls aide

Répondre

12

Si ceci est votre classe:

package example; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="report",namespace="urn:report") 
public class Root { 

    private String id; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

} 

alors il est logique qu'il y ait un préfixe sur l'élément racine, parce que vous avez spécifié que l'élément « racine » élément est espace de nom qualifié et le « id » n'est pas.

<ns2:report xmlns:ns2="urn:report"> 
    <id>123</id> 
</ns2:report> 

Si vous ajoutez une classe package-info à votre modèle, vous pouvez Leverate l'annotation @XmlSchema:

@XmlSchema(
     namespace = "urn:report", 
     elementFormDefault = XmlNsForm.QUALIFIED) 
package example; 

import javax.xml.bind.annotation.XmlNsForm; 
import javax.xml.bind.annotation.XmlSchema; 

Ensuite, la mise en œuvre JAXB peut choisir de tirer parti de l'espace de noms par défaut, mais notez maintenant tous des éléments sont espace de noms qui peuvent ou qualifiés ne peuvent pas correspondre à votre schéma XML:

<report xmlns="urn:report"> 
    <id>123</id> 
</report> 

Pour plus d'informations sur JAXB et namespaces voir:

+0

S'il y a deux espaces de noms dans l'objet, il devient comme ', puis une partie utilisera ' navins

+0

@navins - Pouvez-vous poster ceci comme une nouvelle question? –

+0

ok, voir http://stackoverflow.com/questions/25518253/jaxb-generated-xml-remove-namespace-prefix – navins

1

l'entrée de blog Customizing JAXB montre l'alter indigènes fournis par la mise en œuvre d'un PreferredMapper. Malheureusement, il explique, ce n'est pas possible de supprimer complètement les espaces de noms.

+1

Merci Utile Mais le mappeur préféré change le préfixe, ne supprime pas le préfixe Au bas de la page, il est dit qu'il n'est pas possible de supprimer le préfixe J'essaie de contourner le problème. – crazyTechie

1

Jetez un oeil à this answer. Il décrit comment utiliser un filtre SAX pour supprimer un espace de noms.

+0

Utile. Merci. – crazyTechie

0

Utilisez cet attribut dans votre élément racine de votre schéma: elementFormDefault = "qualifié" Ainsi, par exemple:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
0

D'une certaine façon la réponse acceptée ne fonctionnait pas pour moi. J'ai eu du succès quand j'ai trouvé des solutions dans quelques questions liées stockOverflow impliquant DelegatingXMLStreamWriter de CXF et un filtre, NoNamesWriter. La mise en œuvre que j'ai utilisé avec NoNamesWriter:

public class NoNamesWriter extends DelegatingXMLStreamWriter 
{ 
    @Override 
    public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException { 
     delegate.writeStartElement("", local, uri); 
    } 

    public static XMLStreamWriter filter(FileOutputStream fileOutputStream) throws XMLStreamException { 
     return new NoNamesWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(fileOutputStream)); 
    } 

    public NoNamesWriter(XMLStreamWriter writer) { 
     super(writer); 
    } 

} 

invoquons le même que celui décrit here, comme:

xmlmarshaller.marshal (xc, NoNamesWriter.filter (nouveau FileOutputStream (outfile, false));

Questions connexes