2010-11-30 7 views
9

Ich versuche, XML mit Jaxb zu generieren. Ich habe xsd erstellt und Java-Klassen generiert. Aber wenn ich xml erzeuge, bekomme ich Präfix ns2 zum root-Tag, was ich nicht will.Jaxb generierte xml - Problem mit Root-Element-Präfix

ex: Ich Root-Tag

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

, aber immer als

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

In der generierten Java-Klasse sein wollen, gab ich Annotation als @XmlRootElement(name="report",namespace="urn:report")

Kann jemand pls help

Antwort

12

Ist dies Ihre Klasse:

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; 
    } 

} 

Dann macht es Sinn, dass es ein Präfix auf dem Root-Element ist, weil Sie angegeben haben, dass das „root“ Element-Namespace qualifiziert ist und die „id“ Element ist nicht.

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

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

Dann wird die JAXB Implementierung können die Standard-Namespace, aber beachten Sie nutzen jetzt alle:

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

Wenn Sie ein Paket-info Klasse zu Ihrem Modell hinzufügen, können Sie die @XmlSchema Anmerkung leverate die Elemente sind Namespace qualifiziert, das XML-Schema entsprechen kann oder nicht:

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

weitere Informationen zu JAXB und Namensbereichen:

+0

Wenn es zwei Namespaces im Objekt gibt, wird es wie '', dann Einige Teile verwenden ' navins

+0

@navins - Können Sie dies als neue Frage posten? –

+0

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

1

Der Blogeintrag Customizing JAXB zeigt die Veränderung Einheimische zur Verfügung gestellt durch die Umsetzung einer PreferredMapper. Leider erklärt es, dass Namespaces nicht vollständig unterdrückt werden können.

+1

Dank Nützlich, aber der bevorzugte Mapper ändert das Präfix, entfernt nicht das Präfix. Am unteren Ende der Seite sagen sie, dass es nicht möglich ist, das Präfix zu entfernen. Ich probiere das Workarounds aus. – crazyTechie

1

Werfen Sie einen Blick auf this answer. Es beschreibt, wie Sie mit einem SAX-Filter einen beliebigen Namespace entfernen können.

+0

Hilfreich. Vielen Dank. – crazyTechie

0

Verwenden Sie dieses Attribut in Ihrem Stammelement des Schemas: ElementFormDefault- = "qualifiziert" So zum Beispiel:

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

Irgendwie ist die akzeptierte Antwort nicht für mich arbeiten. Ich bekam Erfolg, als ich Lösungen in einigen verwandten stockOverflow Fragen fand, die DelegatingXMLStreamWriter von cxf und einen Filter, NoNamesWriter miteinbeziehen. Die Umsetzung verwendete ich mit 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); 
    } 

} 

die gleiche Invoke wie here beschrieben, wie:

xmlmarshaller.marshal (xc, NoNamesWriter.filter (neue Fileoutputstream (outfile, false));