2013-05-16 4 views
14

Ho un file stampato con uno spazio dei nomi predefinito. Gli elementi sono stampati con un prefisso di ns2, ho bisogno di questo per essere rimosso, come è con il mio codice:Rimuovi ns2 come prefisso dello spazio dei nomi predefinito

<ns2:foo xmlns:ns2="http://namespace" /> 

come voglio che sia:

<foo xmlns="http://namespace" /> 

questo è il modo che ho codificato, qualcosa che, come la vedo io dovrebbe essere sufficiente per il ns2 di andare via:

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

generato package-info risulta in questo modo:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://namespace", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.foo.bar; 

ho creare il file in questo modo:

JAXBContext jaxbContext = JAXBContext.newInstance(generatedClassesPackage); 
Marshaller marshaller = jaxbContext.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
marshaller.marshal(new JAXBElement<Foo>(new QName("http://namespace", "Foo"), 
Foo.class, rootFoo), outputStream); 

generatedClassesPackage è il pacchetto in cui package-info.java e gli elementi sono.

L'oggetto Foo è definito e presenta elementi come questa ::

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "", propOrder = { 
    "group" 
}) 
@XmlRootElement(name = "Foo") 
public class Foo { 

    @XmlElement(name = "Group", required = true) 
    protected List<Group> group; 

E 'qualcosa che ho perso? o ho frainteso come funziona?

+1

Se gli si assegna uno spazio dei nomi e lo si abilita, è necessario che lo spazio dei nomi sia da qualche parte valido per l'xsd. È possibile rimuovere del tutto il namespace o modificare il prefisso per essere qualcosa di più gestibile o modificare l'elemento di livello superiore in modo da avere il xmlns del namespace principale in modo che non ci siano prefissi per qualcosa in quel namespace. Quindi quello che vuoi non è un xml valido per i tuoi xsds. Vuoi elementi di namespace o no? –

+1

Penso che tu mi abbia confuso con non mostrare gli attributi su quell'elemento foo. Stai dicendo che vuoi '' invece di ''? –

+0

@DMoses sì, avrei dovuto includerlo, e sì, è così che lo voglio :). Voglio questo: xmlns: ns2 = "http: // namespace" nell'elemento root. – Vegard

risposta

6

Molto probabilmente nella risposta vi sono più spazi dei nomi. Questo userà la convenzione di default per la creazione di prefissi di namespace ns # e uno di essi diventerà il xmlns senza prefisso. Se si desidera controllare questo si può fare quanto segue:

NamespacePrefixMapper mapper = new NamespacePrefixMapper() { 
     public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { 
      if ("http://namespace".equals(namespaceUri) && !requirePrefix) 
       return ""; 
      return "ns"; 
     } 
    }; 
    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper); 
    marshaller.mashal.... 

Questo imposterà la http://namespace come xmlns di default sempre e utilizzare ns # per tutti gli altri spazi dei nomi quando marshalling. Puoi anche dare loro dei prefissi più descrittivi se vuoi.

+0

questo era in qualche modo! :) Grazie mille per l'aiuto. Il problema erano in effetti più spazi dei nomi. Ho avuto uno schema che ne importa un altro, questo stava causando il problema. Il codice che hai postato qui non ha funzionato direttamente, ma l'ho risolto fissando gli schemi multipli e quindi rigenerando il codice. – Vegard

+1

Si noti che NamespacePrefixMapper è ora una classe interna nel JDK. Quindi questa soluzione non conta più ... – Strinder

5

A partire da JDK6u18 la tecnica NamespacePrefixMapper non viene più utilizzata.

10

Tutto ciò che serve 2 fare è quando si apre un nuovo pacchetto selezionare Crea informazioni sul pacchetto in informazioni sul pacchetto aggiungere la seguente annotazione o modificare in base alle esigenze

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.sitemaps.org/schemas/sitemap/0.9", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED, xmlns = { @javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.sitemaps.org/schemas/sitemap/0.9", prefix = "") }) 

Questo rimuoverà il prefisso ns2

3

Risolvo questo cancellando il file package-info.java nel pacchetto jaxb classes e ricompilando l'applicazione.

+0

Sì! Il 'package-info.java' generato contiene un' @ javax.xml.bind.annotation.XmlSchema', che sembra essere il problema. –

+0

Mi ha aiutato anche. Grazie – Akash