2010-05-31 10 views
5

Ho messo insieme un XSD e ho usato JAXB per generare classi da esso.JAXB aggiunta spazio dei nomi al genitore ma non agli elementi figlio contenuti

Ecco la mia XSDs-

myDoc.xsd : 
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns="http://www.mydoc.org" 
     targetNamespace="http://www.mydoc.org" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xmlns:mtp="http://www.mytypes.com" elementFormDefault="qualified"> 

<xs:import namespace="http://www.mytypes.com" schemaLocation="mytypes.xsd" /> 
<xs:element name="myDoc"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="crap" type="xs:string"/> 
     <xs:element ref="mtp:foo"/> 
     <xs:element ref="mtp:bar"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

mytypes.xsd 

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://www.mytypes.com" 
     xmlns="http://www.mytypes.com" 
     xmlns:tns="http://www.mytypes.com" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     attributeFormDefault="qualified" elementFormDefault="qualified"> 


    <xs:element name="foo" type="tns:Foo"/> 
    <xs:element name="bar" type="tns:Bar"/> 
    <xs:element name="spam" type="tns:Spam"/> 

    <xs:simpleType name="Foo"> 
    <xs:restriction base="xs:string"></xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="Bar"> 
    <xs:sequence> 
     <xs:element ref="spam"/> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:simpleType name="Spam"> 
    <xs:restriction base="xs:string" /> 
    </xs:simpleType> 

</xs:schema> 

Il documento schierato è-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<myDoc xmlns:ns2="http://www.mytypes.com"> 
    <crap>real crap</crap> 
    <ns2:foo>bleh</ns2:foo> 
    <ns2:bar> 
    <spam>blah</spam> 
    </ns2:bar> 
</myDoc> 

Nota che l'elemento <spam> utilizza lo spazio dei nomi predefinito. Mi piacerebbe che utilizzasse lo spazio dei nomi ns2. Lo schema (mytypes.xsd) esprime il fatto che <spam> è contenuto all'interno di <bar> che nell'istanza XML è associato allo spazio dei nomi ns2.

Ho rotto la mia testa su questo per più di una settimana e vorrei ns2 prefisso a comparire in <spam>. Cosa dovrei fare?

richiesto:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<myDoc xmlns:ns2="http://www.mytypes.com"> 
    <crap>real crap</crap> 
    <ns2:foo>bleh</ns2:foo> 
    <ns2:bar> 
    <ns2:spam>blah</ns2:spam><!--NS NS NS--> 
    </ns2:bar> 
</myDoc> 

risposta

0

ho cercato di riprodurre il problema, ma qui sta funzionando correttamente: Quando l'elemento di smistamento di spam fa arrivare un namespace ns2.

Il mio codice di smistamento:

Bar bar = new Bar(); 
    bar.setSpam("s"); 

    MyDoc myDoc = new MyDoc(); 
    myDoc.setBar(bar); 

    JAXBContext context = JAXBContext.newInstance("org.mydoc"); 

    Marshaller marshaller = context.createMarshaller(); 
    marshaller.marshal(myDoc, System.out); 

uscita:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myDoc xmlns="http://www.mydoc.org" xmlns:ns2="http://www.mytypes.com"><ns2:bar><ns2:spam>s</ns2:spam></ns2:bar></myDoc> 

La mia versione JAXB:

xjc version "JAXB 2.1.3 in JDK 1.6" 
JavaTM Architecture for XML Binding(JAXB) Reference Implementation, (build IBM JAXB 2.1.3 in JDK 1.6) 

EDIT:

La classe Bar.java non ha la seguente annotazione:

@XmlElement(required = true) 
protected String spam; 

Il XmlElement ha anche un attributo namespace. Javadoc: http://java.sun.com/javase/6/docs/api/javax/xml/bind/annotation/XmlElement.html#namespace()

Per impostazione predefinita verrà esaminata l'annotazione @XmlSchema nel pacchetto com.mytypes. Hai rimosso l'annotazione @XmlSchema e/o il file package-info.java?

+0

sto usando JAXB-2.1.11 con jdk1.5. Non ho modificato manualmente le classi generate e il file package-info.java. Bar.java è annotato con- @XmlType (name = namespace "Bar" = "http://www.mytypes.com" propOrder = { "spam"}) package-info.java contiene @XmlSchema (namespace = "http://www.mydoc.org", elementFormDefault = XmlNsForm.QUALIFIED) – Nishant

+0

È interessante notare che posso eseguire il marshalling di un documento e ripristinarlo perfettamente alla perfezione. AFAIU, l'istanza XML afferma che lo appartiene allo spazio dei nomi null e la sua definizione non deve essere trovata – Nishant

0

package-info.java non è stato compilato dal mio sistema di compilazione e quindi elementFormDefault = "qualificato" e lo spazio dei nomi di destinazione non è stato assegnato alle classi annotate Jaxb.

Se si verifica questo comportamento, assicurarsi che il proprio pacchetto-info.java venga compilato in un file .class e si trovi nel classpath.

Cheers.

0

Questo errore si verifica anche se si crea con Maven 2 e il seguente jaxws-maven-plugin.

<groupId>org.codehaus.mojo</groupId> 
<artifactId>jaxws-maven-plugin</artifactId> 

E per qualche ragione hanno configurato il Maven-compiler-plugin per Java 1.5. Impostare target/source su 1.6 risolve il problema.

<plugin> 
    <artifactId>maven-compiler-plugin</artifactId> 
    <configuration> 
     <source>1.6</source> 
     <target>1.6</target> 
     </configuration> 
</plugin> 

Se si conosce il motivo, non esitate a commentare.

-1

Avete controllato il vostro codice che avete specificato il vostro ElementType come "Spam" ma riferito sotto barra come "spam". questo capitale "S" e piccolo "s" nel codice ur, se non si preoccupa, mi dispiace ma se si disturba veramente, potrebbe essere necessario usarlo correttamente. Prova a utilizzare "Spam" in tutto il mondo e dai un'occhiata a na ..

- scusa, sono un principiante in xslt, xml, xsd e roba e nessuna conoscenza su JAXB. ma in generale, quando leggiamo di scrivere documenti xml usando Xsd, ci prenderemo sempre cura della case sensitive.

scusa se questa risposta non risolve il tuo problema.

2

controllare se i campi in una classe generata mancano dell'annotazione @XmlElement e se presente mancano l'attributo dello spazio dei nomi. Questi due sono necessari per ottenere il prefisso dello spazio dei nomi su ogni elemento nel file di marshalling xml

0

È possibile specificarlo nel pacchetto package-info.java nell'annotazione @XmlSchema.

elementFormDefault=XmlNsForm.QUALIFIED 

campione package-info.java

@XmlSchema(
    namespace="desiredNamespace", 
    // If qualified namespace will be added to all elements 
    elementFormDefault = XmlNsForm.QUALIFIED, 
    // If qualifies namespace will be added to all attributes 
    attributeFormDefault = XmlNsForm.UNQUALIFIED, 
    xmlns = { 
     @XmlNs(prefix = "xsd", namespaceURI = "desiredNamespace"), 
     @XmlNs(prefix = "xsi", namespaceURI = "anotherLink"), 
    } 
) 
Problemi correlati