2013-05-16 25 views
14

Mam plik wydrukowany z domyślnym obszarem nazw. Elementy są drukowane z prefiksem NS2, muszą to być usunięte, jak to jest z mojego kodu I:Usuń ns2 jako domyślny prefiks przestrzeni nazw

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

jak chcę go mieć:

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

to jak mam kodowane go, coś, co jak widzę to powinno wystarczyć dla NS2 odejść:

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

wygenerowany pakiet-info okazuje się tak:

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

tworzę plik tak:

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 jest pakiet gdzie package-info.java i pierwiastki.

Obiekt Foo jest zdefiniowany i ma elementy jak to ::

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

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

Czy jest coś, czego brakowało? czy źle zrozumiałem, jak to działa?

+1

Jeśli nadasz mu przestrzeń nazw i sprawi, że będzie kwalifikowana, to musi umieścić gdzieś przestrzeń nazw, aby była ważna zgodnie z xsd. Możesz całkowicie usunąć obszar nazw lub zmienić prefiks na coś bardziej zarządzalnego lub zmienić element najwyższego poziomu, aby miał xmlns głównej przestrzeni nazw, więc nie ma żadnych przedrostków dla niczego w tej przestrzeni nazw. Tak, czego chcesz, nie jest prawidłowy xml na twoje xsds. Czy chcesz elementów z przypisanymi nazwami, czy nie? –

+1

Myślę, że pomyliłeś mnie, nie pokazując atrybutów na tym elemencie foo. Czy mówisz, że chcesz '' zamiast ''? –

+0

@DMoses tak, powinienem był to załączyć, i tak, tak to chcę :). Chcę tego: xmlns: ns2 = "http: // namespace" w elemencie głównym. – Vegard

Odpowiedz

6

Najprawdopodobniej w odpowiedzi masz wiele przestrzeni nazw. Spowoduje to użycie domyślnej konwencji tworzenia przedrostków przestrzeni nazw ns #, a jeden z nich stanie się xmlns bez prefiksu. Jeśli chcesz kontrolować tę można wykonać następujące czynności:

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

Spowoduje to ustawienie http://namespace jako domyślny xmlns zawsze i używać ns # dla wszystkich innych nazw podczas zestawiania. Możesz także nadać im bardziej opisowe przedrostki, jeśli chcesz.

+0

to było tego rodzaju! :) bardzo dziękuję za pomoc. Problem był w istocie wieloma przestrzeniami nazw. Miałem jeden schemat importowania innego, co było przyczyną problemu. Kod, który tu zamieściłeś, nie działał bezpośrednio, ale rozwiązałem go, naprawiając wiele schematów, a następnie ponownie generując kod. – Vegard

+1

Należy zauważyć, że NamespacePrefixMapper jest teraz klasą wewnętrzną w JDK. Więc to rozwiązanie już nie liczy ... – Strinder

5

Począwszy od JDK6u18 technika NamespacePrefixMapper nie jest już używana.

10

Wszystko czego potrzebujesz 2 zrobić, to po otwarciu nowego pakietu wybierz tworzyć informacje pakiet w informacji pakietu dodaj następującą adnotację lub zmienić go w miarę potrzeby

@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 = "") }) 

To usunie prefiks NS2

3

Rozwiązuję to usuwanie pliku package-info.java do pakietu klas jaxb i ponowne kompilowanie aplikacji.

+0

Tak! Wygenerowany 'pakiet-info.java' zawiera' @ javax.xml.bind.annotation.XmlSchema', co wydaje się być problemem. –

+0

Pomógł mi też. Dzięki – Akash