Supprimer ns2 comme préfixe d'espace de noms par défaut

j'ai un fichier qui est imprimé avec un namespace par défaut. Les éléments sont imprimés avec un préfixe de ns2, j'ai besoin de cela pour être supprimés, comment il est avec mon code:

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

comment je le veux:

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

voici comment je l'ai codé, quelque chose qui à mon avis devrait suffire pour que la ns2 disparaisse:

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

le package généré-info s'avère comme ceci:

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

je crée le fichier comme ceci:

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 est le paquet où paquet-info.java et les éléments sont.

L'objet Foo est défini et comporte des éléments comme ceci::

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

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

est-ce quelque chose que j'ai manqué? ou ai-je mal compris comment cela fonctionne?

16
demandé sur Vegard 2013-05-16 18:03:31

5 réponses

vous avez probablement plusieurs namespaces dans la réponse. Cela utilisera la convention par défaut de création de préfixes d'espace de noms ns# et l'un d'eux deviendra le xmlns sans préfixe. Si vous voulez contrôler ce que vous pouvez faire ce qui suit:

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

set http://namespace comme le xmlns par défaut toujours et utiliser ns# pour tous les autres namespaces lors de la formation de la liste. Vous pouvez également leur donner plus de préfixes descriptifs si vous le souhaitez.

6
répondu Daniel Moses 2013-05-16 14:47:21

Tout ce dont vous avez besoin 2 faire est quand vous ouvrez un nouveau paquet sélectionnez Créer des informations sur le paquet dans le paquet d'infos ajouter l'annotation suivante ou la modifier si nécessaire

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

ceci supprimera le préfixe ns2

15
répondu yonia 2015-01-11 08:35:37

à partir de JDK6u18, la technique NamespacePrefixMapper n'est plus utilisée.

5
répondu s332401890 2014-12-23 07:46:52

Je résous cette suppression du paquet-info.java dans le paquet JAXB classes et recompilation de l'application.

3
répondu Diego Maye 2015-04-16 15:10:41

Pour Java 8:

je chagnge préfixe le nom de 'ns2''défaut'.

tout D'abord, créer votre * DefaultNamespacePrefixMapper *.

import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
import java.util.HashMap;
import java.util.Map;

public class DefaultNamespacePrefixMapper extends NamespacePrefixMapper {

    private static final String FAULT_PREFIX = "fault";

    private Map<String, String> namespaceMap = new HashMap<>();

    public DefaultNamespacePrefixMapper() {
        this.namespaceMap.put(NAMESPACE, FAULT_PREFIX);
    }

    @Override
    public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
        return namespaceMap.getOrDefault(namespaceUri, suggestion);
    }
}

Secondy, ajoutez votre DefaultNamespacePrefixMapper